/ Hex Artifact Content
Login

Artifact 01b969b20a44a3d9620e597d9af8242348123540:


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 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
1c10: 3d 3d 30 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  ==0 && !db->mall
1c20: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
1c30: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1c40: 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 30 20 29  iCacheLevel==0 )
1c50: 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 73 20 61  ;  /* Disables a
1c60: 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73 20 6d 61  nd re-enables ma
1c70: 74 63 68 20 2a 2f 0a 20 20 20 20 2f 2a 20 41 20  tch */.    /* A 
1c80: 6d 69 6e 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63  minimum of one c
1c90: 75 72 73 6f 72 20 69 73 20 72 65 71 75 69 72 65  ursor is require
1ca0: 64 20 69 66 20 61 75 74 6f 69 6e 63 72 65 6d 65  d if autoincreme
1cb0: 6e 74 20 69 73 20 75 73 65 64 0a 20 20 20 20 2a  nt is used.    *
1cc0: 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 61 36    See ticket [a6
1cd0: 39 36 33 37 39 63 31 66 30 38 38 36 36 5d 20 2a  96379c1f08866] *
1ce0: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  /.    if( pParse
1cf0: 2d 3e 70 41 69 6e 63 21 3d 30 20 26 26 20 70 50  ->pAinc!=0 && pP
1d00: 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 30 20 29 20  arse->nTab==0 ) 
1d10: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 31  pParse->nTab = 1
1d20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1d30: 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50  eMakeReady(v, pP
1d40: 61 72 73 65 29 3b 0a 20 20 20 20 70 50 61 72 73  arse);.    pPars
1d50: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44  e->rc = SQLITE_D
1d60: 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ONE;.    pParse-
1d70: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30  >colNamesSet = 0
1d80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1d90: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1da0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
1db0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30  pParse->nTab = 0
1dc0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
1dd0: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1de0: 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72  nSet = 0;.  pPar
1df0: 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20  se->nVar = 0;.  
1e00: 44 62 4d 61 73 6b 5a 65 72 6f 28 70 50 61 72 73  DbMaskZero(pPars
1e10: 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3b 0a  e->cookieMask);.
1e20: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
1e30: 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65   parser and code
1e40: 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72   generator recur
1e50: 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20  sively in order 
1e60: 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63  to generate.** c
1e70: 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20  ode for the SQL 
1e80: 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
1e90: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
1ea0: 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65  the pParse conte
1eb0: 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  xt.** currently 
1ec0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1ed0: 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61  on.  When the pa
1ee0: 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75  rser is run recu
1ef0: 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20  rsively.** this 
1f00: 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f  way, the final O
1f10: 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70  P_Halt is not ap
1f20: 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72  pended and other
1f30: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1f40: 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74  ** and finalizat
1f50: 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d  ion steps are om
1f60: 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68  itted because th
1f70: 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67  ose are handling
1f80: 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72   by the.** outer
1f90: 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a  most parser..**.
1fa0: 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e  ** Not everythin
1fb0: 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20  g is nestable.  
1fc0: 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73  This facility is
1fd0: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72   designed to per
1fe0: 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55  mit.** INSERT, U
1ff0: 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54  PDATE, and DELET
2000: 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61  E operations aga
2010: 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54  inst SQLITE_MAST
2020: 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65  ER.  Use.** care
2030: 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74   if you decide t
2040: 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69  o try to use thi
2050: 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f  s routine for so
2060: 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
2070: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
2080: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61  e3NestedParse(Pa
2090: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
20a0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
20b0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
20c0: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
20d0: 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
20e0: 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Msg = 0;.  sqlit
20f0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
2100: 3e 64 62 3b 0a 23 20 64 65 66 69 6e 65 20 53 41  >db;.# define SA
2110: 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50  VE_SZ  (sizeof(P
2120: 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66  arse) - offsetof
2130: 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20  (Parse,nVar)).  
2140: 63 68 61 72 20 73 61 76 65 42 75 66 5b 53 41 56  char saveBuf[SAV
2150: 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50  E_SZ];..  if( pP
2160: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
2170: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
2180: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30  Parse->nested<10
2190: 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20   );  /* Nesting 
21a0: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f  should only be o
21b0: 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20  f limited depth 
21c0: 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  */.  va_start(ap
21d0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53  , zFormat);.  zS
21e0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  ql = sqlite3VMPr
21f0: 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74  intf(db, zFormat
2200: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
2210: 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  ap);.  if( zSql=
2220: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
2230: 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20  ;   /* A malloc 
2240: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
2250: 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65   */.  }.  pParse
2260: 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65  ->nested++;.  me
2270: 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26 70  mcpy(saveBuf, &p
2280: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56  Parse->nVar, SAV
2290: 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28  E_SZ);.  memset(
22a0: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30  &pParse->nVar, 0
22b0: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71  , SAVE_SZ);.  sq
22c0: 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28 70  lite3RunParser(p
22d0: 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45  Parse, zSql, &zE
22e0: 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
22f0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
2300: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
2310: 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b  bFree(db, zSql);
2320: 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73  .  memcpy(&pPars
2330: 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66  e->nVar, saveBuf
2340: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50  , SAVE_SZ);.  pP
2350: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a  arse->nested--;.
2360: 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53  }..#if SQLITE_US
2370: 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
2380: 4e 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  N./*.** Return T
2390: 52 55 45 20 69 66 20 7a 54 61 62 6c 65 20 69 73  RUE if zTable is
23a0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
23b0: 20 73 79 73 74 65 6d 20 74 61 62 6c 65 20 74 68   system table th
23c0: 61 74 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a  at stores the.**
23d0: 20 6c 69 73 74 20 6f 66 20 75 73 65 72 73 20 61   list of users a
23e0: 6e 64 20 74 68 65 69 72 20 61 63 63 65 73 73 20  nd their access 
23f0: 63 72 65 64 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a  credentials..*/.
2400: 69 6e 74 20 73 71 6c 69 74 65 33 55 73 65 72 41  int sqlite3UserA
2410: 75 74 68 54 61 62 6c 65 28 63 6f 6e 73 74 20 63  uthTable(const c
2420: 68 61 72 20 2a 7a 54 61 62 6c 65 29 7b 0a 20 20  har *zTable){.  
2430: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 73  return sqlite3_s
2440: 74 72 69 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22  tricmp(zTable, "
2450: 73 71 6c 69 74 65 5f 75 73 65 72 22 29 3d 3d 30  sqlite_user")==0
2460: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
2470: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
2480: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
2490: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
24a0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
24b0: 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67  abase.** table g
24c0: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
24d0: 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   that table and 
24e0: 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65  (optionally) the
24f0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
2500: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
2510: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ing the table.  
2520: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
2530: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  ot found..**.** 
2540: 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20  If zDatabase is 
2550: 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  0, all databases
2560: 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f   are searched fo
2570: 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  r the table and 
2580: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74  the.** first mat
2590: 63 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72  ching table is r
25a0: 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68  eturned.  (No ch
25b0: 65 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69  ecking for dupli
25c0: 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61  cate table.** na
25d0: 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54  mes is done.)  T
25e0: 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20  he search order 
25f0: 69 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74  is TEMP first, t
2600: 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61  hen MAIN, then a
2610: 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20  ny.** auxiliary 
2620: 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64 20  databases added 
2630: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
2640: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
2650: 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
2660: 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a  LocateTable()..*
2670: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
2680: 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65  FindTable(sqlite
2690: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
26a0: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
26b0: 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29  char *zDatabase)
26c0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30  {.  Table *p = 0
26d0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
26e0: 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65   All mutexes are
26f0: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 63   required for sc
2700: 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61  hema access.  Ma
2710: 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20  ke sure we hold 
2720: 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72  them. */.  asser
2730: 74 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20  t( zDatabase!=0 
2740: 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  || sqlite3BtreeH
2750: 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64  oldsAllMutexes(d
2760: 62 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  b) );.#if SQLITE
2770: 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
2780: 54 49 4f 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74  TION.  /* Only t
2790: 68 65 20 61 64 6d 69 6e 20 75 73 65 72 20 69 73  he admin user is
27a0: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f 77   allowed to know
27b0: 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
27c0: 5f 75 73 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a  _user table.  **
27d0: 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 66 28   exists */.  if(
27e0: 20 64 62 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65   db->auth.authLe
27f0: 76 65 6c 3c 55 41 55 54 48 5f 41 64 6d 69 6e 20  vel<UAUTH_Admin 
2800: 26 26 20 73 71 6c 69 74 65 33 55 73 65 72 41 75  && sqlite3UserAu
2810: 74 68 54 61 62 6c 65 28 7a 4e 61 6d 65 29 21 3d  thTable(zName)!=
2820: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2830: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
2840: 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44  for(i=OMIT_TEMPD
2850: 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  B; i<db->nDb; i+
2860: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
2870: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
2880: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d     /* Search TEM
2890: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
28a0: 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61  .    if( zDataba
28b0: 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  se!=0 && sqlite3
28c0: 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73  StrICmp(zDatabas
28d0: 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e  e, db->aDb[j].zN
28e0: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
28f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
2900: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
2910: 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b  eld(db, j, 0) );
2920: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
2930: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
2940: 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62  b[j].pSchema->tb
2950: 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20  lHash, zName);. 
2960: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
2970: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2980: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
2990: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
29a0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
29b0: 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69  escribes a parti
29c0: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a  cular database.*
29d0: 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  * table given th
29e0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74  e name of that t
29f0: 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e  able and (option
2a00: 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f  ally) the name o
2a10: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
2a20: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
2a30: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
2a40: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
2a50: 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61  d.  Also leave a
2a60: 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  n.** error messa
2a70: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
2a80: 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rrMsg..**.** The
2a90: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
2aa0: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
2ab0: 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64   and sqlite3Find
2ac0: 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20  Table() is that 
2ad0: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
2ae0: 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20  leaves an error 
2af0: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
2b00: 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65  e->zErrMsg where
2b10: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54  .** sqlite3FindT
2b20: 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e  able() does not.
2b30: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
2b40: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20  e3LocateTable(. 
2b50: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2b60: 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65          /* conte
2b70: 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72  xt in which to r
2b80: 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a  eport errors */.
2b90: 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20    int isView,   
2ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2bb0: 20 69 66 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20   if looking for 
2bc0: 61 20 56 49 45 57 20 72 61 74 68 65 72 20 74 68  a VIEW rather th
2bd0: 61 6e 20 61 20 54 41 42 4c 45 20 2a 2f 0a 20 20  an a TABLE */.  
2be0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2bf0: 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  e,     /* Name o
2c00: 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61  f the table we a
2c10: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a  re looking for *
2c20: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
2c30: 7a 44 62 61 73 65 20 20 20 20 20 2f 2a 20 4e 61  zDbase     /* Na
2c40: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2c50: 73 65 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55  se.  Might be NU
2c60: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  LL */.){.  Table
2c70: 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20   *p;..  /* Read 
2c80: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
2c90: 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
2ca0: 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
2cb0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
2cc0: 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
2cd0: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
2ce0: 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66  rn NULL. */.  if
2cf0: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
2d00: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
2d10: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
2d20: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  turn 0;.  }..  p
2d30: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
2d40: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
2d50: 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a  zName, zDbase);.
2d60: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
2d70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
2d80: 73 67 20 3d 20 69 73 56 69 65 77 20 3f 20 22 6e  sg = isView ? "n
2d90: 6f 20 73 75 63 68 20 76 69 65 77 22 20 3a 20 22  o such view" : "
2da0: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b 0a  no such table";.
2db0: 20 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29      if( zDbase )
2dc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2dd0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2de0: 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73  "%s: %s.%s", zMs
2df0: 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65  g, zDbase, zName
2e00: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2e10: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2e20: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a  Msg(pParse, "%s:
2e30: 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d   %s", zMsg, zNam
2e40: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  e);.    }.    pP
2e50: 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
2e60: 61 20 3d 20 31 3b 0a 20 20 7d 0a 23 69 66 20 53  a = 1;.  }.#if S
2e70: 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
2e80: 4e 49 43 41 54 49 4f 4e 0a 20 20 65 6c 73 65 20  NICATION.  else 
2e90: 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
2ea0: 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3c 55  auth.authLevel<U
2eb0: 41 55 54 48 5f 55 73 65 72 20 29 7b 0a 20 20 20  AUTH_User ){.   
2ec0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2ed0: 28 70 50 61 72 73 65 2c 20 22 75 73 65 72 20 6e  (pParse, "user n
2ee0: 6f 74 20 61 75 74 68 65 6e 74 69 63 61 74 65 64  ot authenticated
2ef0: 22 29 3b 0a 20 20 20 20 70 20 3d 20 30 3b 0a 20  ");.    p = 0;. 
2f00: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
2f10: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn p;.}../*.** L
2f20: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
2f30: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a 70  identified by *p
2f40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
2f50: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
2f60: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
2f70: 62 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66 65  ble(). The diffe
2f80: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a 2a  rence between.**
2f90: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
2fa0: 62 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20 66  ble() and this f
2fb0: 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74 20  unction is that 
2fc0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
2fd0: 73 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20 73  stricts.** the s
2fe0: 65 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61 20  earch to schema 
2ff0: 28 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66 20  (p->pSchema) if 
3000: 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20  it is not NULL. 
3010: 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20 62  p->pSchema may b
3020: 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66  e.** non-NULL if
3030: 20 69 74 20 69 73 20 70 61 72 74 20 6f 66 20 61   it is part of a
3040: 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72   view or trigger
3050: 20 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69 74   program definit
3060: 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c 69  ion. See.** sqli
3070: 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 29 20  te3FixSrcList() 
3080: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
3090: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f  Table *sqlite3Lo
30a0: 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a 20  cateTableItem(. 
30b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
30c0: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 0a  .  int isView, .
30d0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
30e0: 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f  _item *p.){.  co
30f0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
3100: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68   assert( p->pSch
3110: 65 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61  ema==0 || p->zDa
3120: 74 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69  tabase==0 );.  i
3130: 66 28 20 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b  f( p->pSchema ){
3140: 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73  .    int iDb = s
3150: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
3160: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
3170: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  p->pSchema);.   
3180: 20 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   zDb = pParse->d
3190: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
31a0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
31b0: 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61 62 61  zDb = p->zDataba
31c0: 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  se;.  }.  return
31d0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
31e0: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 73 56 69  ble(pParse, isVi
31f0: 65 77 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 44  ew, p->zName, zD
3200: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  b);.}../*.** Loc
3210: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
3220: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
3230: 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61   describes .** a
3240: 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
3250: 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  x given the name
3260: 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a   of that index.*
3270: 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f  * and the name o
3280: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
3290: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
32a0: 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72   index..** Retur
32b0: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
32c0: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44  und..**.** If zD
32d0: 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c  atabase is 0, al
32e0: 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  l databases are 
32f0: 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65  searched for the
3300: 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68  .** table and th
3310: 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
3320: 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e   index is return
3330: 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e  ed.  (No checkin
3340: 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61  g.** for duplica
3350: 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69  te index names i
3360: 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65  s done.)  The se
3370: 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a  arch order is.**
3380: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
3390: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
33a0: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
33b0: 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73  ases added.** us
33c0: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
33d0: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78  ommand..*/.Index
33e0: 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64   *sqlite3FindInd
33f0: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
3400: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
3410: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
3420: 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  Db){.  Index *p 
3430: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
3440: 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61  /* All mutexes a
3450: 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  re required for 
3460: 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20  schema access.  
3470: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c  Make sure we hol
3480: 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73  d them. */.  ass
3490: 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73  ert( zDb!=0 || s
34a0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
34b0: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
34c0: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
34d0: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
34e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
34f0: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
3500: 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20  : i;  /* Search 
3510: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
3520: 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a   */.    Schema *
3530: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
3540: 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  b[j].pSchema;.  
3550: 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d    assert( pSchem
3560: 61 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  a );.    if( zDb
3570: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
3580: 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b  mp(zDb, db->aDb[
3590: 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74  j].zName) ) cont
35a0: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
35b0: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
35c0: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20  utexHeld(db, j, 
35d0: 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71  0) );.    p = sq
35e0: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
35f0: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
3600: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   zName);.    if(
3610: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
3620: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
3630: 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65  *.** Reclaim the
3640: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
3650: 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74  an index.*/.stat
3660: 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65  ic void freeInde
3670: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  x(sqlite3 *db, I
3680: 6e 64 65 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65  ndex *p){.#ifnde
3690: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e  f SQLITE_OMIT_AN
36a0: 41 4c 59 5a 45 0a 20 20 73 71 6c 69 74 65 33 44  ALYZE.  sqlite3D
36b0: 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c 65  eleteIndexSample
36c0: 73 28 64 62 2c 20 70 29 3b 0a 23 65 6e 64 69 66  s(db, p);.#endif
36d0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
36e0: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61 72  lete(db, p->pPar
36f0: 74 49 64 78 57 68 65 72 65 29 3b 0a 20 20 73 71  tIdxWhere);.  sq
3700: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3710: 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69  p->zColAff);.  i
3720: 66 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20  f( p->isResized 
3730: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
3740: 64 62 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a  db, p->azColl);.
3750: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
3760: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
3770: 41 54 34 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  AT4.  sqlite3_fr
3780: 65 65 28 70 2d 3e 61 69 52 6f 77 45 73 74 29 3b  ee(p->aiRowEst);
3790: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
37a0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
37b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  }../*.** For the
37c0: 20 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49   index called zI
37d0: 64 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20  dxName which is 
37e0: 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74  found in the dat
37f0: 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e  abase iDb,.** un
3800: 6c 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20  like that index 
3810: 66 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74  from its Table t
3820: 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69  hen remove the i
3830: 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  ndex from.** the
3840: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
3850: 65 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d  e and free all m
3860: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
3870: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
3880: 69 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ith the index..*
3890: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
38a0: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64  linkAndDeleteInd
38b0: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
38c0: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
38d0: 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a  har *zIdxName){.
38e0: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
38f0: 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a  .  Hash *pHash;.
3900: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3910: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
3920: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
3930: 0a 20 20 70 48 61 73 68 20 3d 20 26 64 62 2d 3e  .  pHash = &db->
3940: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
3950: 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 70 49 6e  ->idxHash;.  pIn
3960: 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73  dex = sqlite3Has
3970: 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a  hInsert(pHash, z
3980: 49 64 78 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69  IdxName, 0);.  i
3990: 66 28 20 41 4c 57 41 59 53 28 70 49 6e 64 65 78  f( ALWAYS(pIndex
39a0: 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e  ) ){.    if( pIn
39b0: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
39c0: 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20  dex==pIndex ){. 
39d0: 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61       pIndex->pTa
39e0: 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  ble->pIndex = pI
39f0: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
3a00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
3a10: 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 2f 2a  dex *p;.      /*
3a20: 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 6f   Justification o
3a30: 66 20 41 4c 57 41 59 53 28 29 3b 20 20 54 68 65  f ALWAYS();  The
3a40: 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 6f   index must be o
3a50: 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 0a 20 20  n the list of.  
3a60: 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20      ** indices. 
3a70: 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20 70 49 6e  */.      p = pIn
3a80: 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e  dex->pTable->pIn
3a90: 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  dex;.      while
3aa0: 28 20 41 4c 57 41 59 53 28 70 29 20 26 26 20 70  ( ALWAYS(p) && p
3ab0: 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 20  ->pNext!=pIndex 
3ac0: 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  ){ p = p->pNext;
3ad0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
3ae0: 41 59 53 28 70 20 26 26 20 70 2d 3e 70 4e 65 78  AYS(p && p->pNex
3af0: 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  t==pIndex) ){.  
3b00: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
3b10: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
3b20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3b30: 20 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20    freeIndex(db, 
3b40: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64  pIndex);.  }.  d
3b50: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
3b60: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
3b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20  ;.}../*.** Look 
3b80: 74 68 72 6f 75 67 68 20 74 68 65 20 6c 69 73 74  through the list
3b90: 20 6f 66 20 6f 70 65 6e 20 64 61 74 61 62 61 73   of open databas
3ba0: 65 20 66 69 6c 65 73 20 69 6e 20 64 62 2d 3e 61  e files in db->a
3bb0: 44 62 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a 20 61  Db[] and if.** a
3bc0: 6e 79 20 68 61 76 65 20 62 65 65 6e 20 63 6c 6f  ny have been clo
3bd0: 73 65 64 2c 20 72 65 6d 6f 76 65 20 74 68 65 6d  sed, remove them
3be0: 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 2e 20   from the list. 
3bf0: 20 52 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 0a   Reallocate the.
3c00: 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d 20 73 74 72  ** db->aDb[] str
3c10: 75 63 74 75 72 65 20 74 6f 20 61 20 73 6d 61 6c  ucture to a smal
3c20: 6c 65 72 20 73 69 7a 65 2c 20 69 66 20 70 6f 73  ler size, if pos
3c30: 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74  sible..**.** Ent
3c40: 72 79 20 30 20 28 74 68 65 20 22 6d 61 69 6e 22  ry 0 (the "main"
3c50: 20 64 61 74 61 62 61 73 65 29 20 61 6e 64 20 65   database) and e
3c60: 6e 74 72 79 20 31 20 28 74 68 65 20 22 74 65 6d  ntry 1 (the "tem
3c70: 70 22 20 64 61 74 61 62 61 73 65 29 0a 2a 2a 20  p" database).** 
3c80: 61 72 65 20 6e 65 76 65 72 20 63 61 6e 64 69 64  are never candid
3c90: 61 74 65 73 20 66 6f 72 20 62 65 69 6e 67 20 63  ates for being c
3ca0: 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69  ollapsed..*/.voi
3cb0: 64 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73  d sqlite3Collaps
3cc0: 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28 73  eDatabaseArray(s
3cd0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
3ce0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69  nt i, j;.  for(i
3cf0: 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  =j=2; i<db->nDb;
3d00: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
3d10: 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d  t Db *pDb = &db-
3d20: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
3d30: 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a   pDb->pBt==0 ){.
3d40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
3d50: 72 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a 4e 61  ree(db, pDb->zNa
3d60: 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e  me);.      pDb->
3d70: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  zName = 0;.     
3d80: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
3d90: 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a  .    if( j<i ){.
3da0: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d        db->aDb[j]
3db0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20   = db->aDb[i];. 
3dc0: 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20     }.    j++;.  
3dd0: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e  }.  memset(&db->
3de0: 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e  aDb[j], 0, (db->
3df0: 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62  nDb-j)*sizeof(db
3e00: 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62  ->aDb[j]));.  db
3e10: 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28  ->nDb = j;.  if(
3e20: 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64   db->nDb<=2 && d
3e30: 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53  b->aDb!=db->aDbS
3e40: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d  tatic ){.    mem
3e50: 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69  cpy(db->aDbStati
3e60: 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69  c, db->aDb, 2*si
3e70: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29  zeof(db->aDb[0])
3e80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
3e90: 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62  Free(db, db->aDb
3ea0: 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d  );.    db->aDb =
3eb0: 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a   db->aDbStatic;.
3ec0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73    }.}../*.** Res
3ed0: 65 74 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f  et the schema fo
3ee0: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  r the database a
3ef0: 74 20 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c  t index iDb.  Al
3f00: 73 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20  so reset the.** 
3f10: 54 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a  TEMP schema..*/.
3f20: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
3f30: 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74  tOneSchema(sqlit
3f40: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
3f50: 7b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 61  {.  Db *pDb;.  a
3f60: 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e  ssert( iDb<db->n
3f70: 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 73 65  Db );..  /* Case
3f80: 20 31 3a 20 20 52 65 73 65 74 20 74 68 65 20 73   1:  Reset the s
3f90: 69 6e 67 6c 65 20 73 63 68 65 6d 61 20 69 64 65  ingle schema ide
3fa0: 6e 74 69 66 69 65 64 20 62 79 20 69 44 62 20 2a  ntified by iDb *
3fb0: 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  /.  pDb = &db->a
3fc0: 44 62 5b 69 44 62 5d 3b 0a 20 20 61 73 73 65 72  Db[iDb];.  asser
3fd0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
3fe0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
3ff0: 62 2c 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72  b, 0) );.  asser
4000: 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21  t( pDb->pSchema!
4010: 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  =0 );.  sqlite3S
4020: 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e  chemaClear(pDb->
4030: 70 53 63 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a 20  pSchema);..  /* 
4040: 49 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  If any database 
4050: 6f 74 68 65 72 20 74 68 61 6e 20 54 45 4d 50 20  other than TEMP 
4060: 69 73 20 72 65 73 65 74 2c 20 74 68 65 6e 20 61  is reset, then a
4070: 6c 73 6f 20 72 65 73 65 74 20 54 45 4d 50 0a 20  lso reset TEMP. 
4080: 20 2a 2a 20 73 69 6e 63 65 20 54 45 4d 50 20 6d   ** since TEMP m
4090: 69 67 68 74 20 62 65 20 68 6f 6c 64 69 6e 67 20  ight be holding 
40a0: 74 72 69 67 67 65 72 73 20 74 68 61 74 20 72 65  triggers that re
40b0: 66 65 72 65 6e 63 65 20 74 61 62 6c 65 73 20 69  ference tables i
40c0: 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  n the.  ** other
40d0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
40e0: 20 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a    if( iDb!=1 ){.
40f0: 20 20 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61      pDb = &db->a
4100: 44 62 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72  Db[1];.    asser
4110: 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21  t( pDb->pSchema!
4120: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
4130: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62  3SchemaClear(pDb
4140: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a  ->pSchema);.  }.
4150: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
4160: 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68  ** Erase all sch
4170: 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ema information 
4180: 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68 65  from all attache
4190: 64 20 64 61 74 61 62 61 73 65 73 20 28 69 6e 63  d databases (inc
41a0: 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22  luding.** "main"
41b0: 20 61 6e 64 20 22 74 65 6d 70 22 29 20 66 6f 72   and "temp") for
41c0: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
41d0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
41e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
41f0: 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43  setAllSchemasOfC
4200: 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74 65  onnection(sqlite
4210: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b  3 *db){.  int i;
4220: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
4230: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66  nterAll(db);.  f
4240: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
4250: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20  b; i++){.    Db 
4260: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
4270: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
4280: 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  >pSchema ){.    
4290: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43    sqlite3SchemaC
42a0: 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d  lear(pDb->pSchem
42b0: 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  a);.    }.  }.  
42c0: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
42d0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
42e0: 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61  es;.  sqlite3Vta
42f0: 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b  bUnlockList(db);
4300: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
4310: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73  eaveAll(db);.  s
4320: 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61  qlite3CollapseDa
4330: 74 61 62 61 73 65 41 72 72 61 79 28 64 62 29 3b  tabaseArray(db);
4340: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
4350: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4360: 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f   when a commit o
4370: 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ccurs..*/.void s
4380: 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65  qlite3CommitInte
4390: 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69  rnalChanges(sqli
43a0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e  te3 *db){.  db->
43b0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
43c0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
43d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
43e0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64  memory allocated
43f0: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
4400: 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65  names of a table
4410: 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a   or view (the.**
4420: 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72   Table.aCol[] ar
4430: 72 61 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ray)..*/.static 
4440: 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74  void sqliteDelet
4450: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71 6c  eColumnNames(sql
4460: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20  ite3 *db, Table 
4470: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20  *pTable){.  int 
4480: 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  i;.  Column *pCo
4490: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  l;.  assert( pTa
44a0: 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ble!=0 );.  if( 
44b0: 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e  (pCol = pTable->
44c0: 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  aCol)!=0 ){.    
44d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c  for(i=0; i<pTabl
44e0: 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  e->nCol; i++, pC
44f0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c  ol++){.      sql
4500: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4510: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
4520: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
4530: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70  lete(db, pCol->p
4540: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Dflt);.      sql
4550: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4560: 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20  Col->zDflt);.   
4570: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4580: 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  (db, pCol->zType
4590: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
45a0: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
45b0: 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20  >zColl);.    }. 
45c0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
45d0: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f  (db, pTable->aCo
45e0: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
45f0: 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f   Remove the memo
4600: 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ry data structur
4610: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
4620: 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  th the given.** 
4630: 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67  Table.  No chang
4640: 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64  es are made to d
4650: 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74  isk by this rout
4660: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ine..**.** This 
4670: 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c  routine just del
4680: 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73 74  etes the data st
4690: 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65  ructure.  It doe
46a0: 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20  s not unlink.** 
46b0: 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20 73  the table data s
46c0: 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68  tructure from th
46d0: 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42  e hash table.  B
46e0: 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74 72  ut it does destr
46f0: 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72  oy.** memory str
4700: 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20 69  uctures of the i
4710: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
4720: 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74  gn keys associat
4730: 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20  ed with .** the 
4740: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
4750: 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 69 73   db parameter is
4760: 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69   optional.  It i
4770: 73 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20  s needed if the 
4780: 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a  Table object .**
4790: 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73   contains lookas
47a0: 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61  ide memory.  (Ta
47b0: 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 74  ble objects in t
47c0: 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74  he schema do not
47d0: 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64   use.** lookasid
47e0: 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f  e memory, but so
47f0: 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61 62  me ephemeral Tab
4800: 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20  le objects do.) 
4810: 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70 61   Or the.** db pa
4820: 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20 75  rameter can be u
4830: 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e 42  sed with db->pnB
4840: 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65 61  ytesFreed to mea
4850: 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a  sure the memory.
4860: 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20 54  ** used by the T
4870: 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  able object..*/.
4880: 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65  void sqlite3Dele
4890: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
48a0: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
48b0: 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  le){.  Index *pI
48c0: 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  ndex, *pNext;.  
48d0: 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c  TESTONLY( int nL
48e0: 6f 6f 6b 61 73 69 64 65 3b 20 29 20 2f 2a 20 55  ookaside; ) /* U
48f0: 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 6c 6f  sed to verify lo
4900: 6f 6b 61 73 69 64 65 20 6e 6f 74 20 75 73 65 64  okaside not used
4910: 20 66 6f 72 20 73 63 68 65 6d 61 20 2a 2f 0a 0a   for schema */..
4920: 20 20 61 73 73 65 72 74 28 20 21 70 54 61 62 6c    assert( !pTabl
4930: 65 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 6e 52 65  e || pTable->nRe
4940: 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20  f>0 );..  /* Do 
4950: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74  not delete the t
4960: 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72  able until the r
4970: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
4980: 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a  eaches zero. */.
4990: 20 20 69 66 28 20 21 70 54 61 62 6c 65 20 29 20    if( !pTable ) 
49a0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 28  return;.  if( ((
49b0: 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  !db || db->pnByt
49c0: 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20 28  esFreed==0) && (
49d0: 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52 65 66 29 3e  --pTable->nRef)>
49e0: 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
49f0: 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75  /* Record the nu
4a00: 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64  mber of outstand
4a10: 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20 61 6c  ing lookaside al
4a20: 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 73 63 68  locations in sch
4a30: 65 6d 61 20 54 61 62 6c 65 73 0a 20 20 2a 2a 20  ema Tables.  ** 
4a40: 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61  prior to doing a
4a50: 6e 79 20 66 72 65 65 28 29 20 6f 70 65 72 61 74  ny free() operat
4a60: 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 73 63 68  ions.  Since sch
4a70: 65 6d 61 20 54 61 62 6c 65 73 20 64 6f 20 6e 6f  ema Tables do no
4a80: 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61  t use.  ** looka
4a90: 73 69 64 65 2c 20 74 68 69 73 20 6e 75 6d 62 65  side, this numbe
4aa0: 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61  r should not cha
4ab0: 6e 67 65 2e 20 2a 2f 0a 20 20 54 45 53 54 4f 4e  nge. */.  TESTON
4ac0: 4c 59 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d  LY( nLookaside =
4ad0: 20 28 64 62 20 26 26 20 28 70 54 61 62 6c 65 2d   (db && (pTable-
4ae0: 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
4af0: 70 68 65 6d 65 72 61 6c 29 3d 3d 30 29 20 3f 0a  phemeral)==0) ?.
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b10: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f           db->loo
4b20: 6b 61 73 69 64 65 2e 6e 4f 75 74 20 3a 20 30 20  kaside.nOut : 0 
4b30: 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  );..  /* Delete 
4b40: 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f  all indices asso
4b50: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
4b60: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72   table. */.  for
4b70: 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65  (pIndex = pTable
4b80: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ->pIndex; pIndex
4b90: 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b  ; pIndex=pNext){
4ba0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e  .    pNext = pIn
4bb0: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
4bc0: 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e  assert( pIndex->
4bd0: 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d  pSchema==pTable-
4be0: 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
4bf0: 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 70  if( !db || db->p
4c00: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
4c10: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  {.      char *zN
4c20: 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e  ame = pIndex->zN
4c30: 61 6d 65 3b 20 0a 20 20 20 20 20 20 54 45 53 54  ame; .      TEST
4c40: 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a 70 4f  ONLY ( Index *pO
4c50: 6c 64 20 3d 20 29 20 73 71 6c 69 74 65 33 48 61  ld = ) sqlite3Ha
4c60: 73 68 49 6e 73 65 72 74 28 0a 20 20 20 20 20 20  shInsert(.      
4c70: 20 20 20 26 70 49 6e 64 65 78 2d 3e 70 53 63 68     &pIndex->pSch
4c80: 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e  ema->idxHash, zN
4c90: 61 6d 65 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  ame, 0.      );.
4ca0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
4cb0: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63  ==0 || sqlite3Sc
4cc0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
4cd0: 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  , 0, pIndex->pSc
4ce0: 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 61  hema) );.      a
4cf0: 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e  ssert( pOld==pIn
4d00: 64 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29  dex || pOld==0 )
4d10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
4d20: 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
4d30: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
4d40: 65 74 65 20 61 6e 79 20 66 6f 72 65 69 67 6e 20  ete any foreign 
4d50: 6b 65 79 73 20 61 74 74 61 63 68 65 64 20 74 6f  keys attached to
4d60: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a   this table. */.
4d70: 20 20 73 71 6c 69 74 65 33 46 6b 44 65 6c 65 74    sqlite3FkDelet
4d80: 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a  e(db, pTable);..
4d90: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
4da0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
4db0: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73  itself..  */.  s
4dc0: 71 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d  qliteDeleteColum
4dd0: 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c  nNames(db, pTabl
4de0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
4df0: 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ree(db, pTable->
4e00: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
4e10: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
4e20: 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  le->zColAff);.  
4e30: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
4e40: 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ete(db, pTable->
4e50: 70 53 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65  pSelect);.#ifnde
4e60: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
4e70: 45 43 4b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ECK.  sqlite3Exp
4e80: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
4e90: 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b  pTable->pCheck);
4ea0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
4eb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
4ec0: 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74  UALTABLE.  sqlit
4ed0: 65 33 56 74 61 62 43 6c 65 61 72 28 64 62 2c 20  e3VtabClear(db, 
4ee0: 70 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  pTable);.#endif.
4ef0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4f00: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20  db, pTable);..  
4f10: 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 6e  /* Verify that n
4f20: 6f 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  o lookaside memo
4f30: 72 79 20 77 61 73 20 75 73 65 64 20 62 79 20 73  ry was used by s
4f40: 63 68 65 6d 61 20 74 61 62 6c 65 73 20 2a 2f 0a  chema tables */.
4f50: 20 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 6b 61    assert( nLooka
4f60: 73 69 64 65 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b  side==0 || nLook
4f70: 61 73 69 64 65 3d 3d 64 62 2d 3e 6c 6f 6f 6b 61  aside==db->looka
4f80: 73 69 64 65 2e 6e 4f 75 74 20 29 3b 0a 7d 0a 0a  side.nOut );.}..
4f90: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  /*.** Unlink the
4fa0: 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f   given table fro
4fb0: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
4fc0: 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65  s and the delete
4fd0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74   the.** table st
4fe0: 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c  ructure with all
4ff0: 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64   its indices and
5000: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a   foreign keys..*
5010: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
5020: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62  linkAndDeleteTab
5030: 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  le(sqlite3 *db, 
5040: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
5050: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a  har *zTabName){.
5060: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62    Table *p;.  Db
5070: 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74   *pDb;..  assert
5080: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
5090: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
50a0: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
50b0: 61 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65  assert( zTabName
50c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
50d0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
50e0: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
50f0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
5100: 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29  zTabName[0]==0 )
5110: 3b 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74  ;  /* Zero-lengt
5120: 68 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72  h table names ar
5130: 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70  e allowed */.  p
5140: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
5150: 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  b];.  p = sqlite
5160: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
5170: 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
5180: 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30 29  sh, zTabName, 0)
5190: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74  ;.  sqlite3Delet
51a0: 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20  eTable(db, p);. 
51b0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
51c0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
51d0: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  es;.}../*.** Giv
51e0: 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75  en a token, retu
51f0: 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  rn a string that
5200: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65   consists of the
5210: 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a   text of that.**
5220: 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74   token.  Space t
5230: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
5240: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
5250: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
5260: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
5270: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
5280: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
5290: 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  * function..**.*
52a0: 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20  * Any quotation 
52b0: 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d  marks (ex:  "nam
52c0: 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d  e", 'name', [nam
52d0: 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74  e], or `name`) t
52e0: 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20  hat.** surround 
52f0: 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20  the body of the 
5300: 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65  token are remove
5310: 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20  d..**.** Tokens 
5320: 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70  are often just p
5330: 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65  ointers into the
5340: 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65   original SQL te
5350: 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65  xt and so.** are
5360: 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e   not \000 termin
5370: 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74  ated and are not
5380: 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68   persistent.  Th
5390: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
53a0: 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72  g.** is \000 ter
53b0: 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70  minated and is p
53c0: 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68  ersistent..*/.ch
53d0: 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46  ar *sqlite3NameF
53e0: 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33  romToken(sqlite3
53f0: 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61   *db, Token *pNa
5400: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  me){.  char *zNa
5410: 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20  me;.  if( pName 
5420: 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
5430: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
5440: 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65  db, (char*)pName
5450: 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a  ->z, pName->n);.
5460: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
5470: 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c  te(zName);.  }el
5480: 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  se{.    zName = 
5490: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
54a0: 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zName;.}../*.** 
54b0: 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  Open the sqlite_
54c0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74 6f  master table sto
54d0: 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65 20  red in database 
54e0: 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a 2a  number iDb for.*
54f0: 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20 74  * writing. The t
5500: 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 75  able is opened u
5510: 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a  sing cursor 0..*
5520: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 70  /.void sqlite3Op
5530: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50 61  enMasterTable(Pa
5540: 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 29  rse *p, int iDb)
5550: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
5560: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29 3b  lite3GetVdbe(p);
5570: 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c  .  sqlite3TableL
5580: 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 54  ock(p, iDb, MAST
5590: 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53 43 48 45  ER_ROOT, 1, SCHE
55a0: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a  MA_TABLE(iDb));.
55b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
55c0: 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70 65  Op4Int(v, OP_Ope
55d0: 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45  nWrite, 0, MASTE
55e0: 52 5f 52 4f 4f 54 2c 20 69 44 62 2c 20 35 29 3b  R_ROOT, iDb, 5);
55f0: 0a 20 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d  .  if( p->nTab==
5600: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62  0 ){.    p->nTab
5610: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
5620: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61  ** Parameter zNa
5630: 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e  me points to a n
5640: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 62 75  ul-terminated bu
5650: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
5660: 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
5670: 20 64 61 74 61 62 61 73 65 20 28 22 6d 61 69 6e   database ("main
5680: 22 2c 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65  ", "temp" or the
5690: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61   name of an atta
56a0: 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 0a 2a  ched db). This.*
56b0: 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
56c0: 6e 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ns the index of 
56d0: 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61  the named databa
56e0: 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c  se in db->aDb[],
56f0: 20 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65   or.** -1 if the
5700: 20 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74   named db cannot
5710: 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e   be found..*/.in
5720: 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  t sqlite3FindDbN
5730: 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ame(sqlite3 *db,
5740: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
5750: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
5760: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  1;         /* Da
5770: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f  tabase number */
5780: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
5790: 20 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20      Db *pDb;.   
57a0: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
57b0: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
57c0: 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e  .    for(i=(db->
57d0: 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d  nDb-1), pDb=&db-
57e0: 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69  >aDb[i]; i>=0; i
57f0: 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20  --, pDb--){.    
5800: 20 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d    if( (!OMIT_TEM
5810: 50 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26  PDB || i!=1 ) &&
5820: 20 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65   n==sqlite3Strle
5830: 6e 33 30 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20  n30(pDb->zName) 
5840: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d  && .          0=
5850: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
5860: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  pDb->zName, zNam
5870: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  e) ){.        br
5880: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5890: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
58a0: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  i;.}../*.** The 
58b0: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e  token *pName con
58c0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
58d0: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69  f a database (ei
58e0: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a  ther "main" or.*
58f0: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  * "temp" or the 
5900: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
5910: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f  hed db). This ro
5920: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
5930: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68  e.** index of th
5940: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
5950: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
5960: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  r -1 if the name
5970: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d db .** does no
5980: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  t exist..*/.int 
5990: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71  sqlite3FindDb(sq
59a0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
59b0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
59c0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59e0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
59f0: 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
5a00: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
5a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5a20: 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61   Name we are sea
5a30: 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  rching for */.  
5a40: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
5a50: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
5a60: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73   pName);.  i = s
5a70: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
5a80: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  (db, zName);.  s
5a90: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5aa0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
5ab0: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74  n i;.}../* The t
5ac0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20  able or view or 
5ad0: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
5ae0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
5af0: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
5b00: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20  s.** pName1 and 
5b10: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
5b20: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
5b30: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
5b40: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
5b50: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
5b60: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a  xx.yyy (...);.**
5b70: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31   .** Then pName1
5b80: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
5b90: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
5ba0: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
5bb0: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74  hand if.** the t
5bc0: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
5bd0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5be0: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52  , i.e.:.**.** CR
5bf0: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
5c00: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ..);.**.** Then 
5c10: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
5c20: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
5c30: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54  2 is ""..**.** T
5c40: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
5c50: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70   the *ppUnqual p
5c60: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
5c70: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
5c80: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65  ame1 or.** pName
5c90: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
5ca0: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
5cb0: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
5cc0: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
5cd0: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69  database "xxx" i
5ce0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
5cf0: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
5d00: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
5d10: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
5d20: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
5d30: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
5d40: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
5d50: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
5d60: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65  The "xxx" in the
5d70: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
5d80: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f  or "xxx" */.  To
5d90: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
5da0: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69    /* The "yyy" i
5db0: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
5dc0: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  yyy" */.  Token 
5dd0: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a  **pUnqual     /*
5de0: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61   Write the unqua
5df0: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61  lified object na
5e00: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  me here */.){.  
5e10: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
5e20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
5e30: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
5e40: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
5e50: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
5e60: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
5e70: 20 41 4c 57 41 59 53 28 70 4e 61 6d 65 32 21 3d   ALWAYS(pName2!=
5e80: 30 29 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e  0) && pName2->n>
5e90: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  0 ){.    if( db-
5ea0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20  >init.busy ) {. 
5eb0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
5ec0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f  rMsg(pParse, "co
5ed0: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29  rrupt database")
5ee0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
5ef0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
5f00: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
5f10: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
5f20: 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20  ame2;.    iDb = 
5f30: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62  sqlite3FindDb(db
5f40: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69  , pName1);.    i
5f50: 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20  f( iDb<0 ){.    
5f60: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5f70: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
5f80: 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c  wn database %T",
5f90: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20   pName1);.      
5fa0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
5fb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
5fc0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
5fd0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
5fe0: 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64  init.iDb==0 || d
5ff0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
6000: 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e      iDb = db->in
6010: 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e  it.iDb;.    *pUn
6020: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20  qual = pName1;. 
6030: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b   }.  return iDb;
6040: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
6050: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
6060: 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55  o check if the U
6070: 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d  TF-8 string zNam
6080: 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20  e is a legal.** 
6090: 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  unqualified name
60a0: 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d   for a new schem
60b0: 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c  a object (table,
60c0: 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a   index, view or.
60d0: 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c  ** trigger). All
60e0: 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c   names are legal
60f0: 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68   except those th
6100: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  at begin with th
6110: 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c  e string.** "sql
6120: 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c  ite_" (in upper,
6130: 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20   lower or mixed 
6140: 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74  case). This port
6150: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73  ion of the names
6160: 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72  pace.** is reser
6170: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
6180: 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   use..*/.int sql
6190: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
61a0: 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ame(Parse *pPars
61b0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
61c0: 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50  Name){.  if( !pP
61d0: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
61e0: 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  usy && pParse->n
61f0: 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20  ested==0 .      
6200: 20 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e      && (pParse->
6210: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
6220: 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d  TE_WriteSchema)=
6230: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
6240: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43  0==sqlite3StrNIC
6250: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
6260: 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73  e_", 7) ){.    s
6270: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6280: 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e  Parse, "object n
6290: 61 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72  ame reserved for
62a0: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25   internal use: %
62b0: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
62c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
62d0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
62e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
62f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6300: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
6310: 65 78 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f  ex of a table.*/
6320: 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 50  .Index *sqlite3P
6330: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 54  rimaryKeyIndex(T
6340: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49  able *pTab){.  I
6350: 6e 64 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70  ndex *p;.  for(p
6360: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
6370: 20 26 26 20 21 49 73 50 72 69 6d 61 72 79 4b 65   && !IsPrimaryKe
6380: 79 49 6e 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e  yIndex(p); p=p->
6390: 70 4e 65 78 74 29 7b 7d 0a 20 20 72 65 74 75 72  pNext){}.  retur
63a0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
63b0: 74 75 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  turn the column 
63c0: 6f 66 20 69 6e 64 65 78 20 70 49 64 78 20 74 68  of index pIdx th
63d0: 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  at corresponds t
63e0: 6f 20 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d  o table.** colum
63f0: 6e 20 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20  n iCol.  Return 
6400: 2d 31 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  -1 if not found.
6410: 0a 2a 2f 0a 69 31 36 20 73 71 6c 69 74 65 33 43  .*/.i16 sqlite3C
6420: 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64  olumnOfIndex(Ind
6430: 65 78 20 2a 70 49 64 78 2c 20 69 31 36 20 69 43  ex *pIdx, i16 iC
6440: 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ol){.  int i;.  
6450: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
6460: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
6470: 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49      if( iCol==pI
6480: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  dx->aiColumn[i] 
6490: 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
64a0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
64b0: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73  /*.** Begin cons
64c0: 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74  tructing a new t
64d0: 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
64e0: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  ion in memory.  
64f0: 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66  This is.** the f
6500: 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20  irst of several 
6510: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
6520: 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20  that get called 
6530: 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74  in response.** t
6540: 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  o a CREATE TABLE
6550: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20   statement.  In 
6560: 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73  particular, this
6570: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
6580: 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69  ed.** after seei
6590: 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54  ng tokens "CREAT
65a0: 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61  E" and "TABLE" a
65b0: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  nd the table nam
65c0: 65 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a  e. The isTemp.**
65d0: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
65e0: 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c   the table shoul
65f0: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
6600: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
6610: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e  abase.** file in
6620: 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20  stead of in the 
6630: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
6640: 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  le.  This is nor
6650: 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a  mally the case.*
6660: 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50  * when the "TEMP
6670: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
6680: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
6690: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
66a0: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
66b0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
66c0: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
66d0: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
66e0: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
66f0: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
6700: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
6710: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
6720: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
6730: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
6740: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
6750: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
6760: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
6770: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
6780: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
6790: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
67a0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
67b0: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
67c0: 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  e() routine.** i
67d0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
67e0: 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75  lete the constru
67f0: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77  ction of the new
6800: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a   table record..*
6810: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  /.void sqlite3St
6820: 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73  artTable(.  Pars
6830: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
6840: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
6850: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
6860: 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61  1,   /* First pa
6870: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
6880: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
6890: 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
68a0: 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63  pName2,   /* Sec
68b0: 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ond part of the 
68c0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
68d0: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69  e or view */.  i
68e0: 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
68f0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
6900: 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20  is a TEMP table 
6910: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c  */.  int isView,
6920: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
6930: 20 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20   this is a VIEW 
6940: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75  */.  int isVirtu
6950: 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66  al,   /* True if
6960: 20 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55   this is a VIRTU
6970: 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  AL table */.  in
6980: 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f  t noErr        /
6990: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20  * Do nothing if 
69a0: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
69b0: 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
69c0: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68  le *pTable;.  ch
69d0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f  ar *zName = 0; /
69e0: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
69f0: 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
6a00: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
6a10: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
6a20: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b  e *v;.  int iDb;
6a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
6a40: 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63  base number to c
6a50: 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  reate the table 
6a60: 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  in */.  Token *p
6a70: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75  Name;    /* Unqu
6a80: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
6a90: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65  the table to cre
6aa0: 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ate */..  /* The
6ab0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
6ac0: 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69 73  ame to create is
6ad0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
6ae0: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
6af0: 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61  ns.  ** pName1 a
6b00: 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68  nd pName2. If th
6b10: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73  e table name was
6b20: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
6b30: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20  , for example:. 
6b40: 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20   **.  ** CREATE 
6b50: 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e  TABLE xxx.yyy (.
6b60: 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ..);.  ** .  ** 
6b70: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
6b80: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
6b90: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
6ba0: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
6bb0: 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  if.  ** the tabl
6bc0: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
6bd0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
6be0: 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  .e.:.  **.  ** C
6bf0: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
6c00: 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ...);.  **.  ** 
6c10: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
6c20: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
6c30: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20  pName2 is ""..  
6c40: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  **.  ** The call
6c50: 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20   below sets the 
6c60: 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f  pName pointer to
6c70: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f   point at the to
6c80: 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20  ken (pName1 or. 
6c90: 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74   ** pName2) that
6ca0: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
6cb0: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
6cc0: 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65  me. The variable
6cd0: 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74   iDb is.  ** set
6ce0: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
6cf0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
6d00: 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  at the table or 
6d10: 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20  view is to be.  
6d20: 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20  ** created in.. 
6d30: 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   */.  iDb = sqli
6d40: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
6d50: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
6d60: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
6d70: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
6d80: 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49  turn;.  if( !OMI
6d90: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
6da0: 6d 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e  mp && pName2->n>
6db0: 30 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20  0 && iDb!=1 ){. 
6dc0: 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e     /* If creatin
6dd0: 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20  g a temp table, 
6de0: 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74  the name may not
6df0: 20 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20 55   be qualified. U
6e00: 6e 6c 65 73 73 20 0a 20 20 20 20 2a 2a 20 74 68  nless .    ** th
6e10: 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
6e20: 69 73 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79  is "temp" anyway
6e30: 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  .  */.    sqlite
6e40: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6e50: 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62  , "temporary tab
6e60: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
6e70: 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20  unqualified");. 
6e80: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6e90: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
6ea0: 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44  B && isTemp ) iD
6eb0: 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65  b = 1;..  pParse
6ec0: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a  ->sNameToken = *
6ed0: 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d  pName;.  zName =
6ee0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
6ef0: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
6f00: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
6f10: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
6f20: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
6f30: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
6f40: 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65  me(pParse, zName
6f50: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65  ) ){.    goto be
6f60: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6f70: 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69  .  }.  if( db->i
6f80: 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54  nit.iDb==1 ) isT
6f90: 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  emp = 1;.#ifndef
6fa0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
6fb0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73  HORIZATION.  ass
6fc0: 65 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31  ert( (isTemp & 1
6fd0: 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b  )==isTemp );.  {
6fe0: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
6ff0: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
7000: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
7010: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
7020: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
7030: 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52  se, SQLITE_INSER
7040: 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  T, SCHEMA_TABLE(
7050: 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29  isTemp), 0, zDb)
7060: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
7070: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7090: 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20  isView ){.      
70a0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
70b0: 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20   && isTemp ){.  
70c0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
70d0: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f  ITE_CREATE_TEMP_
70e0: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
70f0: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
7100: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
7110: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20  VIEW;.      }.  
7120: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
7130: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
7140: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
7150: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
7160: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54  TE_CREATE_TEMP_T
7170: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
7180: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
7190: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
71a0: 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20  TABLE;.      }. 
71b0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73     }.    if( !is
71c0: 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74  Virtual && sqlit
71d0: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
71e0: 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c  se, code, zName,
71f0: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
7200: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
7210: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
7220: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
7230: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e   Make sure the n
7240: 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f  ew table name do
7250: 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77  es not collide w
7260: 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  ith an existing.
7270: 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
7280: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  ble name in the 
7290: 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20  same database.  
72a0: 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d  Issue an error m
72b0: 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69  essage if.  ** i
72c0: 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65  t does. The exce
72d0: 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20  ption is if the 
72e0: 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20  statement being 
72f0: 70 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65  parsed was passe
7300: 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c  d.  ** to an sql
7310: 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61  ite3_declare_vta
7320: 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61  b() call. In tha
7330: 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20  t case only the 
7340: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a  column names.  *
7350: 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c  * and types will
7360: 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65   be used, so the
7370: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
7380: 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70   test for namesp
7390: 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69  ace.  ** collisi
73a0: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
73b0: 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42  !IN_DECLARE_VTAB
73c0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44   ){.    char *zD
73d0: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
73e0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
73f0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
7400: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
7410: 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  rse) ){.      go
7420: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7430: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
7440: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  pTable = sqlite3
7450: 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e  FindTable(db, zN
7460: 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69  ame, zDb);.    i
7470: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
7480: 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b     if( !noErr ){
7490: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
74a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
74b0: 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61   "table %T alrea
74c0: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
74d0: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
74e0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
74f0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
7500: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7510: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
7520: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
7530: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
7540: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7550: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
7560: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
7570: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
7580: 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20   zDb)!=0 ){.    
7590: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
75a0: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
75b0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
75c0: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
75d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
75e0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
75f0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
7600: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
7610: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
7620: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
7630: 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  ));.  if( pTable
7640: 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
7650: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
7660: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
7670: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
7680: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
7690: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67  ++;.    goto beg
76a0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
76b0: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e    }.  pTable->zN
76c0: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70  ame = zName;.  p
76d0: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d  Table->iPKey = -
76e0: 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63  1;.  pTable->pSc
76f0: 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
7700: 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70  Db].pSchema;.  p
7710: 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  Table->nRef = 1;
7720: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c  .  pTable->nRowL
7730: 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
7740: 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
7750: 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
7760: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
7770: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
7780: 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =0 );.  pParse->
7790: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
77a0: 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  le;..  /* If thi
77b0: 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73  s is the magic s
77c0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
77d0: 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74  able used by aut
77e0: 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a  oincrement,.  **
77f0: 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70   then record a p
7800: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74  ointer to this t
7810: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
7820: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
7830: 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ure.  ** so that
7840: 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64   INSERT can find
7850: 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c   the table easil
7860: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
7870: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
7880: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20  INCREMENT.  if( 
7890: 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20  !pParse->nested 
78a0: 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  && strcmp(zName,
78b0: 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
78c0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  e")==0 ){.    as
78d0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
78e0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
78f0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
7900: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
7910: 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c  >pSeqTab = pTabl
7920: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
7930: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
7940: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
7950: 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74  at will insert t
7960: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
7970: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51  into.  ** the SQ
7980: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
7990: 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74  e.  Note in part
79a0: 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d  icular that we m
79b0: 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a  ust go ahead.  *
79c0: 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74  * and allocate t
79d0: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
79e0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65   for the table e
79f0: 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72  ntry now.  Befor
7a00: 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41  e any.  ** PRIMA
7a10: 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
7a20: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61   keywords are pa
7a30: 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79  rsed.  Those key
7a40: 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65  words will cause
7a50: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f  .  ** indices to
7a60: 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
7a70: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
7a80: 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72   must come befor
7a90: 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  e the .  ** indi
7aa0: 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ces.  Hence, the
7ab0: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
7ac0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73  or the table mus
7ad0: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  t be allocated. 
7ae0: 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   ** now..  */.  
7af0: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
7b00: 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  sy && (v = sqlit
7b10: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
7b20: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
7b30: 20 6a 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c   j1;.    int fil
7b40: 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74  eFormat;.    int
7b50: 20 72 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67   reg1, reg2, reg
7b60: 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  3;.    sqlite3Be
7b70: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
7b80: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
7b90: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
7ba0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7bb0: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56  ABLE.    if( isV
7bc0: 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20  irtual ){.      
7bd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7be0: 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b  0(v, OP_VBegin);
7bf0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
7c00: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
7c10: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63  e format and enc
7c20: 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74  oding in the dat
7c30: 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62  abase have not b
7c40: 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a  een set, .    **
7c50: 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20   set them now.. 
7c60: 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d     */.    reg1 =
7c70: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
7c80: 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
7c90: 65 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70  em;.    reg2 = p
7ca0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d  Parse->regRoot =
7cb0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
7cc0: 0a 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50  .    reg3 = ++pP
7cd0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
7ce0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7cf0: 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b  3(v, OP_ReadCook
7d00: 69 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42  ie, iDb, reg3, B
7d10: 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  TREE_FILE_FORMAT
7d20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7d30: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
7d40: 44 62 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71  Db);.    j1 = sq
7d50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
7d60: 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b  v, OP_If, reg3);
7d70: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
7d80: 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74  ;.    fileFormat
7d90: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
7da0: 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c  SQLITE_LegacyFil
7db0: 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20  eFmt)!=0 ?.     
7dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 3a               1 :
7dd0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45   SQLITE_MAX_FILE
7de0: 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c  _FORMAT;.    sql
7df0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7e00: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66 69  , OP_Integer, fi
7e10: 6c 65 46 6f 72 6d 61 74 2c 20 72 65 67 33 29 3b  leFormat, reg3);
7e20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7e30: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
7e40: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
7e50: 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20  EE_FILE_FORMAT, 
7e60: 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg3);.    sqlit
7e70: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7e80: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 45 4e 43 28  OP_Integer, ENC(
7e90: 64 62 29 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  db), reg3);.    
7ea0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7eb0: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
7ec0: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45  e, iDb, BTREE_TE
7ed0: 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 72 65 67  XT_ENCODING, reg
7ee0: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
7ef0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
7f00: 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  1);..    /* This
7f10: 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61 20   just creates a 
7f20: 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63  place-holder rec
7f30: 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  ord in the sqlit
7f40: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a  e_master table..
7f50: 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72      ** The recor
7f60: 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e  d created does n
7f70: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68  ot contain anyth
7f80: 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c  ing yet.  It wil
7f90: 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20  l be replaced.  
7fa0: 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c    ** by the real
7fb0: 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67   entry in code g
7fc0: 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c 69  enerated at sqli
7fd0: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20  te3EndTable().. 
7fe0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
7ff0: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e   rowid for the n
8000: 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74  ew entry is left
8010: 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50 61   in register pPa
8020: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20  rse->regRowid.. 
8030: 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70     ** The root p
8040: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
8050: 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6c  e new table is l
8060: 65 66 74 20 69 6e 20 72 65 67 20 70 50 61 72 73  eft in reg pPars
8070: 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20  e->regRoot..    
8080: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 61 6e 64  ** The rowid and
8090: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
80a0: 72 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 65  r values are nee
80b0: 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20  ded by the code 
80c0: 74 68 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69  that.    ** sqli
80d0: 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c  te3EndTable will
80e0: 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a   generate..    *
80f0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
8100: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
8110: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
8120: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
8130: 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69  TABLE).    if( i
8140: 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75  sView || isVirtu
8150: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
8160: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8170: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
8180: 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65  reg2);.    }else
8190: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
81a0: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 64 64 72      pParse->addr
81b0: 43 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 56  CrTab = sqlite3V
81c0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
81d0: 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62  CreateTable, iDb
81e0: 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 0a 20  , reg2);.    }. 
81f0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
8200: 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73 65  sterTable(pParse
8210: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
8220: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8230: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c   OP_NewRowid, 0,
8240: 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69   reg1);.    sqli
8250: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8260: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
8270: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
8280: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
8290: 49 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c  Insert, 0, reg3,
82a0: 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69   reg1);.    sqli
82b0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
82c0: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
82d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
82e0: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43  beAddOp0(v, OP_C
82f0: 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lose);.  }..  /*
8300: 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72   Normal (non-err
8310: 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20  or) return. */. 
8320: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49   return;..  /* I
8330: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
8340: 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20  s, we jump here 
8350: 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  */.begin_table_e
8360: 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44  rror:.  sqlite3D
8370: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
8380: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
8390: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
83a0: 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61  is used to compa
83b0: 72 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 69  re two strings i
83c0: 6e 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69  n a case-insensi
83d0: 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20  tive manner..** 
83e0: 49 74 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66  It is slightly f
83f0: 61 73 74 65 72 20 74 68 61 6e 20 63 61 6c 6c 69  aster than calli
8400: 6e 67 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  ng sqlite3StrICm
8410: 70 28 29 20 64 69 72 65 63 74 6c 79 2c 20 62 75  p() directly, bu
8420: 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c 61  t.** produces la
8430: 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rger code..**.**
8440: 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d   WARNING: This m
8450: 61 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70  acro is not comp
8460: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20  atible with the 
8470: 73 74 72 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e  strcmp() family.
8480: 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74   It.** returns t
8490: 72 75 65 20 69 66 20 74 68 65 20 74 77 6f 20 73  rue if the two s
84a0: 74 72 69 6e 67 73 20 61 72 65 20 65 71 75 61 6c  trings are equal
84b0: 2c 20 6f 74 68 65 72 77 69 73 65 20 66 61 6c 73  , otherwise fals
84c0: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54  e..*/.#define ST
84d0: 52 49 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73  RICMP(x, y) (\.s
84e0: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
84f0: 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68  er[*(unsigned ch
8500: 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a  ar *)(x)]==   \.
8510: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
8520: 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63  wer[*(unsigned c
8530: 68 61 72 20 2a 29 28 79 29 5d 20 20 20 20 20 5c  har *)(y)]     \
8540: 0a 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43  .&& sqlite3StrIC
8550: 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d  mp((x)+1,(y)+1)=
8560: 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  =0 )../*.** Add 
8570: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
8580: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
8590: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
85a0: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
85b0: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
85c0: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
85d0: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
85e0: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
85f0: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
8600: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
8610: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29  ite3StartTable()
8620: 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20   gets called.** 
8630: 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69  first to get thi
8640: 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e  ngs going.  Then
8650: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
8660: 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68   called for each
8670: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76  .** column..*/.v
8680: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
8690: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
86a0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
86b0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
86c0: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
86d0: 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  z;.  Column *pCo
86e0: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
86f0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
8700: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
8710: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
8720: 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 53 51  ) return;.#if SQ
8730: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a  LITE_MAX_COLUMN.
8740: 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e    if( p->nCol+1>
8750: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
8760: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
8770: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8780: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8790: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
87a0: 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d   on %s", p->zNam
87b0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
87c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d    }.#endif.  z =
87d0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
87e0: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
87f0: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
8800: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
8810: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
8820: 29 7b 0a 20 20 20 20 69 66 28 20 53 54 52 49 43  ){.    if( STRIC
8830: 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d  MP(z, p->aCol[i]
8840: 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  .zName) ){.     
8850: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8860: 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63  (pParse, "duplic
8870: 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ate column name:
8880: 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20   %s", z);.      
8890: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
88a0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , z);.      retu
88b0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
88c0: 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30  if( (p->nCol & 0
88d0: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f  x7)==0 ){.    Co
88e0: 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20  lumn *aNew;.    
88f0: 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  aNew = sqlite3Db
8900: 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43  Realloc(db,p->aC
8910: 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73  ol,(p->nCol+8)*s
8920: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
8930: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77  ));.    if( aNew
8940: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
8950: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
8960: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
8970: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43  .    }.    p->aC
8980: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
8990: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
89a0: 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d  [p->nCol];.  mem
89b0: 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a  set(pCol, 0, siz
89c0: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
89d0: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20  ;.  pCol->zName 
89e0: 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74  = z;. .  /* If t
89f0: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
8a00: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
8a10: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
8a20: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a  ult affinity.  *
8a30: 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65  * 'NONE'. If the
8a40: 72 65 20 69 73 20 61 20 74 79 70 65 20 73 70 65  re is a type spe
8a50: 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c  cified, then sql
8a60: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
8a70: 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  e() will.  ** be
8a80: 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20   called next to 
8a90: 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  set pCol->affini
8aa0: 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ty correctly..  
8ab0: 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  */.  pCol->affin
8ac0: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
8ad0: 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f 6c 2d 3e 73  _NONE;.  pCol->s
8ae0: 7a 45 73 74 20 3d 20 31 3b 0a 20 20 70 2d 3e 6e  zEst = 1;.  p->n
8af0: 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Col++;.}../*.** 
8b00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
8b10: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
8b20: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
8b30: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
8b40: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
8b50: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
8b60: 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63    A "NOT NULL" c
8b70: 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a  onstraint has.**
8b80: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
8b90: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
8ba0: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e  utine sets the n
8bb0: 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a  otNull flag on.*
8bc0: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72  * the column cur
8bd0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
8be0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
8bf0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74  id sqlite3AddNot
8c00: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
8c10: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
8c20: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
8c30: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
8c40: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
8c50: 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43  0 || NEVER(p->nC
8c60: 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a  ol<1) ) return;.
8c70: 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f    p->aCol[p->nCo
8c80: 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28  l-1].notNull = (
8c90: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f  u8)onError;.}../
8ca0: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f  *.** Scan the co
8cb0: 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a  lumn type name z
8cc0: 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79  Type (length nTy
8cd0: 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74  pe) and return t
8ce0: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
8cf0: 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a   affinity type..
8d00: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8d10: 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69  ne does a case-i
8d20: 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63  ndependent searc
8d30: 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74  h of zType for t
8d40: 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67  he .** substring
8d50: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
8d60: 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65  ng table. If one
8d70: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
8d80: 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20  gs is.** found, 
8d90: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
8da0: 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65  g affinity is re
8db0: 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65  turned. If zType
8dc0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72   contains.** mor
8dd0: 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68  e than one of th
8de0: 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e  e substrings, en
8df0: 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65  tries toward the
8e00: 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20   top of .** the 
8e10: 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72  table take prior
8e20: 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ity. For example
8e30: 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42  , if zType is 'B
8e40: 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c  LOBINT', .** SQL
8e50: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
8e60: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
8e70: 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20  ** Substring    
8e80: 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d   | Affinity.** -
8e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8eb0: 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20  ** 'INT'        
8ec0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   | SQLITE_AFF_IN
8ed0: 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20  TEGER.** 'CHAR' 
8ee0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8ef0: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f  AFF_TEXT.** 'CLO
8f00: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
8f10: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
8f20: 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53  TEXT'        | S
8f30: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
8f40: 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'BLOB'        
8f50: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  | SQLITE_AFF_NON
8f60: 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20  E.** 'REAL'     
8f70: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
8f80: 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20  REAL.** 'FLOA'  
8f90: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
8fa0: 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42  FF_REAL.** 'DOUB
8fb0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
8fc0: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a  E_AFF_REAL.**.**
8fd0: 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
8fe0: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
8ff0: 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72  e above table ar
9000: 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49  e found,.** SQLI
9010: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69  TE_AFF_NUMERIC i
9020: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63  s returned..*/.c
9030: 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e  har sqlite3Affin
9040: 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68  ityType(const ch
9050: 61 72 20 2a 7a 49 6e 2c 20 75 38 20 2a 70 73 7a  ar *zIn, u8 *psz
9060: 45 73 74 29 7b 0a 20 20 75 33 32 20 68 20 3d 20  Est){.  u32 h = 
9070: 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20  0;.  char aff = 
9080: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
9090: 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  IC;.  const char
90a0: 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20   *zChar = 0;..  
90b0: 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74  if( zIn==0 ) ret
90c0: 75 72 6e 20 61 66 66 3b 0a 20 20 77 68 69 6c 65  urn aff;.  while
90d0: 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20  ( zIn[0] ){.    
90e0: 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c  h = (h<<8) + sql
90f0: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
9100: 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20  [(*zIn)&0xff];. 
9110: 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66     zIn++;.    if
9120: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
9130: 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('h'<<16)+('a'<<
9140: 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20  8)+'r') ){      
9150: 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a         /* CHAR *
9160: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
9170: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
9180: 20 20 20 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e       zChar = zIn
9190: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
91a0: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
91b0: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
91c0: 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'b') ){       /
91d0: 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * CLOB */.      
91e0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
91f0: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
9200: 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32   if( h==(('t'<<2
9210: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78  4)+('e'<<16)+('x
9220: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
9230: 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20      /* TEXT */. 
9240: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9250: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
9260: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
9270: 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  b'<<24)+('l'<<16
9280: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
9290: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42           /* BLOB
92a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28   */.        && (
92b0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
92c0: 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d  NUMERIC || aff==
92d0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29  SQLITE_AFF_REAL)
92e0: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
92f0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
9300: 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 30  .      if( zIn[0
9310: 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61 72 20 3d  ]=='(' ) zChar =
9320: 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51   zIn;.#ifndef SQ
9330: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
9340: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c  NG_POINT.    }el
9350: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c  se if( h==(('r'<
9360: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
9370: 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20  'a'<<8)+'l')    
9380: 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f        /* REAL */
9390: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
93a0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
93b0: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
93c0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
93d0: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
93e0: 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b  ( h==(('f'<<24)+
93f0: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
9400: 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20  8)+'a')         
9410: 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20   /* FLOA */.    
9420: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
9430: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
9440: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
9450: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
9460: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9470: 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c  (('d'<<24)+('o'<
9480: 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62  <16)+('u'<<8)+'b
9490: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ')          /* D
94a0: 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  OUB */.        &
94b0: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
94c0: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
94d0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
94e0: 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66  AFF_REAL;.#endif
94f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
9500: 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28  h&0x00FFFFFF)==(
9510: 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c  ('i'<<16)+('n'<<
9520: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a  8)+'t') ){    /*
9530: 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66   INT */.      af
9540: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  f = SQLITE_AFF_I
9550: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72  NTEGER;.      br
9560: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
9570: 20 20 2f 2a 20 49 66 20 70 73 7a 45 73 74 20 69    /* If pszEst i
9580: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72  s not NULL, stor
9590: 65 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  e an estimate of
95a0: 20 74 68 65 20 66 69 65 6c 64 20 73 69 7a 65 2e   the field size.
95b0: 20 20 54 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d    The.  ** estim
95c0: 61 74 65 20 69 73 20 73 63 61 6c 65 64 20 73 6f  ate is scaled so
95d0: 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
95e0: 66 20 61 6e 20 69 6e 74 65 67 65 72 20 69 73 20  f an integer is 
95f0: 31 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 73 7a  1.  */.  if( psz
9600: 45 73 74 20 29 7b 0a 20 20 20 20 2a 70 73 7a 45  Est ){.    *pszE
9610: 73 74 20 3d 20 31 3b 20 20 20 2f 2a 20 64 65 66  st = 1;   /* def
9620: 61 75 6c 74 20 73 69 7a 65 20 69 73 20 61 70 70  ault size is app
9630: 72 6f 78 20 34 20 62 79 74 65 73 20 2a 2f 0a 20  rox 4 bytes */. 
9640: 20 20 20 69 66 28 20 61 66 66 3c 53 51 4c 49 54     if( aff<SQLIT
9650: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
9660: 0a 20 20 20 20 20 20 69 66 28 20 7a 43 68 61 72  .      if( zChar
9670: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
9680: 65 28 20 7a 43 68 61 72 5b 30 5d 20 29 7b 0a 20  e( zChar[0] ){. 
9690: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
96a0: 69 74 65 33 49 73 64 69 67 69 74 28 7a 43 68 61  ite3Isdigit(zCha
96b0: 72 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  r[0]) ){.       
96c0: 20 20 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a       int v = 0;.
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
96e0: 74 65 33 47 65 74 49 6e 74 33 32 28 7a 43 68 61  te3GetInt32(zCha
96f0: 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20  r, &v);.        
9700: 20 20 20 20 76 20 3d 20 76 2f 34 20 2b 20 31 3b      v = v/4 + 1;
9710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
9720: 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32 35 35   v>255 ) v = 255
9730: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  ;.            *p
9740: 73 7a 45 73 74 20 3d 20 76 3b 20 2f 2a 20 42 4c  szEst = v; /* BL
9750: 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b  OB(k), VARCHAR(k
9760: 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d  ), CHAR(k) -> r=
9770: 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20  (k/4+1) */.     
9780: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9790: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
97a0: 20 20 20 20 7a 43 68 61 72 2b 2b 3b 0a 20 20 20      zChar++;.   
97b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
97c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 73 7a  se{.        *psz
97d0: 45 73 74 20 3d 20 35 3b 20 20 20 2f 2a 20 42 4c  Est = 5;   /* BL
97e0: 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f 42 20 2d  OB, TEXT, CLOB -
97f0: 3e 20 72 3d 35 20 20 28 61 70 70 72 6f 78 20 32  > r=5  (approx 2
9800: 30 20 62 79 74 65 73 29 2a 2f 0a 20 20 20 20 20  0 bytes)*/.     
9810: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
9820: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
9830: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9840: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
9850: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
9860: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
9870: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
9880: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
9890: 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73 74  ent.  The pFirst
98a0: 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69   token is the fi
98b0: 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20  rst.** token in 
98c0: 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20  the sequence of 
98d0: 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63  tokens that desc
98e0: 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f 66  ribe the type of
98f0: 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63   the.** column c
9900: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
9910: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70  onstruction.   p
9920: 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73 74  Last is the last
9930: 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65   token.** in the
9940: 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20   sequence.  Use 
9950: 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  this information
9960: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20   to construct a 
9970: 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63  string.** that c
9980: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70 65  ontains the type
9990: 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  name of the colu
99a0: 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61  mn and store tha
99b0: 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a  t string.** in z
99c0: 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73  Type..*/ .void s
99d0: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54  qlite3AddColumnT
99e0: 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ype(Parse *pPars
99f0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29  e, Token *pType)
9a00: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
9a10: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20  Column *pCol;.. 
9a20: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
9a30: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
9a40: 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e  =0 || NEVER(p->n
9a50: 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b  Col<1) ) return;
9a60: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
9a70: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20  ol[p->nCol-1];. 
9a80: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 7a   assert( pCol->z
9a90: 54 79 70 65 3d 3d 30 20 29 3b 0a 20 20 70 43 6f  Type==0 );.  pCo
9aa0: 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74  l->zType = sqlit
9ab0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
9ac0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 79 70  pParse->db, pTyp
9ad0: 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69  e);.  pCol->affi
9ae0: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66  nity = sqlite3Af
9af0: 66 69 6e 69 74 79 54 79 70 65 28 70 43 6f 6c 2d  finityType(pCol-
9b00: 3e 7a 54 79 70 65 2c 20 26 70 43 6f 6c 2d 3e 73  >zType, &pCol->s
9b10: 7a 45 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zEst);.}../*.** 
9b20: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
9b30: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  s the default va
9b40: 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  lue for the most
9b50: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
9b60: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65  column.** of the
9b70: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
9b80: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
9b90: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75  ion..**.** Defau
9ba0: 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73 73  lt value express
9bb0: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e  ions must be con
9bc0: 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e  stant.  Raise an
9bd0: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68   exception if th
9be0: 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65  is.** is not the
9bf0: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   case..**.** Thi
9c00: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9c10: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
9c20: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
9c30: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
9c40: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
9c50: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  LE statement..*/
9c60: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
9c70: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72  DefaultValue(Par
9c80: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
9c90: 53 70 61 6e 20 2a 70 53 70 61 6e 29 7b 0a 20 20  Span *pSpan){.  
9ca0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75  Table *p;.  Colu
9cb0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  mn *pCol;.  sqli
9cc0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9cd0: 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50 61 72  ->db;.  p = pPar
9ce0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
9cf0: 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20   if( p!=0 ){.   
9d00: 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f   pCol = &(p->aCo
9d10: 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20  l[p->nCol-1]);. 
9d20: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45     if( !sqlite3E
9d30: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46  xprIsConstantOrF
9d40: 75 6e 63 74 69 6f 6e 28 70 53 70 61 6e 2d 3e 70  unction(pSpan->p
9d50: 45 78 70 72 2c 20 64 62 2d 3e 69 6e 69 74 2e 62  Expr, db->init.b
9d60: 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73 71  usy) ){.      sq
9d70: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9d80: 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76  arse, "default v
9d90: 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b  alue of column [
9da0: 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  %s] is not const
9db0: 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ant",.          
9dc0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
9dd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
9de0: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78 70  * A copy of pExp
9df0: 72 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  r is used instea
9e00: 64 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  d of the origina
9e10: 6c 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e 74  l, as pExpr cont
9e20: 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  ains.      ** to
9e30: 6b 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74 20  kens that point 
9e40: 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f  to volatile memo
9e50: 72 79 2e 20 54 68 65 20 27 73 70 61 6e 27 20 6f  ry. The 'span' o
9e60: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9e70: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71  .      ** is req
9e80: 75 69 72 65 64 20 62 79 20 70 72 61 67 6d 61 20  uired by pragma 
9e90: 74 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20 20  table_info..    
9ea0: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
9eb0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
9ec0: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20   pCol->pDflt);. 
9ed0: 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74       pCol->pDflt
9ee0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
9ef0: 70 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78  p(db, pSpan->pEx
9f00: 70 72 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  pr, EXPRDUP_REDU
9f10: 43 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  CE);.      sqlit
9f20: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
9f30: 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->zDflt);.     
9f40: 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 20 3d 20 73   pCol->zDflt = s
9f50: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28  qlite3DbStrNDup(
9f60: 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e  db, (char*)pSpan
9f70: 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20  ->zStart,.      
9f80: 20 20 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 28                 (
9fa0: 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64  int)(pSpan->zEnd
9fb0: 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74   - pSpan->zStart
9fc0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
9fd0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
9fe0: 65 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78  e(db, pSpan->pEx
9ff0: 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  pr);.}../*.** De
a000: 73 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d  signate the PRIM
a010: 41 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20  ARY KEY for the 
a020: 74 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73  table.  pList is
a030: 20 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73   a list of names
a040: 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20   .** of columns 
a050: 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72  that form the pr
a060: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70  imary key.  If p
a070: 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  List is NULL, th
a080: 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72  en the.** most r
a090: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
a0a0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c  lumn of the tabl
a0b0: 65 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79  e is the primary
a0c0: 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61   key..**.** A ta
a0d0: 62 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20  ble can have at 
a0e0: 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79  most one primary
a0f0: 20 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61   key.  If the ta
a100: 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a  ble already has.
a110: 2a 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  ** a primary key
a120: 20 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68   (and this is th
a130: 65 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79  e second primary
a140: 20 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74   key) then creat
a150: 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a  e an.** error..*
a160: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d  *.** If the PRIM
a170: 41 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20  ARY KEY is on a 
a180: 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68  single column wh
a190: 6f 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20  ose datatype is 
a1a0: 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e  INTEGER,.** then
a1b0: 20 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20   we will try to 
a1c0: 75 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  use that column 
a1d0: 61 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53  as the rowid.  S
a1e0: 65 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b  et the Table.iPK
a1f0: 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74  ey.** field of t
a200: 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  he table under c
a210: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62  onstruction to b
a220: 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  e the index of t
a230: 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52  he.** INTEGER PR
a240: 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e  IMARY KEY column
a250: 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69  .  Table.iPKey i
a260: 73 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74  s set to -1 if t
a270: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e  here is.** no IN
a280: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
a290: 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  Y..**.** If the 
a2a0: 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e  key is not an IN
a2b0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
a2c0: 59 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  Y, then create a
a2d0: 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78   unique.** index
a2e0: 20 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e   for the key.  N
a2f0: 6f 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  o index is creat
a300: 65 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50  ed for INTEGER P
a310: 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a  RIMARY KEYs..*/.
a320: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50  void sqlite3AddP
a330: 72 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72  rimaryKey(.  Par
a340: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
a350: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
a360: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
a370: 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  *pList,  /* List
a380: 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20   of field names 
a390: 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
a3a0: 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
a3b0: 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
a3c0: 64 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65  do with a unique
a3d0: 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  ness conflict */
a3e0: 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20  .  int autoInc, 
a3f0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
a400: 74 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  the AUTOINCREMEN
a410: 54 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65  T keyword is pre
a420: 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  sent */.  int so
a430: 72 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53  rtOrder     /* S
a440: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20  QLITE_SO_ASC or 
a450: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a  SQLITE_SO_DESC *
a460: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
a470: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
a480: 77 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  wTable;.  char *
a490: 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zType = 0;.  int
a4a0: 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20   iCol = -1, i;. 
a4b0: 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66   int nTerm;.  if
a4c0: 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f  ( pTab==0 || IN_
a4d0: 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67  DECLARE_VTAB ) g
a4e0: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
a4f0: 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62  exit;.  if( pTab
a500: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
a510: 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b  HasPrimaryKey ){
a520: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
a530: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
a540: 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c      "table \"%s\
a550: 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20  " has more than 
a560: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22  one primary key"
a570: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
a580: 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79      goto primary
a590: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  _key_exit;.  }. 
a5a0: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
a5b0: 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79  |= TF_HasPrimary
a5c0: 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  Key;.  if( pList
a5d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  ==0 ){.    iCol 
a5e0: 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31  = pTab->nCol - 1
a5f0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c  ;.    pTab->aCol
a600: 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20  [iCol].colFlags 
a610: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b  |= COLFLAG_PRIMK
a620: 45 59 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20  EY;.    zType = 
a630: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
a640: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 6e 54 65 72  .zType;.    nTer
a650: 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  m = 1;.  }else{.
a660: 20 20 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73      nTerm = pLis
a670: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f  t->nExpr;.    fo
a680: 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20  r(i=0; i<nTerm; 
a690: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  i++){.      for(
a6a0: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
a6b0: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
a6c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
a6d0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69  lite3StrICmp(pLi
a6e0: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  st->a[i].zName, 
a6f0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
a700: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
a710: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
a720: 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67  ol[iCol].colFlag
a730: 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49  s |= COLFLAG_PRI
a740: 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 20 20  MKEY;.          
a750: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
a760: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
a770: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
a780: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a790: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
a7a0: 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26  f( nTerm==1.   &
a7b0: 26 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74  & zType && sqlit
a7c0: 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c  e3StrICmp(zType,
a7d0: 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20   "INTEGER")==0. 
a7e0: 20 20 26 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d    && sortOrder==
a7f0: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 0a 20 20  SQLITE_SO_ASC.  
a800: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b  ){.    pTab->iPK
a810: 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70  ey = iCol;.    p
a820: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28  Tab->keyConf = (
a830: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  u8)onError;.    
a840: 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d  assert( autoInc=
a850: 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31  =0 || autoInc==1
a860: 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61   );.    pTab->ta
a870: 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e  bFlags |= autoIn
a880: 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  c*TF_Autoincreme
a890: 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  nt;.    if( pLis
a8a0: 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53  t ) pParse->iPkS
a8b0: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74  ortOrder = pList
a8c0: 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
a8d0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75  ;.  }else if( au
a8e0: 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66  toInc ){.#ifndef
a8f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
a900: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73  OINCREMENT.    s
a910: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
a920: 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52  Parse, "AUTOINCR
a930: 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c  EMENT is only al
a940: 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20  lowed on an ".  
a950: 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52       "INTEGER PR
a960: 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e  IMARY KEY");.#en
a970: 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
a980: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
a990: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 49 6e  e->pVdbe;.    In
a9a0: 64 65 78 20 2a 70 3b 0a 20 20 20 20 69 66 28 20  dex *p;.    if( 
a9b0: 76 20 29 20 70 50 61 72 73 65 2d 3e 61 64 64 72  v ) pParse->addr
a9c0: 53 6b 69 70 50 4b 20 3d 20 73 71 6c 69 74 65 33  SkipPK = sqlite3
a9d0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
a9e0: 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 70 20 3d 20  _Noop);.    p = 
a9f0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
aa00: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
aa10: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
aa20: 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  or, 0,.         
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa40: 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20    0, sortOrder, 
aa50: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  0);.    if( p ){
aa60: 0a 20 20 20 20 20 20 70 2d 3e 69 64 78 54 79 70  .      p->idxTyp
aa70: 65 20 3d 20 53 51 4c 49 54 45 5f 49 44 58 54 59  e = SQLITE_IDXTY
aa80: 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20  PE_PRIMARYKEY;. 
aa90: 20 20 20 20 20 69 66 28 20 76 20 29 20 73 71 6c       if( v ) sql
aaa0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
aab0: 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72  (v, pParse->addr
aac0: 53 6b 69 70 50 4b 29 3b 0a 20 20 20 20 7d 0a 20  SkipPK);.    }. 
aad0: 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20     pList = 0;.  
aae0: 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  }..primary_key_e
aaf0: 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  xit:.  sqlite3Ex
ab00: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
ab10: 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b  rse->db, pList);
ab20: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
ab30: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48  .** Add a new CH
ab40: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  ECK constraint t
ab50: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
ab60: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
ab70: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
ab80: 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65 63  d sqlite3AddChec
ab90: 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  kConstraint(.  P
aba0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
abb0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
abc0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
abd0: 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68  CheckExpr  /* Th
abe0: 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69  e check expressi
abf0: 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  on */.){.#ifndef
ac00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
ac10: 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  CK.  Table *pTab
ac20: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
ac30: 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  able;.  sqlite3 
ac40: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
ac50: 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26 20  ;.  if( pTab && 
ac60: 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42  !IN_DECLARE_VTAB
ac70: 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65 33 42  .   && !sqlite3B
ac80: 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 64  treeIsReadonly(d
ac90: 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74 2e  b->aDb[db->init.
aca0: 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a 20  iDb].pBt).  ){. 
acb0: 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20     pTab->pCheck 
acc0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
acd0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
ace0: 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43  pTab->pCheck, pC
acf0: 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20 20 69  heckExpr);.    i
ad00: 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  f( pParse->const
ad10: 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20  raintName.n ){. 
ad20: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ad30: 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72  ListSetName(pPar
ad40: 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  se, pTab->pCheck
ad50: 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74  , &pParse->const
ad60: 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20  raintName, 1);. 
ad70: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e     }.  }else.#en
ad80: 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
ad90: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
ada0: 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b  arse->db, pCheck
adb0: 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Expr);.  }.}../*
adc0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c  .** Set the coll
add0: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f  ation function o
ade0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
adf0: 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c 65  tly parsed table
ae00: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68   column.** to th
ae10: 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e  e CollSeq given.
ae20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ae30: 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50  AddCollateType(P
ae40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
ae50: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
ae60: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
ae70: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  i;.  char *zColl
ae80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
ae90: 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20  * Dequoted name 
aea0: 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  of collation seq
aeb0: 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74  uence */.  sqlit
aec0: 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28  e3 *db;..  if( (
aed0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
aee0: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
aef0: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
af00: 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  l-1;.  db = pPar
af10: 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20  se->db;.  zColl 
af20: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
af30: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65  mToken(db, pToke
af40: 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c  n);.  if( !zColl
af50: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
af60: 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  ( sqlite3LocateC
af70: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
af80: 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64  Coll) ){.    Ind
af90: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 73 71  ex *pIdx;.    sq
afa0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
afb0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
afc0: 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69  );.    p->aCol[i
afd0: 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b  ].zColl = zColl;
afe0: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
aff0: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c  e column is decl
b000: 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20  ared as "<name> 
b010: 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c  PRIMARY KEY COLL
b020: 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20  ATE <type>",.   
b030: 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65   ** then an inde
b040: 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  x may have been 
b050: 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20  created on this 
b060: 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68  column before th
b070: 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69  e.    ** collati
b080: 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 65  on type was adde
b090: 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 20  d. Correct this 
b0a0: 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61 73  if it is the cas
b0b0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
b0c0: 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78  r(pIdx=p->pIndex
b0d0: 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
b0e0: 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
b0f0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
b100: 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20  KeyCol==1 );.   
b110: 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
b120: 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20  olumn[0]==i ){. 
b130: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
b140: 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c  oll[0] = p->aCol
b150: 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [i].zColl;.     
b160: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
b170: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
b180: 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
b190: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
b1a0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
b1b0: 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ns the collation
b1c0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61   sequence for da
b1d0: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74 65  tabase native te
b1e0: 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69  xt.** encoding i
b1f0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
b200: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c   string zName, l
b210: 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a  ength nName..**.
b220: 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ** If the reques
b230: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ted collation se
b240: 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76  quence is not av
b250: 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20  ailable, or not 
b260: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20  available.** in 
b270: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 74  the database nat
b280: 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ive encoding, th
b290: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
b2a0: 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ory is invoked t
b2b0: 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e  o.** request it.
b2c0: 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   If the collatio
b2d0: 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e  n factory does n
b2e0: 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20 61  ot supply such a
b2f0: 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e   sequence,.** an
b300: 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 69  d the sequence i
b310: 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61  s available in a
b320: 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f  nother text enco
b330: 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20  ding, then that 
b340: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69  is.** returned i
b350: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
b360: 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20   no versions of 
b370: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
b380: 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63  llations sequenc
b390: 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c  e are available,
b3a0: 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65   or.** another e
b3b0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
b3c0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
b3d0: 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
b3e0: 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  ge written into.
b3f0: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a  ** pParse..**.**
b400: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
b410: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
b420: 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  d sqlite3FindCol
b430: 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72 6f  lSeq().  This ro
b440: 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73  utine.** invokes
b450: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
b460: 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e 61  actory if the na
b470: 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61  med collation ca
b480: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a  nnot be found.**
b490: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20 61   and generates a
b4a0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  n error message.
b4b0: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a  .**.** See also:
b4c0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
b4d0: 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47 65  Seq(), sqlite3Ge
b4e0: 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f  tCollSeq().*/.Co
b4f0: 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f  llSeq *sqlite3Lo
b500: 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73  cateCollSeq(Pars
b510: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
b520: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
b530: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b540: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20  Parse->db;.  u8 
b550: 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20  enc = ENC(db);. 
b560: 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64   u8 initbusy = d
b570: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20  b->init.busy;.  
b580: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
b590: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
b5a0: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
b5b0: 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e  , enc, zName, in
b5c0: 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21  itbusy);.  if( !
b5d0: 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 43  initbusy && (!pC
b5e0: 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78  oll || !pColl->x
b5f0: 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c  Cmp) ){.    pCol
b600: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
b610: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 65 6e  llSeq(pParse, en
b620: 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29  c, pColl, zName)
b630: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
b640: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pColl;.}.../*.**
b650: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
b660: 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65  hat will increme
b670: 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  nt the schema co
b680: 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  okie..**.** The 
b690: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
b6a0: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
b6b0: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
b6c0: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
b6d0: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
b6e0: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
b6f0: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
b700: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
b710: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
b720: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
b730: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
b740: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
b750: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
b760: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
b770: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
b780: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
b790: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
b7a0: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
b7b0: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
b7c0: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
b7d0: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
b7e0: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
b7f0: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
b800: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
b810: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
b820: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
b830: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
b840: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
b850: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
b860: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
b870: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
b880: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
b890: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
b8a0: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
b8b0: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
b8c0: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
b8d0: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
b8e0: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
b8f0: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
b900: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
b910: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64   enough..*/.void
b920: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
b930: 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61 72  okie(Parse *pPar
b940: 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
b950: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
b960: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
b970: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e);.  sqlite3 *d
b980: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
b990: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
b9a0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
b9b0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
b9c0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
b9d0: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c  iDb, 0) );.  sql
b9e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
b9f0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
ba00: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
ba10: 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  ma->schema_cooki
ba20: 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  e+1, r1);.  sqli
ba30: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
ba40: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
ba50: 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45 4d 41  Db, BTREE_SCHEMA
ba60: 5f 56 45 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20  _VERSION, r1);. 
ba70: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
ba80: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
ba90: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61  1);.}../*.** Mea
baa0: 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20  sure the number 
bab0: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65  of characters ne
bac0: 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74  eded to output t
bad0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e  he given.** iden
bae0: 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d  tifier.  The num
baf0: 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63  ber returned inc
bb00: 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73  ludes any quotes
bb10: 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65   used.** but doe
bb20: 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  s not include th
bb30: 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f  e null terminato
bb40: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74  r..**.** The est
bb50: 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76  imate is conserv
bb60: 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74  ative.  It might
bb70: 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20   be larger that 
bb80: 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c  what is.** reall
bb90: 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  y needed..*/.sta
bba0: 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e  tic int identLen
bbb0: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  gth(const char *
bbc0: 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66  z){.  int n;.  f
bbd0: 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c  or(n=0; *z; n++,
bbe0: 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a   z++){.    if( *
bbf0: 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d  z=='"' ){ n++; }
bc00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20  .  }.  return n 
bc10: 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  + 2;.}../*.** Th
bc20: 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
bc30: 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  r is a pointer t
bc40: 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66  o an output buff
bc50: 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a  er. The second .
bc60: 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
bc70: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
bc80: 69 6e 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e  integer that con
bc90: 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74  tains the offset
bca0: 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20   at.** which to 
bcb0: 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f  write into the o
bcc0: 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68  utput buffer. Th
bcd0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69  is function copi
bce0: 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65  es the.** nul-te
bcf0: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
bd00: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
bd10: 65 20 74 68 69 72 64 20 70 61 72 61 6d 65 74 65  e third paramete
bd20: 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c  r, zSignedIdent,
bd30: 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69  .** to the speci
bd40: 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74  fied offset in t
bd50: 68 65 20 62 75 66 66 65 72 20 61 6e 64 20 75 70  he buffer and up
bd60: 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72  dates *pIdx to r
bd70: 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66  efer.** to the f
bd80: 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72 20  irst byte after 
bd90: 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 77 72  the last byte wr
bda0: 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74  itten before ret
bdb0: 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49  urning..** .** I
bdc0: 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69  f the string zSi
bdd0: 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73  gnedIdent consis
bde0: 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61  ts entirely of a
bdf0: 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20  lpha-numeric.** 
be00: 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73  characters, does
be10: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
be20: 61 20 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e  a digit and is n
be30: 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72  ot an SQL keywor
be40: 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  d,.** then it is
be50: 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f   copied to the o
be60: 75 74 70 75 74 20 62 75 66 66 65 72 20 65 78 61  utput buffer exa
be70: 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f  ctly as it is. O
be80: 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20  therwise,.** it 
be90: 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20  is quoted using 
bea0: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a  double-quotes..*
beb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 64  /.static void id
bec0: 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20  entPut(char *z, 
bed0: 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20  int *pIdx, char 
bee0: 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a  *zSignedIdent){.
bef0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
bf00: 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67  *zIdent = (unsig
bf10: 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65  ned char*)zSigne
bf20: 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c  dIdent;.  int i,
bf30: 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20   j, needQuote;. 
bf40: 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66   i = *pIdx;..  f
bf50: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
bf60: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; j++){.    if(
bf70: 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d   !sqlite3Isalnum
bf80: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
bf90: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
bfa0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
bfb0: 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33  dQuote = sqlite3
bfc0: 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30  Isdigit(zIdent[0
bfd0: 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  ]).            |
bfe0: 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64  | sqlite3Keyword
bff0: 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21  Code(zIdent, j)!
c000: 3d 54 4b 5f 49 44 0a 20 20 20 20 20 20 20 20 20  =TK_ID.         
c010: 20 20 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21     || zIdent[j]!
c020: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =0.            |
c030: 7c 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28 20 6e  | j==0;..  if( n
c040: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
c050: 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a  ] = '"';.  for(j
c060: 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a  =0; zIdent[j]; j
c070: 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20  ++){.    z[i++] 
c080: 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20  = zIdent[j];.   
c090: 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d   if( zIdent[j]==
c0a0: 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  '"' ) z[i++] = '
c0b0: 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65  "';.  }.  if( ne
c0c0: 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d  edQuote ) z[i++]
c0d0: 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d   = '"';.  z[i] =
c0e0: 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b   0;.  *pIdx = i;
c0f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
c100: 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  te a CREATE TABL
c110: 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70 72  E statement appr
c120: 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 20  opriate for the 
c130: 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20  given.** table. 
c140: 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20   Memory to hold 
c150: 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  the text of the 
c160: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62 74  statement is obt
c170: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71  ained.** from sq
c180: 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64  liteMalloc() and
c190: 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62   must be freed b
c1a0: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  y the calling fu
c1b0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
c1c0: 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54 61  c char *createTa
c1d0: 62 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33 20  bleStmt(sqlite3 
c1e0: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a  *db, Table *p){.
c1f0: 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20    int i, k, n;. 
c200: 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
c210: 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65  char *zSep, *zSe
c220: 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c  p2, *zEnd;.  Col
c230: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d  umn *pCol;.  n =
c240: 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d   0;.  for(pCol =
c250: 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69   p->aCol, i=0; i
c260: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
c270: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d  Col++){.    n +=
c280: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f   identLength(pCo
c290: 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20  l->zName) + 5;. 
c2a0: 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c   }.  n += identL
c2b0: 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b  ength(p->zName);
c2c0: 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a  .  if( n<50 ){ .
c2d0: 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20      zSep = "";. 
c2e0: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a     zSep2 = ",";.
c2f0: 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a      zEnd = ")";.
c300: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65    }else{.    zSe
c310: 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20  p = "\n  ";.    
c320: 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b  zSep2 = ",\n  ";
c330: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29  .    zEnd = "\n)
c340: 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35  ";.  }.  n += 35
c350: 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20   + 6*p->nCol;.  
c360: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 44  zStmt = sqlite3D
c370: 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29  bMallocRaw(0, n)
c380: 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30  ;.  if( zStmt==0
c390: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   ){.    db->mall
c3a0: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
c3b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
c3c0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
c3d0: 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52  tf(n, zStmt, "CR
c3e0: 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a 20  EATE TABLE ");. 
c3f0: 20 6b 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   k = sqlite3Strl
c400: 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69  en30(zStmt);.  i
c410: 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26  dentPut(zStmt, &
c420: 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  k, p->zName);.  
c430: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27  zStmt[k++] = '('
c440: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e  ;.  for(pCol=p->
c450: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
c460: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
c470: 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  +){.    static c
c480: 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73  onst char * cons
c490: 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20  t azType[] = {. 
c4a0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
c4b0: 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20  _AFF_NONE    */ 
c4c0: 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  "",.        /* S
c4d0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20  QLITE_AFF_TEXT  
c4e0: 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20    */ " TEXT",.  
c4f0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
c500: 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22  AFF_NUMERIC */ "
c510: 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f   NUM",.        /
c520: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  * SQLITE_AFF_INT
c530: 45 47 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a  EGER */ " INT",.
c540: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
c550: 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f  E_AFF_REAL    */
c560: 20 22 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a   " REAL".    };.
c570: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
c580: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
c590: 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  pe;..    sqlite3
c5a0: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
c5b0: 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b  zStmt[k], zSep);
c5c0: 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65  .    k += sqlite
c5d0: 33 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74  3Strlen30(&zStmt
c5e0: 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d  [k]);.    zSep =
c5f0: 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e   zSep2;.    iden
c600: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
c610: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
c620: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
c630: 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f  affinity-SQLITE_
c640: 41 46 46 5f 4e 4f 4e 45 20 3e 3d 20 30 20 29 3b  AFF_NONE >= 0 );
c650: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f  .    assert( pCo
c660: 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49  l->affinity-SQLI
c670: 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 3c 20 41 72  TE_AFF_NONE < Ar
c680: 72 61 79 53 69 7a 65 28 61 7a 54 79 70 65 29 20  raySize(azType) 
c690: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c6a0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
c6b0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
c6c0: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
c6d0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
c6e0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
c6f0: 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  T );.    testcas
c700: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
c710: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  y==SQLITE_AFF_NU
c720: 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74 65 73  MERIC );.    tes
c730: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
c740: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
c750: 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20 20  F_INTEGER );.   
c760: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
c770: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
c780: 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20  E_AFF_REAL );.  
c790: 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 61    .    zType = a
c7a0: 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69  zType[pCol->affi
c7b0: 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f 41 46  nity - SQLITE_AF
c7c0: 46 5f 4e 4f 4e 45 5d 3b 0a 20 20 20 20 6c 65 6e  F_NONE];.    len
c7d0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
c7e0: 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20 61  30(zType);.    a
c7f0: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
c800: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
c810: 46 5f 4e 4f 4e 45 20 0a 20 20 20 20 20 20 20 20  F_NONE .        
c820: 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66      || pCol->aff
c830: 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33 41 66  inity==sqlite3Af
c840: 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70 65  finityType(zType
c850: 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63  , 0) );.    memc
c860: 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54  py(&zStmt[k], zT
c870: 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b  ype, len);.    k
c880: 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73   += len;.    ass
c890: 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d  ert( k<=n );.  }
c8a0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
c8b0: 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b  ntf(n-k, &zStmt[
c8c0: 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b  k], "%s", zEnd);
c8d0: 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b  .  return zStmt;
c8e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65  .}../*.** Resize
c8f0: 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   an Index object
c900: 20 74 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d   to hold N colum
c910: 6e 73 20 74 6f 74 61 6c 2e 20 20 52 65 74 75 72  ns total.  Retur
c920: 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
c930: 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 53 51  n success and SQ
c940: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e  LITE_NOMEM on an
c950: 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73   OOM error..*/.s
c960: 74 61 74 69 63 20 69 6e 74 20 72 65 73 69 7a 65  tatic int resize
c970: 49 6e 64 65 78 4f 62 6a 65 63 74 28 73 71 6c 69  IndexObject(sqli
c980: 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  te3 *db, Index *
c990: 70 49 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  pIdx, int N){.  
c9a0: 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20  char *zExtra;.  
c9b0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28  int nByte;.  if(
c9c0: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d   pIdx->nColumn>=
c9d0: 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  N ) return SQLIT
c9e0: 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
c9f0: 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d  pIdx->isResized=
ca00: 3d 30 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20  =0 );.  nByte = 
ca10: 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b  (sizeof(char*) +
ca20: 20 73 69 7a 65 6f 66 28 69 31 36 29 20 2b 20 31   sizeof(i16) + 1
ca30: 29 2a 4e 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20  )*N;.  zExtra = 
ca40: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
ca50: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
ca60: 20 20 69 66 28 20 7a 45 78 74 72 61 3d 3d 30 20    if( zExtra==0 
ca70: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ca80: 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28  NOMEM;.  memcpy(
ca90: 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a  zExtra, pIdx->az
caa0: 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61  Coll, sizeof(cha
cab0: 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  r*)*pIdx->nColum
cac0: 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f  n);.  pIdx->azCo
cad0: 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 7a 45 78  ll = (char**)zEx
cae0: 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d  tra;.  zExtra +=
caf0: 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e   sizeof(char*)*N
cb00: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72  ;.  memcpy(zExtr
cb10: 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  a, pIdx->aiColum
cb20: 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 70  n, sizeof(i16)*p
cb30: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Idx->nColumn);. 
cb40: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20   pIdx->aiColumn 
cb50: 3d 20 28 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a  = (i16*)zExtra;.
cb60: 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65    zExtra += size
cb70: 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d  of(i16)*N;.  mem
cb80: 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78  cpy(zExtra, pIdx
cb90: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 70 49  ->aSortOrder, pI
cba0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  dx->nColumn);.  
cbb0: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
cbc0: 20 3d 20 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a   = (u8*)zExtra;.
cbd0: 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20    pIdx->nColumn 
cbe0: 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52  = N;.  pIdx->isR
cbf0: 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65  esized = 1;.  re
cc00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
cc10: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  }../*.** Estimat
cc20: 65 20 74 68 65 20 74 6f 74 61 6c 20 72 6f 77 20  e the total row 
cc30: 77 69 64 74 68 20 66 6f 72 20 61 20 74 61 62 6c  width for a tabl
cc40: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
cc50: 64 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57  d estimateTableW
cc60: 69 64 74 68 28 54 61 62 6c 65 20 2a 70 54 61 62  idth(Table *pTab
cc70: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 54  ){.  unsigned wT
cc80: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  able = 0;.  cons
cc90: 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f  t Column *pTabCo
cca0: 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  l;.  int i;.  fo
ccb0: 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20  r(i=pTab->nCol, 
ccc0: 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43  pTabCol=pTab->aC
ccd0: 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54  ol; i>0; i--, pT
cce0: 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54  abCol++){.    wT
ccf0: 61 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d  able += pTabCol-
cd00: 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66  >szEst;.  }.  if
cd10: 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20  ( pTab->iPKey<0 
cd20: 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54  ) wTable++;.  pT
cd30: 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73  ab->szTabRow = s
cd40: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 54 61  qlite3LogEst(wTa
cd50: 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ble*4);.}../*.**
cd60: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76   Estimate the av
cd70: 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 61 20  erage size of a 
cd80: 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64 65 78  row for an index
cd90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
cda0: 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69   estimateIndexWi
cdb0: 64 74 68 28 49 6e 64 65 78 20 2a 70 49 64 78 29  dth(Index *pIdx)
cdc0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 49 6e  {.  unsigned wIn
cdd0: 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  dex = 0;.  int i
cde0: 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e  ;.  const Column
cdf0: 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70   *aCol = pIdx->p
ce00: 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66  Table->aCol;.  f
ce10: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
ce20: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
ce30: 20 20 20 69 31 36 20 78 20 3d 20 70 49 64 78 2d     i16 x = pIdx-
ce40: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
ce50: 20 20 61 73 73 65 72 74 28 20 78 3c 70 49 64 78    assert( x<pIdx
ce60: 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29  ->pTable->nCol )
ce70: 3b 0a 20 20 20 20 77 49 6e 64 65 78 20 2b 3d 20  ;.    wIndex += 
ce80: 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70  x<0 ? 1 : aCol[p
ce90: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
cea0: 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70  ].szEst;.  }.  p
ceb0: 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20  Idx->szIdxRow = 
cec0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 49  sqlite3LogEst(wI
ced0: 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52  ndex*4);.}../* R
cee0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 76 61  eturn true if va
cef0: 6c 75 65 20 78 20 69 73 20 66 6f 75 6e 64 20 61  lue x is found a
cf00: 6e 79 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ny of the first 
cf10: 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f 66 20  nCol entries of 
cf20: 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69  aiCol[].*/.stati
cf30: 63 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28  c int hasColumn(
cf40: 63 6f 6e 73 74 20 69 31 36 20 2a 61 69 43 6f 6c  const i16 *aiCol
cf50: 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20  , int nCol, int 
cf60: 78 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f  x){.  while( nCo
cf70: 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28 20 78 3d  l-- > 0 ) if( x=
cf80: 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65  =*(aiCol++) ) re
cf90: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
cfa0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
cfb0: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 61  s routine runs a
cfc0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 70 61 72  t the end of par
cfd0: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
cfe0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 74 68  BLE statement th
cff0: 61 74 0a 2a 2a 20 68 61 73 20 61 20 57 49 54 48  at.** has a WITH
d000: 4f 55 54 20 52 4f 57 49 44 20 63 6c 61 75 73 65  OUT ROWID clause
d010: 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  .  The job of th
d020: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
d030: 20 63 6f 6e 76 65 72 74 20 62 6f 74 68 0a 2a 2a   convert both.**
d040: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
d050: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
d060: 20 61 6e 64 20 74 68 65 20 67 65 6e 65 72 61 74   and the generat
d070: 65 64 20 56 44 42 45 20 63 6f 64 65 20 73 6f 20  ed VDBE code so 
d080: 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 61 72 65  that they.** are
d090: 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
d0a0: 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
d0b0: 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20 6f   table instead o
d0c0: 66 20 61 20 72 6f 77 69 64 20 74 61 62 6c 65 2e  f a rowid table.
d0d0: 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 63 6c  .** Changes incl
d0e0: 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ude:.**.**     (
d0f0: 31 29 20 20 43 6f 6e 76 65 72 74 20 74 68 65 20  1)  Convert the 
d100: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 69  OP_CreateTable i
d110: 6e 74 6f 20 61 6e 20 4f 50 5f 43 72 65 61 74 65  nto an OP_Create
d120: 49 6e 64 65 78 2e 20 20 54 68 65 72 65 20 69 73  Index.  There is
d130: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 6e 6f 20  .**          no 
d140: 72 6f 77 69 64 20 62 74 72 65 65 20 66 6f 72 20  rowid btree for 
d150: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 2e  a WITHOUT ROWID.
d160: 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 63    Instead, the c
d170: 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 20 20 20 20  anonical.**     
d180: 20 20 20 20 20 64 61 74 61 20 73 74 6f 72 61 67       data storag
d190: 65 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20  e is a covering 
d1a0: 69 6e 64 65 78 20 62 74 72 65 65 2e 0a 2a 2a 20  index btree..** 
d1b0: 20 20 20 20 28 32 29 20 20 42 79 70 61 73 73 20      (2)  Bypass 
d1c0: 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20  the creation of 
d1d0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
d1e0: 72 20 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a  r table entry.**
d1f0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74 68            for th
d200: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 73  e PRIMARY KEY as
d210: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
d220: 20 69 6e 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a   index is now.**
d230: 20 20 20 20 20 20 20 20 20 20 69 64 65 6e 74 69            identi
d240: 66 69 65 64 20 62 79 20 74 68 65 20 73 71 6c 69  fied by the sqli
d250: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
d260: 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62  entry of the tab
d270: 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20  le itself..**   
d280: 20 20 28 33 29 20 20 53 65 74 20 74 68 65 20 49    (3)  Set the I
d290: 6e 64 65 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65  ndex.tnum of the
d2a0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64   PRIMARY KEY Ind
d2b0: 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ex object in the
d2c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 68  .**          sch
d2d0: 65 6d 61 20 74 6f 20 74 68 65 20 72 6f 6f 74 70  ema to the rootp
d2e0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  age from the mai
d2f0: 6e 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  n table..**     
d300: 28 34 29 20 20 53 65 74 20 61 6c 6c 20 63 6f 6c  (4)  Set all col
d310: 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d  umns of the PRIM
d320: 41 52 59 20 4b 45 59 20 73 63 68 65 6d 61 20 6f  ARY KEY schema o
d330: 62 6a 65 63 74 20 74 6f 20 62 65 20 4e 4f 54 20  bject to be NOT 
d340: 4e 55 4c 4c 2e 0a 2a 2a 20 20 20 20 20 28 35 29  NULL..**     (5)
d350: 20 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20    Add all table 
d360: 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50  columns to the P
d370: 52 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78  RIMARY KEY Index
d380: 20 6f 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20   object.**      
d390: 20 20 20 20 73 6f 20 74 68 61 74 20 74 68 65 20      so that the 
d3a0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 61  PRIMARY KEY is a
d3b0: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
d3c0: 20 20 54 68 65 20 73 75 72 70 6c 75 73 0a 2a 2a    The surplus.**
d3d0: 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e            column
d3e0: 73 20 61 72 65 20 70 61 72 74 20 6f 66 20 4b 65  s are part of Ke
d3f0: 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20 61 6e  yInfo.nXField an
d400: 64 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 66  d are not used f
d410: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73  or.**          s
d420: 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70  orting or lookup
d430: 20 6f 72 20 75 6e 69 71 75 65 6e 65 73 73 20 63   or uniqueness c
d440: 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20 28 36  hecks..**     (6
d450: 29 20 20 52 65 70 6c 61 63 65 20 74 68 65 20 72  )  Replace the r
d460: 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20 61 6c 6c  owid tail on all
d470: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67   automatically g
d480: 65 6e 65 72 61 74 65 64 20 55 4e 49 51 55 45 0a  enerated UNIQUE.
d490: 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e 64 69  **          indi
d4a0: 63 65 73 20 77 69 74 68 20 74 68 65 20 50 52 49  ces with the PRI
d4b0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73  MARY KEY columns
d4c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d4d0: 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75   convertToWithou
d4e0: 74 52 6f 77 69 64 54 61 62 6c 65 28 50 61 72 73  tRowidTable(Pars
d4f0: 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
d500: 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78   *pTab){.  Index
d510: 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64 65 78 20   *pIdx;.  Index 
d520: 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b  *pPk;.  int nPk;
d530: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73  .  int i, j;.  s
d540: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
d550: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
d560: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
d570: 62 65 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72  be;..  /* Conver
d580: 74 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 54  t the OP_CreateT
d590: 61 62 6c 65 20 6f 70 63 6f 64 65 20 74 68 61 74  able opcode that
d5a0: 20 77 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20   would normally 
d5b0: 63 72 65 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  create the.  ** 
d5c0: 72 6f 6f 74 2d 70 61 67 65 20 66 6f 72 20 74 68  root-page for th
d5d0: 65 20 74 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20  e table into an 
d5e0: 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 20 6f  OP_CreateIndex o
d5f0: 70 63 6f 64 65 2e 20 20 54 68 65 20 69 6e 64 65  pcode.  The inde
d600: 78 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 77  x.  ** created w
d610: 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 50  ill become the P
d620: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
d630: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
d640: 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 29  rse->addrCrTab )
d650: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 20  {.    assert( v 
d660: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
d670: 62 65 47 65 74 4f 70 28 76 2c 20 70 50 61 72 73  beGetOp(v, pPars
d680: 65 2d 3e 61 64 64 72 43 72 54 61 62 29 2d 3e 6f  e->addrCrTab)->o
d690: 70 63 6f 64 65 20 3d 20 4f 50 5f 43 72 65 61 74  pcode = OP_Creat
d6a0: 65 49 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  eIndex;.  }..  /
d6b0: 2a 20 42 79 70 61 73 73 20 74 68 65 20 63 72 65  * Bypass the cre
d6c0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 50 52 49  ation of the PRI
d6d0: 4d 41 52 59 20 4b 45 59 20 62 74 72 65 65 20 61  MARY KEY btree a
d6e0: 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  nd the sqlite_ma
d6f0: 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20  ster.  ** table 
d700: 65 6e 74 72 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  entry..  */.  if
d710: 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72 53 6b  ( pParse->addrSk
d720: 69 70 50 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  ipPK ){.    asse
d730: 72 74 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c  rt( v );.    sql
d740: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
d750: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 53 6b 69   pParse->addrSki
d760: 70 50 4b 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f  pPK)->opcode = O
d770: 50 5f 47 6f 74 6f 3b 0a 20 20 7d 0a 0a 20 20 2f  P_Goto;.  }..  /
d780: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 50 52 49  * Locate the PRI
d790: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20  MARY KEY index. 
d7a0: 20 4f 72 2c 20 69 66 20 74 68 69 73 20 74 61 62   Or, if this tab
d7b0: 6c 65 20 77 61 73 20 6f 72 69 67 69 6e 61 6c 6c  le was originall
d7c0: 79 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47 45  y.  ** an INTEGE
d7d0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74 61  R PRIMARY KEY ta
d7e0: 62 6c 65 2c 20 63 72 65 61 74 65 20 61 20 6e 65  ble, create a ne
d7f0: 77 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  w PRIMARY KEY in
d800: 64 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  dex. .  */.  if(
d810: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20   pTab->iPKey>=0 
d820: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
d830: 2a 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 69 73  *pList;.    pLis
d840: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
d850: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
d860: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
d870: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
d880: 72 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  rn;.    pList->a
d890: 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [0].zName = sqli
d8a0: 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72  te3DbStrDup(pPar
d8b0: 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->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: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
d8f0: 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a  >iPKey].zName);.
d900: 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e      pList->a[0].
d910: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 50 61 72  sortOrder = pPar
d920: 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72  se->iPkSortOrder
d930: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
d940: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
d950: 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 70 50 6b  =pTab );.    pPk
d960: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
d970: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c  Index(pParse, 0,
d980: 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 70 54   0, 0, pList, pT
d990: 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c 20  ab->keyConf, 0, 
d9a0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
d9b0: 28 20 70 50 6b 3d 3d 30 20 29 20 72 65 74 75 72  ( pPk==0 ) retur
d9c0: 6e 3b 0a 20 20 20 20 70 50 6b 2d 3e 69 64 78 54  n;.    pPk->idxT
d9d0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 44 58  ype = SQLITE_IDX
d9e0: 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 3b  TYPE_PRIMARYKEY;
d9f0: 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
da00: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
da10: 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65      pPk = sqlite
da20: 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  3PrimaryKeyIndex
da30: 28 70 54 61 62 29 3b 0a 20 20 20 20 2f 2a 0a 20  (pTab);.    /*. 
da40: 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c     ** Remove all
da50: 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d   redundant colum
da60: 6e 73 20 66 72 6f 6d 20 74 68 65 20 50 52 49 4d  ns from the PRIM
da70: 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 20 65 78  ARY KEY.  For ex
da80: 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65 0a 20 20  ample, change.  
da90: 20 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b 45    ** "PRIMARY KE
daa0: 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63 2c  Y(a,b,a,b,c,b,c,
dab0: 64 29 22 20 69 6e 74 6f 20 6a 75 73 74 20 22 50  d)" into just "P
dac0: 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 63  RIMARY KEY(a,b,c
dad0: 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a 20 20 20  ,d)".  Later.   
dae0: 20 2a 2a 20 63 6f 64 65 20 61 73 73 75 6d 65 73   ** code assumes
daf0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
db00: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 65 70   contains no rep
db10: 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20  eated columns.. 
db20: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
db30: 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79  j=1; i<pPk->nKey
db40: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
db50: 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70   if( hasColumn(p
db60: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c  Pk->aiColumn, j,
db70: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
db80: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ]) ){.        pP
db90: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20  k->nColumn--;.  
dba0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dbb0: 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e     pPk->aiColumn
dbc0: 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e 61 69 43  [j++] = pPk->aiC
dbd0: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
dbe0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 6b 2d  }.    }.    pPk-
dbf0: 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b 0a 20 20  >nKeyCol = j;.  
dc00: 7d 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72  }.  pPk->isCover
dc10: 69 6e 67 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  ing = 1;.  asser
dc20: 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20 6e  t( pPk!=0 );.  n
dc30: 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Pk = pPk->nKeyCo
dc40: 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  l;..  /* Make su
dc50: 72 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20  re every column 
dc60: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
dc70: 45 59 20 69 73 20 4e 4f 54 20 4e 55 4c 4c 2e 20  EY is NOT NULL. 
dc80: 20 28 45 78 63 65 70 74 2c 0a 20 20 2a 2a 20 64   (Except,.  ** d
dc90: 6f 20 6e 6f 74 20 65 6e 66 6f 72 63 65 20 74 68  o not enforce th
dca0: 69 73 20 66 6f 72 20 69 6d 70 6f 73 74 65 72 20  is for imposter 
dcb0: 74 61 62 6c 65 73 2e 29 20 2a 2f 0a 20 20 69 66  tables.) */.  if
dcc0: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f  ( !db->init.impo
dcd0: 73 74 65 72 54 61 62 6c 65 20 29 7b 0a 20 20 20  sterTable ){.   
dce0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b   for(i=0; i<nPk;
dcf0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 54 61   i++){.      pTa
dd00: 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69 43  b->aCol[pPk->aiC
dd10: 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c  olumn[i]].notNul
dd20: 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  l = 1;.    }.   
dd30: 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c   pPk->uniqNotNul
dd40: 6c 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  l = 1;.  }..  /*
dd50: 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   The root page o
dd60: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
dd70: 59 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 72  Y is the table r
dd80: 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 70 50  oot page */.  pP
dd90: 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62 2d 3e  k->tnum = pTab->
dda0: 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64 61  tnum;..  /* Upda
ddb0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
ddc0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
ddd0: 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 20 69 6e  of all UNIQUE in
dde0: 64 69 63 65 73 20 62 79 20 63 6f 6e 76 65 72 74  dices by convert
ddf0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e  ing.  ** the fin
de00: 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20  al rowid column 
de10: 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  into one or more
de20: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
de30: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20 2a  PRIMARY KEY..  *
de40: 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61  /.  for(pIdx=pTa
de50: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
de60: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
de70: 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20  t){.    int n;. 
de80: 20 20 20 69 66 28 20 49 73 50 72 69 6d 61 72 79     if( IsPrimary
de90: 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 29  KeyIndex(pIdx) )
dea0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
deb0: 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b  or(i=n=0; i<nPk;
dec0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
ded0: 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78   !hasColumn(pIdx
dee0: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78  ->aiColumn, pIdx
def0: 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e  ->nKeyCol, pPk->
df00: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e  aiColumn[i]) ) n
df10: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
df20: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( n==0 ){.      
df30: 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 73  /* This index is
df40: 20 61 20 73 75 70 65 72 73 65 74 20 6f 66 20 74   a superset of t
df50: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a  he primary key *
df60: 2f 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 43  /.      pIdx->nC
df70: 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b  olumn = pIdx->nK
df80: 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e  eyCol;.      con
df90: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
dfa0: 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78   if( resizeIndex
dfb0: 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64 78 2c  Object(db, pIdx,
dfc0: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e   pIdx->nKeyCol+n
dfd0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ) ) return;.    
dfe0: 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d  for(i=0, j=pIdx-
dff0: 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b  >nKeyCol; i<nPk;
e000: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
e010: 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78   !hasColumn(pIdx
e020: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78  ->aiColumn, pIdx
e030: 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e  ->nKeyCol, pPk->
e040: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a  aiColumn[i]) ){.
e050: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69          pIdx->ai
e060: 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d  Column[j] = pPk-
e070: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20  >aiColumn[i];.  
e080: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
e090: 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43  ll[j] = pPk->azC
e0a0: 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  oll[i];.        
e0b0: 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j++;.      }.   
e0c0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
e0d0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49  Idx->nColumn>=pI
e0e0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b  dx->nKeyCol+n );
e0f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
e100: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b  x->nColumn>=j );
e110: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61  .  }..  /* Add a
e120: 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ll table columns
e130: 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20   to the PRIMARY 
e140: 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20  KEY index.  */. 
e150: 20 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e   if( nPk<pTab->n
e160: 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 72  Col ){.    if( r
e170: 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74  esizeIndexObject
e180: 28 64 62 2c 20 70 50 6b 2c 20 70 54 61 62 2d 3e  (db, pPk, pTab->
e190: 6e 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a  nCol) ) return;.
e1a0: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e      for(i=0, j=n
e1b0: 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c  Pk; i<pTab->nCol
e1c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
e1d0: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b  ( !hasColumn(pPk
e1e0: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69  ->aiColumn, j, i
e1f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
e200: 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c  ert( j<pPk->nCol
e210: 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  umn );.        p
e220: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20  Pk->aiColumn[j] 
e230: 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 50 6b  = i;.        pPk
e240: 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 22 42  ->azColl[j] = "B
e250: 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20  INARY";.        
e260: 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j++;.      }.   
e270: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
e280: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29  Pk->nColumn==j )
e290: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
e2a0: 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20  ab->nCol==j );. 
e2b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d   }else{.    pPk-
e2c0: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d  >nColumn = pTab-
e2d0: 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  >nCol;.  }.}../*
e2e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e2f0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
e300: 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22  port the final "
e310: 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  )" that terminat
e320: 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54  es.** a CREATE T
e330: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
e340: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
e350: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f  structure that o
e360: 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74  ther action rout
e370: 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62  ines have been b
e380: 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64  uilding.** is ad
e390: 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ded to the inter
e3a0: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c  nal hash tables,
e3b0: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
e3c0: 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75  ors have.** occu
e3d0: 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  rred..**.** An e
e3e0: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62  ntry for the tab
e3f0: 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68  le is made in th
e400: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e master table o
e410: 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a  n disk, unless.*
e420: 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  * this is a temp
e430: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64  orary table or d
e440: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e  b->init.busy==1.
e450: 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e    When db->init.
e460: 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65  busy==1.** it me
e470: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
e480: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
e490: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
e4a0: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
e4b0: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
e4c0: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
e4d0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
e4e0: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
e4f0: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
e500: 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  ed, so the entry
e510: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
e520: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
e530: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
e540: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
e550: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
e560: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
e570: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
e580: 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20  Select argument 
e590: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
e5a0: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
e5b0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63  routine.** was c
e5c0: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
e5d0: 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  a table generate
e5e0: 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52  d from a .** "CR
e5f0: 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41  EATE TABLE ... A
e600: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  S SELECT ..." st
e610: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f  atement.  The co
e620: 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a  lumn names of.**
e630: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77   the new table w
e640: 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65  ill match the re
e650: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
e660: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
e670: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
e680: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
e690: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
e6a0: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
e6b0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20   Token *pCons,  
e6c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e6d0: 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20  ',' token after 
e6e0: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
e6f0: 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  defn. */.  Token
e700: 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20   *pEnd,         
e710: 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20 62 65     /* The ')' be
e720: 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20  fore options in 
e730: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
e740: 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70 74 73   */.  u8 tabOpts
e750: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
e760: 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f 70 74   Extra table opt
e770: 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30 2e  ions. Usually 0.
e780: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
e790: 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a  elect         /*
e7a0: 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22   Select from a "
e7b0: 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45  CREATE ... AS SE
e7c0: 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61  LECT" */.){.  Ta
e7d0: 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ble *p;         
e7e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
e7f0: 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ew table */.  sq
e800: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
e810: 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64  se->db; /* The d
e820: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
e830: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  on */.  int iDb;
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e850: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e    /* Database in
e860: 20 77 68 69 63 68 20 74 68 65 20 74 61 62 6c 65   which the table
e870: 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64 65   lives */.  Inde
e880: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
e890: 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70 6c        /* An impl
e8a0: 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65  ied index of the
e8b0: 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28   table */..  if(
e8c0: 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65   (pEnd==0 && pSe
e8d0: 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e  lect==0) || db->
e8e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
e8f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
e900: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
e910: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
e920: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
e930: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
e940: 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c  it.busy || !pSel
e950: 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ect );..  /* If 
e960: 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  the db->init.bus
e970: 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20  y is 1 it means 
e980: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
e990: 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20  he SQL off the. 
e9a0: 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74   ** "sqlite_mast
e9b0: 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74  er" or "sqlite_t
e9c0: 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c  emp_master" tabl
e9d0: 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20  e on the disk.. 
e9e0: 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72   ** So do not wr
e9f0: 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ite to the disk 
ea00: 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20  again.  Extract 
ea10: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
ea20: 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68  mber.  ** for th
ea30: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
ea40: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
ea50: 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70  m field.  (The p
ea60: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
ea70: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
ea80: 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68   put there by th
ea90: 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72  e sqliteOpenCb r
eaa0: 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20  outine.).  */.  
eab0: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
eac0: 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d  y ){.    p->tnum
ead0: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
eae0: 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  num;.  }..  /* S
eaf0: 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  pecial processin
eb00: 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  g for WITHOUT RO
eb10: 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20  WID Tables */.  
eb20: 69 66 28 20 74 61 62 4f 70 74 73 20 26 20 54 46  if( tabOpts & TF
eb30: 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b  _WithoutRowid ){
eb40: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62  .    if( (p->tab
eb50: 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
eb60: 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20  ncrement) ){.   
eb70: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
eb80: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
eb90: 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52 45 4d       "AUTOINCREM
eba0: 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  ENT not allowed 
ebb0: 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  on WITHOUT ROWID
ebc0: 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
ebd0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
ebe0: 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c     if( (p->tabFl
ebf0: 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d  ags & TF_HasPrim
ec00: 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20  aryKey)==0 ){.  
ec10: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ec20: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50 52 49  Msg(pParse, "PRI
ec30: 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69 6e 67  MARY KEY missing
ec40: 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c 20 70   on table %s", p
ec50: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  ->zName);.    }e
ec60: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61  lse{.      p->ta
ec70: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69 74  bFlags |= TF_Wit
ec80: 68 6f 75 74 52 6f 77 69 64 3b 0a 20 20 20 20 20  houtRowid;.     
ec90: 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75   convertToWithou
eca0: 74 52 6f 77 69 64 54 61 62 6c 65 28 70 50 61 72  tRowidTable(pPar
ecb0: 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  se, p);.    }.  
ecc0: 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  }..  iDb = sqlit
ecd0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
ece0: 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
ecf0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
ed00: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a  _OMIT_CHECK.  /*
ed10: 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69   Resolve names i
ed20: 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73  n all CHECK cons
ed30: 74 72 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f  traint expressio
ed40: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ns..  */.  if( p
ed50: 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20  ->pCheck ){.    
ed60: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
ed70: 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72  lfReference(pPar
ed80: 73 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 63  se, p, NC_IsChec
ed90: 6b 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29  k, 0, p->pCheck)
eda0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
edb0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
edc0: 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a  OMIT_CHECK) */..
edd0: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68    /* Estimate th
ede0: 65 20 61 76 65 72 61 67 65 20 72 6f 77 20 73 69  e average row si
edf0: 7a 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ze for the table
ee00: 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70   and for all imp
ee10: 6c 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a  lied indices */.
ee20: 20 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57    estimateTableW
ee30: 69 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 70  idth(p);.  for(p
ee40: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
ee50: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
ee60: 70 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74 69  pNext){.    esti
ee70: 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70  mateIndexWidth(p
ee80: 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Idx);.  }..  /* 
ee90: 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  If not initializ
eea0: 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ing, then create
eeb0: 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68   a record for th
eec0: 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a  e new table.  **
eed0: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
eee0: 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74  ASTER table of t
eef0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
ef00: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  *.  ** If this i
ef10: 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61  s a TEMPORARY ta
ef20: 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65  ble, write the e
ef30: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75  ntry into the au
ef40: 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c  xiliary.  ** fil
ef50: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74  e instead of int
ef60: 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
ef70: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
ef80: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
ef90: 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  usy ){.    int n
efa0: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  ;.    Vdbe *v;. 
efb0: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20     char *zType; 
efc0: 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20     /* "view" or 
efd0: 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63  "table" */.    c
efe0: 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f  har *zType2;   /
eff0: 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42  * "VIEW" or "TAB
f000: 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  LE" */.    char 
f010: 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65  *zStmt;    /* Te
f020: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
f030: 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45   TABLE or CREATE
f040: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20   VIEW statement 
f050: 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  */..    v = sqli
f060: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
f070: 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  e);.    if( NEVE
f080: 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
f090: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ;..    sqlite3Vd
f0a0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
f0b0: 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  lose, 0);..    /
f0c0: 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61  * .    ** Initia
f0d0: 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74  lize zType for t
f0e0: 68 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74  he new view or t
f0f0: 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
f100: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d   if( p->pSelect=
f110: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
f120: 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a   regular table *
f130: 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
f140: 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a  "table";.      z
f150: 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b  Type2 = "TABLE";
f160: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f170: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65  OMIT_VIEW.    }e
f180: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
f190: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54  view */.      zT
f1a0: 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20  ype = "view";.  
f1b0: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49      zType2 = "VI
f1c0: 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EW";.#endif.    
f1d0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
f1e0: 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41  s is a CREATE TA
f1f0: 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54  BLE xx AS SELECT
f200: 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68   ..., execute th
f210: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  e SELECT.    ** 
f220: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70  statement to pop
f230: 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61  ulate the new ta
f240: 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61  ble. The root-pa
f250: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
f260: 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62  e.    ** new tab
f270: 6c 65 20 69 73 20 69 6e 20 72 65 67 69 73 74 65  le is in registe
f280: 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  r pParse->regRoo
f290: 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
f2a0: 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54   Once the SELECT
f2b0: 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20   has been coded 
f2c0: 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  by sqlite3Select
f2d0: 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20  (), it is in a. 
f2e0: 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73     ** suitable s
f2f0: 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f  tate to query fo
f300: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
f310: 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20  es and types to 
f320: 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62  be used.    ** b
f330: 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  y the new table.
f340: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
f350: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77 72   shared-cache wr
f360: 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  ite-lock is not 
f370: 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74  required to writ
f380: 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62  e to the new tab
f390: 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20  le,.    ** as a 
f3a0: 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74  schema-lock must
f3b0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
f3c0: 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63  en obtained to c
f3d0: 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a  reate it. Since.
f3e0: 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d      ** a schema-
f3f0: 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c  lock excludes al
f400: 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  l other database
f410: 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69 74   users, the writ
f420: 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20  e-lock would.   
f430: 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74   ** be redundant
f440: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
f450: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
f460: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
f470: 74 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  t;.      Table *
f480: 70 53 65 6c 54 61 62 3b 0a 0a 20 20 20 20 20 20  pSelTab;..      
f490: 61 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e 6e  assert(pParse->n
f4a0: 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73  Tab==1);.      s
f4b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
f4c0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
f4d0: 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67  , 1, pParse->reg
f4e0: 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20  Root, iDb);.    
f4f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
f500: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
f510: 50 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20 20  P2ISREG);.      
f520: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32  pParse->nTab = 2
f530: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
f540: 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64  electDestInit(&d
f550: 65 73 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20  est, SRT_Table, 
f560: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
f570: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
f580: 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b  pSelect, &dest);
f590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
f5a0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
f5b0: 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  lose, 1);.      
f5c0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
f5d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
f5e0: 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
f5f0: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
f600: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
f610: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
f620: 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74  pSelTab==0 ) ret
f630: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  urn;.        ass
f640: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20  ert( p->aCol==0 
f650: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  );.        p->nC
f660: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43  ol = pSelTab->nC
f670: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  ol;.        p->a
f680: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
f690: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65  Col;.        pSe
f6a0: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
f6b0: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d          pSelTab-
f6c0: 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >aCol = 0;.     
f6d0: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
f6e0: 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61  Table(db, pSelTa
f6f0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
f700: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  }..    /* Comput
f710: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  e the complete t
f720: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
f730: 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
f740: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
f750: 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  {.      zStmt = 
f760: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
f770: 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73  db, p);.    }els
f780: 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a  e{.      Token *
f790: 70 45 6e 64 32 20 3d 20 74 61 62 4f 70 74 73 20  pEnd2 = tabOpts 
f7a0: 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c 61 73 74  ? &pParse->sLast
f7b0: 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20  Token : pEnd;.  
f7c0: 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45      n = (int)(pE
f7d0: 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d  nd2->z - pParse-
f7e0: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a  >sNameToken.z);.
f7f0: 20 20 20 20 20 20 69 66 28 20 70 45 6e 64 32 2d        if( pEnd2-
f800: 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b  >z[0]!=';' ) n +
f810: 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20  = pEnd2->n;.    
f820: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
f830: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20  3MPrintf(db, .  
f840: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
f850: 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32  %s %.*s", zType2
f860: 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61  , n, pParse->sNa
f870: 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20  meToken.z.      
f880: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
f890: 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20   A slot for the 
f8a0: 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61  record has alrea
f8b0: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
f8c0: 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a  d in the .    **
f8d0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
f8e0: 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e  able.  We just n
f8f0: 65 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68  eed to update th
f900: 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c  at slot with all
f910: 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f  .    ** the info
f920: 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f  rmation we've co
f930: 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  llected..    */.
f940: 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
f950: 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
f960: 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
f970: 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53  %s ".         "S
f980: 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61  ET type='%s', na
f990: 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d  me=%Q, tbl_name=
f9a0: 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64  %Q, rootpage=#%d
f9b0: 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20  , sql=%Q ".     
f9c0: 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23    "WHERE rowid=#
f9d0: 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61  %d",.      db->a
f9e0: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
f9f0: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
fa00: 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20  ,.      zType,. 
fa10: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20       p->zName,. 
fa20: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20       p->zName,. 
fa30: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67       pParse->reg
fa40: 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d  Root,.      zStm
fa50: 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  t,.      pParse-
fa60: 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b  >regRowid.    );
fa70: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
fa80: 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20  ee(db, zStmt);. 
fa90: 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
faa0: 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
fab0: 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
fac0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
fad0: 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43  CREMENT.    /* C
fae0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
faf0: 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65  e need to create
fb00: 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65   an sqlite_seque
fb10: 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20  nce table for.  
fb20: 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61    ** keeping tra
fb30: 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d  ck of autoincrem
fb40: 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f  ent keys..    */
fb50: 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 61 62 46  .    if( p->tabF
fb60: 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
fb70: 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  crement ){.     
fb80: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
fb90: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20  aDb[iDb];.      
fba0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
fbb0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
fbc0: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
fbd0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63      if( pDb->pSc
fbe0: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30  hema->pSeqTab==0
fbf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
fc00: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
fc10: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
fc20: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
fc30: 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  Q.sqlite_sequenc
fc40: 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20  e(name,seq)",.  
fc50: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
fc60: 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  me.        );.  
fc70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
fc80: 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72  if..    /* Repar
fc90: 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f  se everything to
fca0: 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
fcb0: 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74  rnal data struct
fcc0: 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ures */.    sqli
fcd0: 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53  te3VdbeAddParseS
fce0: 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a  chemaOp(v, iDb,.
fcf0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
fd00: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 74  e3MPrintf(db, "t
fd10: 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44  bl_name='%q' AND
fd20: 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27   type!='trigger'
fd30: 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  ", p->zName));. 
fd40: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68   }...  /* Add th
fd50: 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69  e table to the i
fd60: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
fd70: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
fd80: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
fd90: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
fda0: 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  y ){.    Table *
fdb0: 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d 61  pOld;.    Schema
fdc0: 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70   *pSchema = p->p
fdd0: 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65  Schema;.    asse
fde0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
fdf0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
fe00: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 4f  Db, 0) );.    pO
fe10: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
fe20: 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d  Insert(&pSchema-
fe30: 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  >tblHash, p->zNa
fe40: 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20  me, p);.    if( 
fe50: 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73  pOld ){.      as
fe60: 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b  sert( p==pOld );
fe70: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
fe80: 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73   have failed ins
fe90: 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29  ide HashInsert()
fea0: 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61   */.      db->ma
feb0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
fec0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
fed0: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
fee0: 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20  pNewTable = 0;. 
fef0: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
ff00: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
ff10: 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53  nges;..#ifndef S
ff20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52  QLITE_OMIT_ALTER
ff30: 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70  TABLE.    if( !p
ff40: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
ff50: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ff60: 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
ff70: 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61  ar *)pParse->sNa
ff80: 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20  meToken.z;.     
ff90: 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20   int nName;.    
ffa0: 20 20 61 73 73 65 72 74 28 20 21 70 53 65 6c 65    assert( !pSele
ffb0: 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70  ct && pCons && p
ffc0: 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28  End );.      if(
ffd0: 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a   pCons->z==0 ){.
ffe0: 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20          pCons = 
fff0: 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pEnd;.      }.  
10000 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74      nName = (int
10010 29 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  )((const char *)
10020 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65  pCons->z - zName
10030 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43  );.      p->addC
10040 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20  olOffset = 13 + 
10050 73 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c  sqlite3Utf8CharL
10060 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  en(zName, nName)
10070 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
10080 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
10090 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
100a0 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
100b0 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
100c0 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ne in order to c
100d0 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57  reate a new VIEW
100e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
100f0 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61  CreateView(.  Pa
10100 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
10110 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
10120 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
10130 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20  en *pBegin,     
10140 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
10150 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
10160 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
10170 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
10180 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b  ,     /* The tok
10190 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
101a0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
101b0 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
101c0 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68  Name2,     /* Th
101d0 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
101e0 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
101f0 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c  he view */.  Sel
10200 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
10210 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
10220 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20  ement that will 
10230 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76  become the new v
10240 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
10250 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  emp,        /* T
10260 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52  RUE for a TEMPOR
10270 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  ARY view */.  in
10280 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20  t noErr         
10290 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72   /* Suppress err
102a0 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56  or messages if V
102b0 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73  IEW already exis
102c0 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
102d0 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *p;.  int n;.  
102e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
102f0 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44   Token sEnd;.  D
10300 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54  bFixer sFix;.  T
10310 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
10320 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71  .  int iDb;.  sq
10330 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
10340 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  se->db;..  if( p
10350 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b  Parse->nVar>0 ){
10360 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
10370 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61  rMsg(pParse, "pa
10380 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74  rameters are not
10390 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77   allowed in view
103a0 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s");.    sqlite3
103b0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
103c0 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72   pSelect);.    r
103d0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
103e0 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70  ite3StartTable(p
103f0 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
10400 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31  Name2, isTemp, 1
10410 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70  , 0, noErr);.  p
10420 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
10430 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
10440 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
10450 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
10460 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
10470 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
10480 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
10490 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
104a0 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
104b0 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
104c0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
104d0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
104e0 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20   p->pSchema);.  
104f0 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
10500 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
10510 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65  b, "view", pName
10520 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
10530 46 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c  FixSelect(&sFix,
10540 20 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20   pSelect) ){.   
10550 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
10560 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74  lete(db, pSelect
10570 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
10580 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20   }..  /* Make a 
10590 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69  copy of the enti
105a0 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  re SELECT statem
105b0 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
105c0 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20   the view..  ** 
105d0 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20  This will force 
105e0 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  all the Expr.tok
105f0 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62  en.z values to b
10600 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
10610 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74  ** allocated rat
10620 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74  her than point t
10630 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  o the input stri
10640 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73  ng - which means
10650 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20   that.  ** they 
10660 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74  will persist aft
10670 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  er the current s
10680 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61  qlite3_exec() ca
10690 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f  ll returns..  */
106a0 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  .  p->pSelect = 
106b0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
106c0 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58  (db, pSelect, EX
106d0 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
106e0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
106f0 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74  lete(db, pSelect
10700 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
10710 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
10720 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
10730 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
10740 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
10750 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
10760 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  es(pParse, p);. 
10770 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
10780 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
10790 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
107a0 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64  ment.  Make sEnd
107b0 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74   point to.  ** t
107c0 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73  he end..  */.  s
107d0 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c  End = pParse->sL
107e0 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20  astToken;.  if( 
107f0 41 4c 57 41 59 53 28 73 45 6e 64 2e 7a 5b 30 5d  ALWAYS(sEnd.z[0]
10800 21 3d 30 29 20 26 26 20 73 45 6e 64 2e 7a 5b 30  !=0) && sEnd.z[0
10810 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45  ]!=';' ){.    sE
10820 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a  nd.z += sEnd.n;.
10830 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30    }.  sEnd.n = 0
10840 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73 45  ;.  n = (int)(sE
10850 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a  nd.z - pBegin->z
10860 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d  );.  z = pBegin-
10870 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 41 4c 57  >z;.  while( ALW
10880 41 59 53 28 6e 3e 30 29 20 26 26 20 73 71 6c 69  AYS(n>0) && sqli
10890 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31  te3Isspace(z[n-1
108a0 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73  ]) ){ n--; }.  s
108b0 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b  End.z = &z[n-1];
108c0 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a  .  sEnd.n = 1;..
108d0 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33    /* Use sqlite3
108e0 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64  EndTable() to ad
108f0 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68  d the view to th
10900 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  e SQLITE_MASTER 
10910 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
10920 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73  e3EndTable(pPars
10930 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c 20  e, 0, &sEnd, 0, 
10940 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  0);.  return;.}.
10950 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
10960 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23  _OMIT_VIEW */..#
10970 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
10980 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
10990 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
109a0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
109b0 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  LE)./*.** The Ta
109c0 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
109d0 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
109e0 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
109f0 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
10a00 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
10a10 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
10a20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
10a30 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
10a40 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
10a50 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
10a60 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
10a70 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
10a80 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
10a90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10aa0 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
10ab0 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
10ac0 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
10ad0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  {.  Table *pSelT
10ae0 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20  ab;   /* A fake 
10af0 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
10b00 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75   we get the resu
10b10 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65  lt set */.  Sele
10b20 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a  ct *pSel;     /*
10b30 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   Copy of the SEL
10b40 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ECT that impleme
10b50 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a  nts the view */.
10b60 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20    int nErr = 0; 
10b70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10b80 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
10b90 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  red */.  int n; 
10ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
10bb0 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20  mporarily holds 
10bc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
10bd0 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a  rsors assigned *
10be0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
10bf0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
10c00 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
10c10 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63  ction for malloc
10c20 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 73 71 6c   errors */.  sql
10c30 69 74 65 33 5f 78 61 75 74 68 20 78 41 75 74 68  ite3_xauth xAuth
10c40 3b 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64  ;       /* Saved
10c50 20 78 41 75 74 68 20 70 6f 69 6e 74 65 72 20 2a   xAuth pointer *
10c60 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  /..  assert( pTa
10c70 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ble );..#ifndef 
10c80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
10c90 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 73  UALTABLE.  if( s
10ca0 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f  qlite3VtabCallCo
10cb0 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70 54  nnect(pParse, pT
10cc0 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  able) ){.    ret
10cd0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
10ce0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69  ;.  }.  if( IsVi
10cf0 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20  rtual(pTable) ) 
10d00 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
10d10 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10d20 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
10d30 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20  A positive nCol 
10d40 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e  means the column
10d50 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73  s names for this
10d60 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61   view are.  ** a
10d70 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20  lready known..  
10d80 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
10d90 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e  >nCol>0 ) return
10da0 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61   0;..  /* A nega
10db0 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73  tive nCol is a s
10dc0 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65  pecial marker me
10dd0 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72  aning that we ar
10de0 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
10df0 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75   trying to compu
10e00 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  te the column na
10e10 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65  mes.  If we ente
10e20 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
10e30 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74  ith.  ** a negat
10e40 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61  ive nCol, it mea
10e50 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76  ns two or more v
10e60 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70  iews form a loop
10e70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a  , like this:.  *
10e80 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  *.  **     CREAT
10e90 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45  E VIEW one AS SE
10ea0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b  LECT * FROM two;
10eb0 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
10ec0 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c   VIEW two AS SEL
10ed0 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a  ECT * FROM one;.
10ee0 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
10ef0 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61 62  ly, the error ab
10f00 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67 68  ove is now caugh
10f10 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68  t prior to reach
10f20 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a  ing this point..
10f30 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f 6c    ** But the fol
10f40 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20 73  lowing test is s
10f50 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61  till important a
10f60 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20 75  s it does come u
10f70 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f  p.  ** in the fo
10f80 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20  llowing:.  ** . 
10f90 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54   **     CREATE T
10fa0 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61 29  ABLE main.ex1(a)
10fb0 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
10fc0 45 20 54 45 4d 50 20 56 49 45 57 20 65 78 31 20  E TEMP VIEW ex1 
10fd0 41 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  AS SELECT a FROM
10fe0 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53   ex1;.  **     S
10ff0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d  ELECT * FROM tem
11000 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66  p.ex1;.  */.  if
11010 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30  ( pTable->nCol<0
11020 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
11030 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
11040 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63  "view %s is circ
11050 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c  ularly defined",
11060 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
11070 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
11080 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61   }.  assert( pTa
11090 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a  ble->nCol>=0 );.
110a0 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
110b0 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
110c0 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f  ns we need to co
110d0 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20  mpute the table 
110e0 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65  names..  ** Note
110f0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
11100 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  o sqlite3ResultS
11110 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c  etOfSelect() wil
11120 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a  l expand any.  *
11130 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69  * "*" elements i
11140 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65  n the results se
11150 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e  t of the view an
11160 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75  d will assign cu
11170 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68  rsors.  ** to th
11180 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  e elements of th
11190 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
111a0 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61  But we do not wa
111b0 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73  nt these changes
111c0 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d  .  ** to be perm
111d0 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63  anent.  So the c
111e0 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f  omputation is do
111f0 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20  ne on a copy of 
11200 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20  the SELECT.  ** 
11210 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
11220 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
11230 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
11240 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
11250 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69  );.  pSel = sqli
11260 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
11270 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
11280 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  , 0);.  if( pSel
11290 20 29 7b 0a 20 20 20 20 75 38 20 65 6e 61 62 6c   ){.    u8 enabl
112a0 65 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 64 62 2d  eLookaside = db-
112b0 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
112c0 6c 65 64 3b 0a 20 20 20 20 6e 20 3d 20 70 50 61  led;.    n = pPa
112d0 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73  rse->nTab;.    s
112e0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
112f0 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
11300 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a  e, pSel->pSrc);.
11310 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
11320 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c   = -1;.    db->l
11330 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
11340 64 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  d = 0;.#ifndef S
11350 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
11360 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41 75  RIZATION.    xAu
11370 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a  th = db->xAuth;.
11380 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20      db->xAuth = 
11390 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d  0;.    pSelTab =
113a0 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
113b0 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
113c0 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d  , pSel);.    db-
113d0 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a  >xAuth = xAuth;.
113e0 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c 54 61  #else.    pSelTa
113f0 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
11400 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
11410 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64  rse, pSel);.#end
11420 69 66 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  if.    db->looka
11430 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20  side.bEnabled = 
11440 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 3b  enableLookaside;
11450 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  .    pParse->nTa
11460 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70  b = n;.    if( p
11470 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20  SelTab ){.      
11480 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
11490 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
114a0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
114b0 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
114c0 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
114d0 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
114e0 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
114f0 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
11500 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
11510 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
11520 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
11530 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
11540 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11550 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
11560 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d 3e  (db, 0, pTable->
11570 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20  pSchema) );.    
11580 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
11590 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 20 7c  a->schemaFlags |
115a0 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  = DB_UnresetView
115b0 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
115c0 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
115d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72   = 0;.      nErr
115e0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ++;.    }.    sq
115f0 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
11600 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 7d  e(db, pSel);.  }
11610 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72   else {.    nErr
11620 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ++;.  }.#endif /
11630 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
11640 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e  EW */.  return n
11650 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20  Err;  .}.#endif 
11660 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
11670 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
11680 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
11690 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
116a0 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  LE) */..#ifndef 
116b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
116c0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
116d0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
116e0 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e  om every VIEW in
116f0 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a   database idx..*
11700 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
11710 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
11720 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
11730 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c  t idx){.  HashEl
11740 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28  em *i;.  assert(
11750 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
11760 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c  texHeld(db, idx,
11770 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62   0) );.  if( !Db
11780 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20  HasProperty(db, 
11790 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
117a0 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a  iews) ) return;.
117b0 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
117c0 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62  shFirst(&db->aDb
117d0 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  [idx].pSchema->t
117e0 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c  blHash); i;i=sql
117f0 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
11800 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
11810 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
11820 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54  a(i);.    if( pT
11830 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
11840 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74       sqliteDelet
11850 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c  eColumnNames(db,
11860 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54   pTab);.      pT
11870 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
11880 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
11890 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
118a0 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
118b0 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
118c0 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c  setViews);.}.#el
118d0 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69  se.# define sqli
118e0 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41  teViewResetAll(A
118f0 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,B).#endif /* SQ
11900 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
11910 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
11920 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
11930 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20   by the VDBE to 
11940 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72  adjust the inter
11950 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73  nal schema.** us
11960 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65  ed by SQLite whe
11970 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  n the btree laye
11980 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20  r moves a table 
11990 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a  root page. The.*
119a0 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  * root-page of a
119b0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
119c0 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20  in database iDb 
119d0 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d  has changed from
119e0 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f   iFrom.** to iTo
119f0 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23  ..**.** Ticket #
11a00 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f  1728:  The symbo
11a10 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74  l table might st
11a20 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f  ill contain info
11a30 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61  rmation.** on ta
11a40 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69  bles and/or indi
11a50 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65  ces that are the
11a60 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
11a70 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66  g deleted..** If
11a80 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79   you are unlucky
11a90 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64  , one of those d
11aa0 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f  eleted indices o
11ab0 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a  r tables might.*
11ac0 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  * have the same 
11ad0 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20  rootpage number 
11ae0 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c  as the real tabl
11af0 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20  e or index that 
11b00 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65  is.** being move
11b10 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74  d.  So we cannot
11b20 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20   stop searching 
11b30 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20  after the first 
11b40 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73  match .** becaus
11b50 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  e the first matc
11b60 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f  h might be for o
11b70 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65  ne of the delete
11b80 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20  d indices.** or 
11b90 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74  tables and not t
11ba0 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74  he table/index t
11bb0 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  hat is actually 
11bc0 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20  being moved..** 
11bd0 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65  We must continue
11be0 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
11bf0 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  ll tables and in
11c00 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f  dices with.** ro
11c10 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61  otpage==iFrom ha
11c20 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  ve been converte
11c30 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74  d to have a root
11c40 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69  page of iTo.** i
11c50 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65  n order to be ce
11c60 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f  rtain that we go
11c70 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e  t the right one.
11c80 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
11c90 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
11ca0 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  UM.void sqlite3R
11cb0 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c  ootPageMoved(sql
11cc0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
11cd0 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  b, int iFrom, in
11ce0 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c  t iTo){.  HashEl
11cf0 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
11d00 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a  h *pHash;.  Db *
11d10 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
11d20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
11d30 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
11d40 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  0) );.  pDb = &d
11d50 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
11d60 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63  Hash = &pDb->pSc
11d70 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  hema->tblHash;. 
11d80 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
11d90 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
11da0 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
11db0 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
11dc0 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
11dd0 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
11de0 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
11df0 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74  .    if( pTab->t
11e00 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
11e10 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d      pTab->tnum =
11e20 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iTo;.    }.  }.
11e30 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
11e40 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
11e50 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
11e60 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
11e70 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
11e80 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
11e90 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49  t(pElem)){.    I
11ea0 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c  ndex *pIdx = sql
11eb0 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
11ec0 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  m);.    if( pIdx
11ed0 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
11ee0 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75  .      pIdx->tnu
11ef0 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
11f00 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
11f10 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f  ** Write code to
11f20 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65   erase the table
11f30 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
11f40 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61  iTable from data
11f50 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73  base iDb..** Als
11f60 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20  o write code to 
11f70 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74  modify the sqlit
11f80 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
11f90 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
11fa0 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d  ma.** if a root-
11fb0 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  page of another 
11fc0 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
11fd0 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65  y the btree-laye
11fe0 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73  r whilst.** eras
11ff0 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73  ing iTable (this
12000 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
12010 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
12020 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73  database)..*/ .s
12030 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
12040 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65  oyRootPage(Parse
12050 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
12060 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  able, int iDb){.
12070 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
12080 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
12090 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  e);.  int r1 = s
120a0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
120b0 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
120c0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
120d0 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61   OP_Destroy, iTa
120e0 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20  ble, r1, iDb);. 
120f0 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
12100 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
12110 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12120 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50  TOVACUUM.  /* OP
12130 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20  _Destroy stores 
12140 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31  an in integer r1
12150 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65  . If this intege
12160 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  r.  ** is non-ze
12170 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
12180 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
12190 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d  ber of a table m
121a0 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63  oved to.  ** loc
121b0 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68  ation iTable. Th
121c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
121d0 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71   modifies the sq
121e0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
121f0 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63  e to.  ** reflec
12200 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  t this..  **.  *
12210 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20  * The "#NNN" in 
12220 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65  the SQL is a spe
12230 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68  cial constant th
12240 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65  at means whateve
12250 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20  r value.  ** is 
12260 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e  in register NNN.
12270 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75    See grammar ru
12280 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  les associated w
12290 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53  ith the TK_REGIS
122a0 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66  TER.  ** token f
122b0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
122c0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  formation..  */.
122d0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
122e0 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
122f0 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
12300 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64   SET rootpage=%d
12310 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72   WHERE #%d AND r
12320 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20  ootpage=#%d",.  
12330 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
12340 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
12350 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
12360 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31  , iTable, r1, r1
12370 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
12380 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
12390 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
123a0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44  ../*.** Write VD
123b0 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  BE code to erase
123c0 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
123d0 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69  all associated i
123e0 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a  ndices on disk..
123f0 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74  ** Code to updat
12400 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
12410 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69  ter tables and i
12420 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64  nternal schema d
12430 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e  efinitions.** in
12440 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67   case a root-pag
12450 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
12460 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
12470 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
12480 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61  ee layer.** is a
12490 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20  lso added (this 
124a0 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
124b0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
124c0 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61  atabase)..*/.sta
124d0 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
124e0 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
124f0 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
12500 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
12510 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
12520 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
12530 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
12540 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
12550 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
12560 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64  b->pSchema);.  d
12570 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
12580 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75  Parse, pTab->tnu
12590 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70  m, iDb);.  for(p
125a0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
125b0 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
125c0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64  x->pNext){.    d
125d0 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
125e0 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75  Parse, pIdx->tnu
125f0 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c  m, iDb);.  }.#el
12600 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  se.  /* If the d
12610 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61  atabase may be a
12620 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62  uto-vacuum capab
12630 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d  le (if SQLITE_OM
12640 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
12650 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  ** is not define
12660 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69  d), then it is i
12670 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c  mportant to call
12680 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74   OP_Destroy on t
12690 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e  he.  ** table an
126a0 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67  d index root-pag
126b0 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61  es in order, sta
126c0 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e  rting with the n
126d0 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a  umerically .  **
126e0 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
126f0 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20  ge number. This 
12700 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
12710 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74  none of the root
12720 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  -pages.  ** to b
12730 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72  e destroyed is r
12740 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65  elocated by an e
12750 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f  arlier OP_Destro
12760 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20  y. i.e. if the. 
12770 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65   ** following we
12780 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20  re coded:.  **. 
12790 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34   ** OP_Destroy 4
127a0 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a   0.  ** ....  **
127b0 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a   OP_Destroy 5 0.
127c0 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f    **.  ** and ro
127d0 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e  ot page 5 happen
127e0 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72  ed to be the lar
127f0 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
12800 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a  umber in the.  *
12810 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  * database, then
12820 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75   root page 5 wou
12830 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70  ld be moved to p
12840 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20  age 4 by the .  
12850 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34  ** "OP_Destroy 4
12860 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20   0" opcode. The 
12870 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44  subsequent "OP_D
12880 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c  estroy 5 0" woul
12890 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65  d hit.  ** a fre
128a0 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a  e-list page..  *
128b0 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
128c0 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74  Tab->tnum;.  int
128d0 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b   iDestroyed = 0;
128e0 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
128f0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
12900 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73  .    int iLarges
12910 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
12920 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
12930 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64   iTab<iDestroyed
12940 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65   ){.      iLarge
12950 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d  st = iTab;.    }
12960 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
12970 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
12980 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
12990 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
129a0 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d  Idx = pIdx->tnum
129b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
129c0 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  pIdx->pSchema==p
129d0 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
129e0 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74        if( (iDest
129f0 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64  royed==0 || (iId
12a00 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26  x<iDestroyed)) &
12a10 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20  & iIdx>iLargest 
12a20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67  ){.        iLarg
12a30 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20  est = iIdx;.    
12a40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
12a50 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b  ( iLargest==0 ){
12a60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
12a70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12a80 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
12a90 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
12aa0 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
12ab0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
12ac0 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
12ad0 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64  && iDb<pParse->d
12ae0 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20  b->nDb );.      
12af0 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
12b00 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74  pParse, iLargest
12b10 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44  , iDb);.      iD
12b20 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67  estroyed = iLarg
12b30 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  est;.    }.  }.#
12b40 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
12b50 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72  emove entries fr
12b60 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  om the sqlite_st
12b70 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f 72 20  atN tables (for 
12b80 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a  N in (1,2,3)).**
12b90 20 61 66 74 65 72 20 61 20 44 52 4f 50 20 49 4e   after a DROP IN
12ba0 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41 42 4c  DEX or DROP TABL
12bb0 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74  E command..*/.st
12bc0 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
12bd0 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
12be0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
12bf0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
12c00 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
12c10 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12c30 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6e 75   The database nu
12c40 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  mber */.  const 
12c50 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20  char *zType,    
12c60 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22 74 62   /* "idx" or "tb
12c70 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  l" */.  const ch
12c80 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f  ar *zName      /
12c90 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78 20  * Name of index 
12ca0 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  or table */.){. 
12cb0 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
12cc0 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20  char *zDbName = 
12cd0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
12ce0 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 66 6f  iDb].zName;.  fo
12cf0 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b  r(i=1; i<=4; i++
12d00 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62  ){.    char zTab
12d10 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  [24];.    sqlite
12d20 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
12d30 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71  f(zTab),zTab,"sq
12d40 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b  lite_stat%d",i);
12d50 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
12d60 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
12d70 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e  ->db, zTab, zDbN
12d80 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ame) ){.      sq
12d90 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
12da0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
12db0 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
12dc0 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25 51 22  .%s WHERE %s=%Q"
12dd0 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d  ,.        zDbNam
12de0 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20  e, zTab, zType, 
12df0 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
12e00 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
12e10 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
12e20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e  to drop a table.
12e30 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12e40 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61  CodeDropTable(Pa
12e50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
12e60 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44  le *pTab, int iD
12e70 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a  b, int isView){.
12e80 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
12e90 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
12ea0 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72  e->db;.  Trigger
12eb0 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62   *pTrigger;.  Db
12ec0 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
12ed0 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71  [iDb];..  v = sq
12ee0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
12ef0 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
12f00 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  v!=0 );.  sqlite
12f10 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
12f20 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
12f30 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
12f40 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
12f50 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
12f60 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
12f70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12f80 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65  AddOp0(v, OP_VBe
12f90 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  gin);.  }.#endif
12fa0 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20  ..  /* Drop all 
12fb0 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61  triggers associa
12fc0 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
12fd0 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
12fe0 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67  . Code.  ** is g
12ff0 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f  enerated to remo
13000 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
13010 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e  sqlite_master an
13020 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65  d/or.  ** sqlite
13030 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20  _temp_master if 
13040 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20  required..  */. 
13050 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69   pTrigger = sqli
13060 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 70  te3TriggerList(p
13070 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
13080 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
13090 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
130a0 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
130b0 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
130c0 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72 69  || .        pTri
130d0 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  gger->pSchema==d
130e0 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
130f0 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  a );.    sqlite3
13100 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70  DropTriggerPtr(p
13110 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29  Parse, pTrigger)
13120 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  ;.    pTrigger =
13130 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74   pTrigger->pNext
13140 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
13150 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
13160 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65  NCREMENT.  /* Re
13170 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73  move any entries
13180 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   of the sqlite_s
13190 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73  equence table as
131a0 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20  sociated with.  
131b0 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
131c0 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73  ng dropped. This
131d0 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
131e0 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f  the table is dro
131f0 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65  pped.  ** at the
13200 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e   btree level, in
13210 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65   case the sqlite
13220 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
13230 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f  needs to.  ** mo
13240 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ve as a result o
13250 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20  f the drop (can 
13260 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76  happen in auto-v
13270 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a  acuum mode)..  *
13280 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61  /.  if( pTab->ta
13290 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
132a0 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20  increment ){.   
132b0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
132c0 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
132d0 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
132e0 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  Q.sqlite_sequenc
132f0 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  e WHERE name=%Q"
13300 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61  ,.      pDb->zNa
13310 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a  me, pTab->zName.
13320 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69      );.  }.#endi
13330 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  f..  /* Drop all
13340 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
13350 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65  able and index e
13360 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65  ntries that refe
13370 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61  r to the.  ** ta
13380 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d  ble. The program
13390 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f   name loops thro
133a0 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20 74  ugh the master t
133b0 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73  able and deletes
133c0 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20  .  ** every row 
133d0 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
133e0 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61   table of the sa
133f0 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f  me name as the o
13400 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72  ne being.  ** dr
13410 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73 20  opped. Triggers 
13420 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
13430 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20 61  rately because a
13440 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a   trigger can be.
13450 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20    ** created in 
13460 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
13470 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  e that refers to
13480 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74   a table in anot
13490 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  her.  ** databas
134a0 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
134b0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
134c0 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45 4c  rse, .      "DEL
134d0 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
134e0 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  HERE tbl_name=%Q
134f0 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67   and type!='trig
13500 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44 62  ger'",.      pDb
13510 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ->zName, SCHEMA_
13520 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62  TABLE(iDb), pTab
13530 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
13540 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56 69  !isView && !IsVi
13550 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
13560 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28     destroyTable(
13570 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
13580 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
13590 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
135a0 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e  from SQLite's in
135b0 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e  ternal schema an
135c0 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68  d modify.  ** th
135d0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
135e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  .  */.  if( IsVi
135f0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
13600 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13610 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74  dOp4(v, OP_VDest
13620 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  roy, iDb, 0, 0, 
13630 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
13640 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
13650 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44  beAddOp4(v, OP_D
13660 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30  ropTable, iDb, 0
13670 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
13680 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  , 0);.  sqlite3C
13690 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
136a0 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  se, iDb);.  sqli
136b0 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64  teViewResetAll(d
136c0 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  b, iDb);.}../*.*
136d0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
136e0 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74  s called to do t
136f0 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f  he work of a DRO
13700 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  P TABLE statemen
13710 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74  t..** pName is t
13720 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
13730 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70  able to be dropp
13740 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
13750 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72  te3DropTable(Par
13760 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
13770 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
13780 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72  isView, int noEr
13790 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  r){.  Table *pTa
137a0 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
137b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
137c0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
137d0 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  iDb;..  if( db->
137e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
137f0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
13800 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
13810 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
13820 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73  nErr==0 );.  ass
13830 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
13840 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e 6f 45  ==1 );.  if( noE
13850 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73  rr ) db->suppres
13860 73 45 72 72 2b 2b 3b 0a 20 20 70 54 61 62 20 3d  sErr++;.  pTab =
13870 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
13880 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
13890 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e  isView, &pName->
138a0 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45  a[0]);.  if( noE
138b0 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73  rr ) db->suppres
138c0 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70  sErr--;..  if( p
138d0 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Tab==0 ){.    if
138e0 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65  ( noErr ) sqlite
138f0 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64  3CodeVerifyNamed
13900 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70  Schema(pParse, p
13910 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
13920 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  base);.    goto 
13930 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
13940 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
13950 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
13960 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
13970 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ema);.  assert( 
13980 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
13990 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49  ->nDb );..  /* I
139a0 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74  f pTab is a virt
139b0 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20  ual table, call 
139c0 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
139d0 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20  es() to ensure. 
139e0 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61   ** it is initia
139f0 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  lized..  */.  if
13a00 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
13a10 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77  ) && sqlite3View
13a20 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
13a30 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
13a40 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
13a50 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69  op_table;.  }.#i
13a60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13a70 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
13a80 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
13a90 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
13aa0 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
13ab0 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
13ac0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
13ad0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
13ae0 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
13af0 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b  char *zArg2 = 0;
13b00 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13b10 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
13b20 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
13b30 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b   zTab, 0, zDb)){
13b40 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
13b50 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
13b60 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
13b70 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
13b80 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
13b90 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
13ba0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
13bb0 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ROP_TEMP_VIEW;. 
13bc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13bd0 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
13be0 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20  E_DROP_VIEW;.   
13bf0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
13c00 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
13c10 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20  TABLE.    }else 
13c20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
13c30 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ab) ){.      cod
13c40 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
13c50 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41  VTABLE;.      zA
13c60 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74  rg2 = sqlite3Get
13c70 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
13c80 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23  ->pMod->zName;.#
13c90 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
13ca0 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
13cb0 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
13cc0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
13cd0 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
13ce0 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
13cf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13d00 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
13d10 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ROP_TABLE;.     
13d20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
13d30 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
13d40 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
13d50 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72  pTab->zName, zAr
13d60 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  g2, zDb) ){.    
13d70 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
13d80 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
13d90 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
13da0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
13db0 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54  QLITE_DELETE, pT
13dc0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  ab->zName, 0, zD
13dd0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
13de0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
13df0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
13e00 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  if.  if( sqlite3
13e10 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
13e20 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
13e30 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20 73   7)==0 .    && s
13e40 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
13e50 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
13e60 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21 3d  ite_stat", 11)!=
13e70 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
13e80 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13e90 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
13ea0 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
13eb0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
13ec0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
13ed0 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66  _table;.  }..#if
13ee0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13ef0 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72  _VIEW.  /* Ensur
13f00 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20  e DROP TABLE is 
13f10 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69  not used on a vi
13f20 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45  ew, and DROP VIE
13f30 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20  W is not used.  
13f40 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20  ** on a table.. 
13f50 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77   */.  if( isView
13f60 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
13f70 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
13f80 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13f90 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41  se, "use DROP TA
13fa0 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61  BLE to delete ta
13fb0 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  ble %s", pTab->z
13fc0 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
13fd0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
13fe0 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69  .  }.  if( !isVi
13ff0 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
14000 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
14010 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
14020 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45  e, "use DROP VIE
14030 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77  W to delete view
14040 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
14050 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
14060 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
14070 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
14080 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
14090 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  remove the table
140a0 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
140b0 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64   table.  ** on d
140c0 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  isk..  */.  v = 
140d0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
140e0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
140f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
14100 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
14110 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
14120 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c  );.    sqlite3Cl
14130 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50  earStatTables(pP
14140 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62 6c 22  arse, iDb, "tbl"
14150 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
14160 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72 6f      sqlite3FkDro
14170 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  pTable(pParse, p
14180 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20 20  Name, pTab);.   
14190 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70   sqlite3CodeDrop
141a0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
141b0 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77 29  ab, iDb, isView)
141c0 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70  ;.  }..exit_drop
141d0 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65  _table:.  sqlite
141e0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
141f0 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  b, pName);.}../*
14200 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14210 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72   is called to cr
14220 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69  eate a new forei
14230 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61  gn key on the ta
14240 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ble.** currently
14250 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
14260 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64  ion.  pFromCol d
14270 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
14280 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
14290 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
142a0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72  point to the for
142b0 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46  eign key.  If pF
142c0 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a  romCol==0 then.*
142d0 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65  * connect the ke
142e0 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f  y to the last co
142f0 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20  lumn inserted.  
14300 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20  pTo is the name 
14310 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  of.** the table 
14320 72 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e 6b  referred to (a.k
14330 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74 22 20  .a the "parent" 
14340 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c 20  table).  pToCol 
14350 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66 20  is a list.** of 
14360 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 61  tables in the pa
14370 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e 20  rent pTo table. 
14380 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20   flags contains 
14390 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  all.** informati
143a0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  on about the con
143b0 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
143c0 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63   algorithms spec
143d0 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ified.** in the 
143e0 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50  ON DELETE, ON UP
143f0 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45  DATE and ON INSE
14400 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  RT clauses..**.*
14410 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74  * An FKey struct
14420 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ure is created a
14430 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
14440 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a  table currently.
14450 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ** under constru
14460 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61  ction in the pPa
14470 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66  rse->pNewTable f
14480 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ield..**.** The 
14490 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73  foreign key is s
144a0 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45  et for IMMEDIATE
144b0 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20   processing.  A 
144c0 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
144d0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66  ** to sqlite3Def
144e0 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d  erForeignKey() m
144f0 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73  ight change this
14500 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f   to DEFERRED..*/
14510 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
14520 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20  ateForeignKey(. 
14530 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14540 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
14550 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
14560 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c  prList *pFromCol
14570 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e  ,  /* Columns in
14580 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74   this table that
14590 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20   point to other 
145a0 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  table */.  Token
145b0 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20   *pTo,          
145c0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
145d0 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
145e0 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c  ExprList *pToCol
145f0 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ,    /* Columns 
14600 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  in the other tab
14610 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
14620 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
14630 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  Conflict resolut
14640 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20  ion algorithms. 
14650 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
14660 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
14670 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
14680 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
14690 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20  Y.  FKey *pFKey 
146a0 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65  = 0;.  FKey *pNe
146b0 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70  xtTo;.  Table *p
146c0 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
146d0 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74  able;.  int nByt
146e0 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
146f0 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a  t nCol;.  char *
14700 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  z;..  assert( pT
14710 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  o!=0 );.  if( p=
14720 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45  =0 || IN_DECLARE
14730 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f  _VTAB ) goto fk_
14740 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  end;.  if( pFrom
14750 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Col==0 ){.    in
14760 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c  t iCol = p->nCol
14770 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  -1;.    if( NEVE
14780 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f  R(iCol<0) ) goto
14790 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28   fk_end;.    if(
147a0 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
147b0 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  l->nExpr!=1 ){. 
147c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
147d0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f  rMsg(pParse, "fo
147e0 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22  reign key on %s"
147f0 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75  .         " shou
14800 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  ld reference onl
14810 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  y one column of 
14820 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20  table %T",.     
14830 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c      p->aCol[iCol
14840 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20  ].zName, pTo);. 
14850 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
14860 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c  ;.    }.    nCol
14870 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
14880 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
14890 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d  ol->nExpr!=pFrom
148a0 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  Col->nExpr ){.  
148b0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
148c0 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
148d0 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c    "number of col
148e0 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20  umns in foreign 
148f0 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
14900 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
14910 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75   ".        "colu
14920 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  mns in the refer
14930 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20  enced table");. 
14940 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
14950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
14960 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  l = pFromCol->nE
14970 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  xpr;.  }.  nByte
14980 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79   = sizeof(*pFKey
14990 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a  ) + (nCol-1)*siz
149a0 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  eof(pFKey->aCol[
149b0 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31  0]) + pTo->n + 1
149c0 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  ;.  if( pToCol )
149d0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
149e0 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20  <pToCol->nExpr; 
149f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  i++){.      nByt
14a00 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
14a10 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  en30(pToCol->a[i
14a20 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ].zName) + 1;.  
14a30 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20    }.  }.  pFKey 
14a40 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
14a50 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20  cZero(db, nByte 
14a60 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d  );.  if( pFKey==
14a70 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  0 ){.    goto fk
14a80 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65  _end;.  }.  pFKe
14a90 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20  y->pFrom = p;.  
14aa0 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
14ab0 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a   = p->pFKey;.  z
14ac0 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79   = (char*)&pFKey
14ad0 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20  ->aCol[nCol];.  
14ae0 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a  pFKey->zTo = z;.
14af0 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d    memcpy(z, pTo-
14b00 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a  >z, pTo->n);.  z
14b10 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  [pTo->n] = 0;.  
14b20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
14b30 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e  );.  z += pTo->n
14b40 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f  +1;.  pFKey->nCo
14b50 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20  l = nCol;.  if( 
14b60 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
14b70 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30     pFKey->aCol[0
14b80 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f  ].iFrom = p->nCo
14b90 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l-1;.  }else{.  
14ba0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
14bb0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
14bc0 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
14bd0 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20  j=0; j<p->nCol; 
14be0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
14bf0 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
14c00 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  (p->aCol[j].zNam
14c10 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69  e, pFromCol->a[i
14c20 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
14c30 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
14c40 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[i].iFrom = 
14c50 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  j;.          bre
14c60 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
14c70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
14c80 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  j>=p->nCol ){.  
14c90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
14ca0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
14cb0 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77           "unknow
14cc0 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20  n column \"%s\" 
14cd0 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
14ce0 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20  efinition", .   
14cf0 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d         pFromCol-
14d00 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
14d10 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
14d20 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
14d30 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f  .  }.  if( pToCo
14d40 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
14d50 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
14d60 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
14d70 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54  lite3Strlen30(pT
14d80 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
14d90 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  );.      pFKey->
14da0 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a  aCol[i].zCol = z
14db0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
14dc0 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  , pToCol->a[i].z
14dd0 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Name, n);.      
14de0 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[n] = 0;.      
14df0 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a  z += n+1;.    }.
14e00 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44    }.  pFKey->isD
14e10 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70  eferred = 0;.  p
14e20 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d  FKey->aAction[0]
14e30 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26 20   = (u8)(flags & 
14e40 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20 20  0xff);          
14e50 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61    /* ON DELETE a
14e60 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79  ction */.  pFKey
14e70 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28  ->aAction[1] = (
14e80 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38 20  u8)((flags >> 8 
14e90 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f 2a  ) & 0xff);    /*
14ea0 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f   ON UPDATE actio
14eb0 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  n */..  assert( 
14ec0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
14ed0 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d  exHeld(db, 0, p-
14ee0 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 70  >pSchema) );.  p
14ef0 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a  NextTo = (FKey *
14f00 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65  )sqlite3HashInse
14f10 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e  rt(&p->pSchema->
14f20 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20 20  fkeyHash, .     
14f30 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f   pFKey->zTo, (vo
14f40 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a  id *)pFKey.  );.
14f50 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70    if( pNextTo==p
14f60 46 4b 65 79 20 29 7b 0a 20 20 20 20 64 62 2d 3e  FKey ){.    db->
14f70 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
14f80 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
14f90 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65  d;.  }.  if( pNe
14fa0 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65  xtTo ){.    asse
14fb0 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72  rt( pNextTo->pPr
14fc0 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70  evTo==0 );.    p
14fd0 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
14fe0 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65  pNextTo;.    pNe
14ff0 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20  xtTo->pPrevTo = 
15000 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pFKey;.  }..  /*
15010 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67   Link the foreig
15020 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62  n key to the tab
15030 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73  le as the last s
15040 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  tep..  */.  p->p
15050 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20  FKey = pFKey;.  
15060 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65  pFKey = 0;..fk_e
15070 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  nd:.  sqlite3DbF
15080 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a  ree(db, pFKey);.
15090 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
150a0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
150b0 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20  OREIGN_KEY) */. 
150c0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
150d0 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d  Delete(db, pFrom
150e0 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Col);.  sqlite3E
150f0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
15100 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  , pToCol);.}../*
15110 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
15120 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
15130 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
15140 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
15150 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
15160 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
15170 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
15180 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
15190 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
151a0 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
151b0 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
151c0 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
151d0 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
151e0 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
151f0 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
15200 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
15210 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
15220 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
15230 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
15240 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
15250 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
15260 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
15270 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a  nt isDeferred){.
15280 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15290 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
152a0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
152b0 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
152c0 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72  if( (pTab = pPar
152d0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
152e0 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54  0 || (pFKey = pT
152f0 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20  ab->pFKey)==0 ) 
15300 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
15310 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20  ( isDeferred==0 
15320 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31  || isDeferred==1
15330 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33   ); /* EV: R-303
15340 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46  23-21917 */.  pF
15350 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
15360 3d 20 28 75 38 29 69 73 44 65 66 65 72 72 65 64  = (u8)isDeferred
15370 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
15380 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
15390 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20  that will erase 
153a0 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78  and refill index
153b0 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73   *pIdx.  This is
153c0 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74  .** used to init
153d0 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63  ialize a newly c
153e0 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20  reated index or 
153f0 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65  to recompute the
15400 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  .** content of a
15410 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f  n index in respo
15420 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58  nse to a REINDEX
15430 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
15440 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  if memRootPage i
15450 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20  s not negative, 
15460 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
15470 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79  e index is newly
15480 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68  .** created.  Th
15490 65 20 72 65 67 69 73 74 65 72 20 73 70 65 63 69  e register speci
154a0 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50  fied by memRootP
154b0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  age contains the
154c0 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  .** root page nu
154d0 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
154e0 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61  x.  If memRootPa
154f0 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
15500 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65  then.** the inde
15510 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
15520 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65   and must be cle
15530 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
15540 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a  g refilled and.*
15550 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
15560 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
15570 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  dex is taken fro
15580 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a  m pIndex->tnum..
15590 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
155a0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
155b0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
155c0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
155d0 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29  int memRootPage)
155e0 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
155f0 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
15600 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  ;  /* The table 
15610 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20  that is indexed 
15620 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
15630 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
15640 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
15650 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61  sor used for pTa
15660 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  b */.  int iIdx 
15670 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
15680 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
15690 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
156a0 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  Index */.  int i
156b0 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20 20 20  Sorter;         
156c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
156d0 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 4f 70  sor opened by Op
156e0 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69 6e 20  enSorter (if in 
156f0 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64  use) */.  int ad
15700 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
15710 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
15720 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f  ess of top of lo
15730 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
15740 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
15750 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
15760 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72  s to jump to for
15770 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
15780 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20  */.  int tnum;  
15790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
157a0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
157b0 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   of index */.  i
157c0 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c  nt iPartIdxLabel
157d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
157e0 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61   Jump to this la
157f0 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20 72 6f  bel to skip a ro
15800 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  w */.  Vdbe *v; 
15810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15820 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
15830 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
15840 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
15850 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
15860 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
15870 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20       /* KeyInfo 
15880 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  for index */.  i
15890 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20  nt regRecord;   
158a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
158b0 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
158c0 67 20 61 73 73 65 6d 62 6c 65 64 20 69 6e 64 65  g assembled inde
158d0 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
158e0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
158f0 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20  se->db;      /* 
15900 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
15910 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
15920 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
15930 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
15940 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
15950 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
15960 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
15970 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74  TION.  if( sqlit
15980 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
15990 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44  se, SQLITE_REIND
159a0 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  EX, pIndex->zNam
159b0 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e  e, 0,.      db->
159c0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29  aDb[iDb].zName )
159d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
159e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
159f0 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65   Require a write
15a00 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62  -lock on the tab
15a10 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  le to perform th
15a20 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  is operation */.
15a30 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
15a40 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
15a50 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70  pTab->tnum, 1, p
15a60 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
15a70 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
15a80 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
15a90 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
15aa0 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61  .  if( memRootPa
15ab0 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75  ge>=0 ){.    tnu
15ac0 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b  m = memRootPage;
15ad0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e  .  }else{.    tn
15ae0 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  um = pIndex->tnu
15af0 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20  m;.  }.  pKey = 
15b00 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
15b10 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
15b20 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  ndex);..  /* Ope
15b30 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72  n the sorter cur
15b40 73 6f 72 20 69 66 20 77 65 20 61 72 65 20 74 6f  sor if we are to
15b50 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69   use one. */.  i
15b60 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d  Sorter = pParse-
15b70 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74  >nTab++;.  sqlit
15b80 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
15b90 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69  OP_SorterOpen, i
15ba0 53 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e 64 65  Sorter, 0, pInde
15bb0 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63 68 61  x->nKeyCol, (cha
15bc0 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  r*).            
15bd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b          sqlite3K
15be0 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 29 2c  eyInfoRef(pKey),
15bf0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20   P4_KEYINFO);.. 
15c00 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 62   /* Open the tab
15c10 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68  le. Loop through
15c20 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65   all rows of the
15c30 20 74 61 62 6c 65 2c 20 69 6e 73 65 72 74 69 6e   table, insertin
15c40 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65 63  g index.  ** rec
15c50 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20 73 6f  ords into the so
15c60 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  rter. */.  sqlit
15c70 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
15c80 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70  se, iTab, iDb, p
15c90 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64  Tab, OP_OpenRead
15ca0 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c  );.  addr1 = sql
15cb0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15cc0 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  , OP_Rewind, iTa
15cd0 62 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  b, 0); VdbeCover
15ce0 61 67 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63  age(v);.  regRec
15cf0 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
15d00 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
15d10 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72  ..  sqlite3Gener
15d20 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72  ateIndexKey(pPar
15d30 73 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c 72  se,pIndex,iTab,r
15d40 65 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61 72  egRecord,0,&iPar
15d50 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a  tIdxLabel,0,0);.
15d60 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15d70 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
15d80 49 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72 2c  Insert, iSorter,
15d90 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73   regRecord);.  s
15da0 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72  qlite3ResolvePar
15db0 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65  tIdxLabel(pParse
15dc0 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 29  , iPartIdxLabel)
15dd0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
15de0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
15df0 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29  , iTab, addr1+1)
15e00 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
15e10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15e20 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
15e30 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f  1);.  if( memRoo
15e40 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74 65  tPage<0 ) sqlite
15e50 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15e60 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69  P_Clear, tnum, i
15e70 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  Db);.  sqlite3Vd
15e80 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f  beAddOp4(v, OP_O
15e90 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20  penWrite, iIdx, 
15ea0 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20  tnum, iDb, .    
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ec0 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34  (char *)pKey, P4
15ed0 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c  _KEYINFO);.  sql
15ee0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
15ef0 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43  (v, OPFLAG_BULKC
15f00 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65  SR|((memRootPage
15f10 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53  >=0)?OPFLAG_P2IS
15f20 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64 72  REG:0));..  addr
15f30 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
15f40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
15f50 65 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c  erSort, iSorter,
15f60 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   0); VdbeCoverag
15f70 65 28 76 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e(v);.  assert( 
15f80 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  pKey!=0 || db->m
15f90 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70  allocFailed || p
15fa0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20  Parse->nErr );. 
15fb0 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64   if( IsUniqueInd
15fc0 65 78 28 70 49 6e 64 65 78 29 20 26 26 20 70 4b  ex(pIndex) && pK
15fd0 65 79 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ey!=0 ){.    int
15fe0 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j2 = sqlite3Vdb
15ff0 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20  eCurrentAddr(v) 
16000 2b 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  + 3;.    sqlite3
16010 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
16020 5f 47 6f 74 6f 2c 20 30 2c 20 6a 32 29 3b 0a 20  _Goto, 0, j2);. 
16030 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
16040 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
16050 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
16060 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
16070 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61  , OP_SorterCompa
16080 72 65 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32 2c  re, iSorter, j2,
16090 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20   regRecord,.    
160a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160b0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65       pIndex->nKe
160c0 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  yCol); VdbeCover
160d0 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
160e0 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61  te3UniqueConstra
160f0 69 6e 74 28 70 50 61 72 73 65 2c 20 4f 45 5f 41  int(pParse, OE_A
16100 62 6f 72 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20  bort, pIndex);. 
16110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
16120 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
16130 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
16140 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
16150 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  AddOp3(v, OP_Sor
16160 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74 65 72  terData, iSorter
16170 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 69 49 64  , regRecord, iId
16180 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  x);.  sqlite3Vdb
16190 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4c 61  eAddOp3(v, OP_La
161a0 73 74 2c 20 69 49 64 78 2c 20 30 2c 20 2d 31 29  st, iIdx, 0, -1)
161b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
161c0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp3(v, OP_IdxI
161d0 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67  nsert, iIdx, reg
161e0 52 65 63 6f 72 64 2c 20 30 29 3b 0a 20 20 73 71  Record, 0);.  sq
161f0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
16200 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
16210 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
16220 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16230 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
16240 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
16250 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16260 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53  P_SorterNext, iS
16270 6f 72 74 65 72 2c 20 61 64 64 72 32 29 3b 20 56  orter, addr2); V
16280 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
16290 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
162a0 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
162b0 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ..  sqlite3VdbeA
162c0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
162d0 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69  e, iTab);.  sqli
162e0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
162f0 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29   OP_Close, iIdx)
16300 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16310 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
16320 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a  e, iSorter);.}..
16330 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68  /*.** Allocate h
16340 65 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c  eap space to hol
16350 64 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63  d an Index objec
16360 74 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75  t with nCol colu
16370 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65  mns..**.** Incre
16380 61 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  ase the allocati
16390 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69  on size to provi
163a0 64 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74  de an extra nExt
163b0 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38  ra bytes.** of 8
163c0 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70  -byte aligned sp
163d0 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e  ace after the In
163e0 64 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  dex object and r
163f0 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74  eturn a.** point
16400 65 72 20 74 6f 20 74 68 69 73 20 65 78 74 72 61  er to this extra
16410 20 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74   space in *ppExt
16420 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  ra..*/.Index *sq
16430 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64  lite3AllocateInd
16440 65 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69  exObject(.  sqli
16450 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
16460 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
16470 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36  nection */.  i16
16480 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   nCol,          
16490 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
164a0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
164b0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
164c0 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
164d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
164e0 20 62 79 74 65 73 20 6f 66 20 65 78 74 72 61 20   bytes of extra 
164f0 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a  space to alloc *
16500 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74  /.  char **ppExt
16510 72 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ra       /* Poin
16520 74 65 72 20 74 6f 20 74 68 65 20 22 65 78 74 72  ter to the "extr
16530 61 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20  a" space */.){. 
16540 20 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20   Index *p;      
16550 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
16560 65 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ed index object 
16570 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
16580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
16590 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
165a0 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61  Index object + a
165b0 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74  rrays */..  nByt
165c0 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e = ROUND8(sizeo
165d0 66 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20  f(Index)) +     
165e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
165f0 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a  x structure  */.
16600 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38            ROUND8
16610 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e  (sizeof(char*)*n
16620 43 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f  Col) +         /
16630 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20  * Index.azColl  
16640 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
16650 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f  ROUND8(sizeof(Lo
16660 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b  gEst)*(nCol+1) +
16670 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
16680 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20  RowLogEst   */. 
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166a0 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c  sizeof(i16)*nCol
166b0 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   +            /*
166c0 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20   Index.aiColumn 
166d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
166e0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29        sizeof(u8)
166f0 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20  *nCol);         
16700 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f      /* Index.aSo
16710 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d  rtOrder */.  p =
16720 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
16730 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b  Zero(db, nByte +
16740 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
16750 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70  p ){.    char *p
16760 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29  Extra = ((char*)
16770 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)+ROUND8(sizeof
16780 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d  (Index));.    p-
16790 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a  >azColl = (char*
167a0 2a 29 70 45 78 74 72 61 3b 20 20 20 20 20 20 20  *)pExtra;       
167b0 70 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38  pExtra += ROUND8
167c0 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e  (sizeof(char*)*n
167d0 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52  Col);.    p->aiR
167e0 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45  owLogEst = (LogE
167f0 73 74 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74  st*)pExtra; pExt
16800 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67  ra += sizeof(Log
16810 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20  Est)*(nCol+1);. 
16820 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d     p->aiColumn =
16830 20 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20   (i16*)pExtra;  
16840 20 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73       pExtra += s
16850 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b  izeof(i16)*nCol;
16860 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64  .    p->aSortOrd
16870 65 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61  er = (u8*)pExtra
16880 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e  ;.    p->nColumn
16890 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e   = nCol;.    p->
168a0 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d  nKeyCol = nCol -
168b0 20 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61   1;.    *ppExtra
168c0 20 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20   = ((char*)p) + 
168d0 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74  nByte;.  }.  ret
168e0 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
168f0 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64  Create a new ind
16900 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61  ex for an SQL ta
16910 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61  ble.  pName1.pNa
16920 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20  me2 is the name 
16930 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  of the index .**
16940 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73   and pTblList is
16950 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
16960 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
16970 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42  o be indexed.  B
16980 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20  oth will .** be 
16990 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61  NULL for a prima
169a0 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64  ry key or an ind
169b0 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ex that is creat
169c0 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a  ed to satisfy a.
169d0 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
169e0 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65  aint.  If pTable
169f0 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20   and pIndex are 
16a00 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65  NULL, use pParse
16a10 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61  ->pNewTable.** a
16a20 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  s the table to b
16a30 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72  e indexed.  pPar
16a40 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73  se->pNewTable is
16a50 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73   a table that is
16a60 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65  .** currently be
16a70 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
16a80 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  by a CREATE TABL
16a90 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
16aa0 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  ** pList is a li
16ab0 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
16ac0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
16ad0 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
16ae0 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61   if this.** is a
16af0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
16b00 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e  unique-constrain
16b10 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
16b20 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  cent column adde
16b30 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  d.** to the tabl
16b40 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
16b50 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
16b60 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69   .**.** If the i
16b70 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
16b80 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 72 65  successfully, re
16b90 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
16ba0 6f 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 0a  o the new Index.
16bb0 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  ** structure. Th
16bc0 69 73 20 69 73 20 75 73 65 64 20 62 79 20 73 71  is is used by sq
16bd0 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b  lite3AddPrimaryK
16be0 65 79 28 29 20 74 6f 20 6d 61 72 6b 20 74 68 65  ey() to mark the
16bf0 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68 65   index.** as the
16c00 20 74 61 62 6c 65 73 20 70 72 69 6d 61 72 79 20   tables primary 
16c10 6b 65 79 20 28 49 6e 64 65 78 2e 69 64 78 54 79  key (Index.idxTy
16c20 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe==SQLITE_IDXTY
16c30 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 0a 2a  PE_PRIMARYKEY).*
16c40 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
16c50 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
16c60 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
16c70 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
16c80 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
16c90 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
16ca0 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
16cb0 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69   First part of i
16cc0 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
16cd0 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  e NULL */.  Toke
16ce0 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
16cf0 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
16d00 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
16d10 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72   be NULL */.  Sr
16d20 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c  cList *pTblName,
16d30 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64   /* Table to ind
16d40 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e  ex. Use pParse->
16d50 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
16d60 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
16d70 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
16d80 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
16d90 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
16da0 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
16db0 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
16dc0 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
16dd0 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
16de0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
16df0 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  art,     /* The 
16e00 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
16e10 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73 74  t begins this st
16e20 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  atement */.  Exp
16e30 72 20 2a 70 50 49 57 68 65 72 65 2c 20 20 20 20  r *pPIWhere,    
16e40 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
16e50 66 6f 72 20 70 61 72 74 69 61 6c 20 69 6e 64 69  for partial indi
16e60 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ces */.  int sor
16e70 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53  tOrder,     /* S
16e80 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69  ort order of pri
16e90 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c  mary key when pL
16ea0 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69  ist==NULL */.  i
16eb0 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20  nt ifNotExist   
16ec0 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20    /* Omit error 
16ed0 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  if index already
16ee0 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
16ef0 49 6e 64 65 78 20 2a 70 52 65 74 20 3d 20 30 3b  Index *pRet = 0;
16f00 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
16f10 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 54  to return */.  T
16f20 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
16f30 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
16f40 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
16f50 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
16f60 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  0;   /* The inde
16f70 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  x to be created 
16f80 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
16f90 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d   = 0;     /* Nam
16fa0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a  e of the index *
16fb0 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
16fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16fd0 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
16fe0 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69   in zName */.  i
16ff0 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62 46 69 78  nt i, j;.  DbFix
17000 65 72 20 73 46 69 78 3b 20 20 20 20 20 20 20 20  er sFix;        
17010 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67  /* For assigning
17020 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20   database names 
17030 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69  to pTable */.  i
17040 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b  nt sortOrderMask
17050 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f  ;   /* 1 to hono
17060 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e  r DESC in index.
17070 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a    0 to ignore. *
17080 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
17090 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
170a0 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
170b0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63       /* The spec
170c0 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61  ific table conta
170d0 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65  ining the indexe
170e0 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  d database */.  
170f0 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
17100 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
17110 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
17120 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  at is being writ
17130 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ten */.  Token *
17140 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a  pName = 0;    /*
17150 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
17160 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74  e of the index t
17170 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74  o create */.  st
17180 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
17190 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f  em *pListItem; /
171a0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
171b0 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 63 6f  er pList */.  co
171c0 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62  nst Column *pTab
171d0 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Col;           /
171e0 2a 20 41 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  * A column in th
171f0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  e table */.  int
17200 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20   nExtra = 0;    
17210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17220 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   Space allocated
17230 20 66 6f 72 20 7a 45 78 74 72 61 5b 5d 20 2a 2f   for zExtra[] */
17240 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 43 6f 6c  .  int nExtraCol
17250 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17260 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17270 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e   extra columns n
17280 65 65 64 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eeded */.  char 
17290 2a 7a 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20  *zExtra = 0;    
172a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
172b0 78 74 72 61 20 73 70 61 63 65 20 61 66 74 65 72  xtra space after
172c0 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
172d0 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  t */.  Index *pP
172e0 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50  k = 0;      /* P
172f0 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
17300 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
17310 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20  ID tables */..  
17320 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
17330 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 20 20 20  nErr==0 );      
17340 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20  /* Never called 
17350 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72  with prior error
17360 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d  s */.  if( db->m
17370 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49  allocFailed || I
17380 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
17390 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
173a0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
173b0 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  }.  if( SQLITE_O
173c0 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
173d0 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
173e0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
173f0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
17400 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
17410 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
17420 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
17430 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69    Return early i
17440 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  f not found..  *
17450 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65  /.  if( pTblName
17460 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55  !=0 ){..    /* U
17470 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20  se the two-part 
17480 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65  index name to de
17490 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61  termine the data
174a0 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20  base .    ** to 
174b0 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74  search for the t
174c0 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20  able. 'Fix' the 
174d0 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
174e0 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66  is db.    ** bef
174f0 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74  ore looking up t
17500 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  he table..    */
17510 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
17520 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b  me1 && pName2 );
17530 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
17540 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
17550 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
17560 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
17570 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67     if( iDb<0 ) g
17580 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
17590 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72  index;.    asser
175a0 74 28 20 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d  t( pName && pNam
175b0 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66  e->z );..#ifndef
175c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d   SQLITE_OMIT_TEM
175d0 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  PDB.    /* If th
175e0 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73  e index name was
175f0 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68   unqualified, ch
17600 65 63 6b 20 69 66 20 74 68 65 20 74 61 62 6c 65  eck if the table
17610 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d  .    ** is a tem
17620 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20  p table. If so, 
17630 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
17640 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f   to 1. Do not do
17650 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20   this.    ** if 
17660 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64  initialising a d
17670 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a  atabase schema..
17680 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
17690 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
176a0 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71  .      pTab = sq
176b0 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b  lite3SrcListLook
176c0 75 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e  up(pParse, pTblN
176d0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
176e0 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20  pName2->n==0 && 
176f0 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53  pTab && pTab->pS
17700 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
17710 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ].pSchema ){.   
17720 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20       iDb = 1;.  
17730 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
17740 69 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46  if..    sqlite3F
17750 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
17760 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65  arse, iDb, "inde
17770 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  x", pName);.    
17780 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 72  if( sqlite3FixSr
17790 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62  cList(&sFix, pTb
177a0 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  lName) ){.      
177b0 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 70  /* Because the p
177c0 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73  arser constructs
177d0 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61   pTblName from a
177e0 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69   single identifi
177f0 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  er,.      ** sql
17800 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 20 63  ite3FixSrcList c
17810 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a  an never fail. *
17820 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30  /.      assert(0
17830 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61  );.    }.    pTa
17840 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
17850 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73  eTableItem(pPars
17860 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d  e, 0, &pTblName-
17870 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65  >a[0]);.    asse
17880 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
17890 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d  iled==0 || pTab=
178a0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  =0 );.    if( pT
178b0 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  ab==0 ) goto exi
178c0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
178d0 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 26      if( iDb==1 &
178e0 26 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  & db->aDb[iDb].p
178f0 53 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53  Schema!=pTab->pS
17900 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73  chema ){.      s
17910 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
17920 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
17930 20 20 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74     "cannot creat
17940 65 20 61 20 54 45 4d 50 20 69 6e 64 65 78 20 6f  e a TEMP index o
17950 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65  n non-TEMP table
17960 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20   \"%s\"",.      
17970 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
17980 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  );.      goto ex
17990 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
179a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
179b0 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
179c0 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72   pPk = sqlite3Pr
179d0 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54  imaryKeyIndex(pT
179e0 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ab);.  }else{.  
179f0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
17a00 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
17a10 28 20 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20  ( pStart==0 );. 
17a20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72 73 65     pTab = pParse
17a30 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20  ->pNewTable;.   
17a40 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74   if( !pTab ) got
17a50 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
17a60 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  dex;.    iDb = s
17a70 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
17a80 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
17a90 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44  chema);.  }.  pD
17aa0 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
17ab0 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  ];..  assert( pT
17ac0 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ab!=0 );.  asser
17ad0 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
17ae0 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =0 );.  if( sqli
17af0 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62  te3StrNICmp(pTab
17b00 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  ->zName, "sqlite
17b10 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20  _", 7)==0 .     
17b20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75    && db->init.bu
17b30 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c 49 54 45  sy==0.#if SQLITE
17b40 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
17b50 54 49 4f 4e 0a 20 20 20 20 20 20 20 26 26 20 73  TION.       && s
17b60 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61  qlite3UserAuthTa
17b70 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  ble(pTab->zName)
17b80 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ==0.#endif.     
17b90 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
17ba0 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d  ICmp(&pTab->zNam
17bb0 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22  e[7],"altertab_"
17bc0 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  ,9)!=0 ){.    sq
17bd0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
17be0 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
17bf0 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
17c00 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ed", pTab->zName
17c10 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
17c20 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
17c30 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
17c40 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66  E_OMIT_VIEW.  if
17c50 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
17c60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
17c70 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
17c80 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65  views may not be
17c90 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
17ca0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
17cb0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
17cc0 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
17cd0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
17ce0 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74  BLE.  if( IsVirt
17cf0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
17d00 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
17d10 28 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61  (pParse, "virtua
17d20 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74  l tables may not
17d30 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
17d40 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
17d50 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
17d60 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  endif..  /*.  **
17d70 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f   Find the name o
17d80 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61  f the index.  Ma
17d90 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73  ke sure there is
17da0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f   not already ano
17db0 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ther.  ** index 
17dc0 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  or table with th
17dd0 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20  e same name.  . 
17de0 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69   **.  ** Excepti
17df0 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72  on:  If we are r
17e00 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73  eading the names
17e10 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e   of permanent in
17e20 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20  dices from the. 
17e30 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65   ** sqlite_maste
17e40 72 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65  r table (because
17e50 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
17e60 65 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20  ess changed the 
17e70 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a  schema) and.  **
17e80 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65   one of the inde
17e90 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73  x names collides
17ea0 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f   with the name o
17eb0 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  f a temporary ta
17ec0 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65  ble or.  ** inde
17ed0 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  x, then we will 
17ee0 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63  continue to proc
17ef0 65 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a  ess this index..
17f00 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61    **.  ** If pNa
17f10 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
17f20 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20  hat we are.  ** 
17f30 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70  dealing with a p
17f40 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e  rimary key or UN
17f50 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
17f60 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76    We have to inv
17f70 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e  ent our.  ** own
17f80 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   name..  */.  if
17f90 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
17fa0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
17fb0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
17fc0 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
17fd0 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20  zName==0 ) goto 
17fe0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
17ff0 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
18000 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  Name->z!=0 );.  
18010 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
18020 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
18030 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
18040 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
18050 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
18060 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
18070 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
18080 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66  busy ){.      if
18090 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
180a0 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
180b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
180c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
180d0 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73  Parse, "there is
180e0 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65   already a table
180f0 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d   named %s", zNam
18100 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
18110 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18120 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
18130 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
18140 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
18150 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65  Name, pDb->zName
18160 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
18170 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b  ( !ifNotExist ){
18180 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18190 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
181a0 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61   "index %s alrea
181b0 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d  dy exists", zNam
181c0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
181d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
181e0 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
181f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
18200 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
18210 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
18220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
18230 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18240 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
18250 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  else{.    int n;
18260 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f  .    Index *pLoo
18270 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  p;.    for(pLoop
18280 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e  =pTab->pIndex, n
18290 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =1; pLoop; pLoop
182a0 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e  =pLoop->pNext, n
182b0 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20  ++){}.    zName 
182c0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
182d0 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  (db, "sqlite_aut
182e0 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 70  oindex_%s_%d", p
182f0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a  Tab->zName, n);.
18300 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
18310 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
18320 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18330 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
18340 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68  * Check for auth
18350 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65  orization to cre
18360 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20  ate an index..  
18370 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
18380 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
18390 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e  TION.  {.    con
183a0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70  st char *zDb = p
183b0 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db->zName;.    i
183c0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
183d0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
183e0 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
183f0 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c  A_TABLE(iDb), 0,
18400 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
18410 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18420 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
18430 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
18440 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  TE_INDEX;.    if
18450 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
18460 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53  & iDb==1 ) i = S
18470 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
18480 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
18490 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
184a0 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61  k(pParse, i, zNa
184b0 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
184c0 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
184d0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
184e0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
184f0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
18500 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65   pList==0, it me
18510 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ans this routine
18520 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d   was called to m
18530 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20  ake a primary.  
18540 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68  ** key out of th
18550 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64  e last column ad
18560 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
18570 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
18580 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65  ion..  ** So cre
18590 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20  ate a fake list 
185a0 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73  to simulate this
185b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  ..  */.  if( pLi
185c0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
185d0 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
185e0 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
185f0 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  e, 0, 0);.    if
18600 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
18610 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18620 64 65 78 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  dex;.    pList->
18630 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[0].zName = sql
18640 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
18650 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
18660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18680 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
18690 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29  ->nCol-1].zName)
186a0 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30  ;.    pList->a[0
186b0 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  ].sortOrder = (u
186c0 38 29 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  8)sortOrder;.  }
186d0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
186e0 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73  t how many bytes
186f0 20 6f 66 20 73 70 61 63 65 20 61 72 65 20 72 65   of space are re
18700 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
18710 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20  explicitly.  ** 
18720 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74  specified collat
18730 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
18740 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  es..  */.  for(i
18750 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
18760 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
18770 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73  pr *pExpr = pLis
18780 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
18790 20 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a     if( pExpr ){.
187a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
187b0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c  xpr->op==TK_COLL
187c0 41 54 45 20 29 3b 0a 20 20 20 20 20 20 6e 45 78  ATE );.      nEx
187d0 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69  tra += (1 + sqli
187e0 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70  te3Strlen30(pExp
187f0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20  r->u.zToken));. 
18800 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a     }.  }..  /* .
18810 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
18820 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
18830 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65  e. .  */.  nName
18840 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
18850 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78  30(zName);.  nEx
18860 74 72 61 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70  traCol = pPk ? p
18870 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b  Pk->nKeyCol : 1;
18880 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
18890 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78  te3AllocateIndex
188a0 4f 62 6a 65 63 74 28 64 62 2c 20 70 4c 69 73 74  Object(db, pList
188b0 2d 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74 72 61  ->nExpr + nExtra
188c0 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Col,.           
188d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188e0 20 20 20 20 20 20 20 20 20 20 20 6e 4e 61 6d 65             nName
188f0 20 2b 20 6e 45 78 74 72 61 20 2b 20 31 2c 20 26   + nExtra + 1, &
18900 7a 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 64  zExtra);.  if( d
18910 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
18920 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
18930 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18940 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47   }.  assert( EIG
18950 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
18960 54 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c  T(pIndex->aiRowL
18970 6f 67 45 73 74 29 20 29 3b 0a 20 20 61 73 73 65  ogEst) );.  asse
18980 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
18990 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d  LIGNMENT(pIndex-
189a0 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49  >azColl) );.  pI
189b0 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45  ndex->zName = zE
189c0 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b  xtra;.  zExtra +
189d0 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 6d  = nName + 1;.  m
189e0 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e  emcpy(pIndex->zN
189f0 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ame, zName, nNam
18a00 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  e+1);.  pIndex->
18a10 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
18a20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
18a30 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a   = (u8)onError;.
18a40 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f    pIndex->uniqNo
18a50 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 21  tNull = onError!
18a60 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64  =OE_None;.  pInd
18a70 65 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 70 4e  ex->idxType = pN
18a80 61 6d 65 20 3f 20 53 51 4c 49 54 45 5f 49 44 58  ame ? SQLITE_IDX
18a90 54 59 50 45 5f 41 50 50 44 45 46 20 3a 20 53 51  TYPE_APPDEF : SQ
18aa0 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 55 4e 49  LITE_IDXTYPE_UNI
18ab0 51 55 45 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70  QUE;.  pIndex->p
18ac0 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
18ad0 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  [iDb].pSchema;. 
18ae0 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c   pIndex->nKeyCol
18af0 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
18b00 0a 20 20 69 66 28 20 70 50 49 57 68 65 72 65 20  .  if( pPIWhere 
18b10 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  ){.    sqlite3Re
18b20 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e  solveSelfReferen
18b30 63 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  ce(pParse, pTab,
18b40 20 4e 43 5f 50 61 72 74 49 64 78 2c 20 70 50 49   NC_PartIdx, pPI
18b50 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 70  Where, 0);.    p
18b60 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78 57  Index->pPartIdxW
18b70 68 65 72 65 20 3d 20 70 50 49 57 68 65 72 65 3b  here = pPIWhere;
18b80 0a 20 20 20 20 70 50 49 57 68 65 72 65 20 3d 20  .    pPIWhere = 
18b90 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
18ba0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
18bb0 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
18bc0 20 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65   0) );..  /* Che
18bd0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
18be0 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53  should honor DES
18bf0 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e  C requests on in
18c00 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f  dex columns.  */
18c10 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68  .  if( pDb->pSch
18c20 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74  ema->file_format
18c30 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f  >=4 ){.    sortO
18c40 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20  rderMask = -1;  
18c50 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a   /* Honor DESC *
18c60 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  /.  }else{.    s
18c70 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30  ortOrderMask = 0
18c80 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44  ;    /* Ignore D
18c90 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  ESC */.  }..  /*
18ca0 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20   Scan the names 
18cb0 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  of the columns o
18cc0 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  f the table to b
18cd0 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20  e indexed and.  
18ce0 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75  ** load the colu
18cf0 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20  mn indices into 
18d00 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74  the Index struct
18d10 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20  ure.  Report an 
18d20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e  error.  ** if an
18d30 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20  y column is not 
18d40 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  found..  **.  **
18d50 20 54 4f 44 4f 3a 20 20 41 64 64 20 61 20 74 65   TODO:  Add a te
18d60 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  st to make sure 
18d70 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 6f  that the same co
18d80 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65  lumn is not name
18d90 64 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  d.  ** more than
18da0 20 6f 6e 63 65 20 77 69 74 68 69 6e 20 74 68 65   once within the
18db0 20 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e   same index.  On
18dc0 6c 79 20 74 68 65 20 66 69 72 73 74 20 69 6e 73  ly the first ins
18dd0 74 61 6e 63 65 20 6f 66 0a 20 20 2a 2a 20 74 68  tance of.  ** th
18de0 65 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76  e column will ev
18df0 65 72 20 62 65 20 75 73 65 64 20 62 79 20 74 68  er be used by th
18e00 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f  e optimizer.  No
18e10 74 65 20 74 68 61 74 20 75 73 69 6e 67 20 74 68  te that using th
18e20 65 0a 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75  e.  ** same colu
18e30 6d 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  mn more than onc
18e40 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65  e cannot be an e
18e50 72 72 6f 72 20 62 65 63 61 75 73 65 20 74 68 61  rror because tha
18e60 74 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 62 72  t would .  ** br
18e70 65 61 6b 20 62 61 63 6b 77 61 72 64 73 20 63 6f  eak backwards co
18e80 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 20 69 74  mpatibility - it
18e90 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 20 77   needs to be a w
18ea0 61 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66  arning..  */.  f
18eb0 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65  or(i=0, pListIte
18ec0 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c  m=pList->a; i<pL
18ed0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
18ee0 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20   pListItem++){. 
18ef0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
18f00 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49  ColName = pListI
18f10 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  tem->zName;.    
18f20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72  int requestedSor
18f30 74 4f 72 64 65 72 3b 0a 20 20 20 20 63 68 61 72  tOrder;.    char
18f40 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
18f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
18f60 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
18f70 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f   name */..    fo
18f80 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70  r(j=0, pTabCol=p
18f90 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61  Tab->aCol; j<pTa
18fa0 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54  b->nCol; j++, pT
18fb0 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20  abCol++){.      
18fc0 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
18fd0 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61  mp(zColName, pTa
18fe0 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20  bCol->zName)==0 
18ff0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
19000 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e     if( j>=pTab->
19010 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  nCol ){.      sq
19020 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
19030 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20  arse, "table %s 
19040 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61  has no column na
19050 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20  med %s",.       
19060 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
19070 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  olName);.      p
19080 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
19090 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  ma = 1;.      go
190a0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
190b0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
190c0 61 73 73 65 72 74 28 20 6a 3c 3d 30 78 37 66 66  assert( j<=0x7ff
190d0 66 20 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  f );.    pIndex-
190e0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28  >aiColumn[i] = (
190f0 69 31 36 29 6a 3b 0a 20 20 20 20 69 66 28 20 70  i16)j;.    if( p
19100 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 20  ListItem->pExpr 
19110 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  ){.      int nCo
19120 6c 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ll;.      assert
19130 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  ( pListItem->pEx
19140 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pr->op==TK_COLLA
19150 54 45 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c  TE );.      zCol
19160 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  l = pListItem->p
19170 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
19180 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71        nColl = sq
19190 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
191a0 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  oll) + 1;.      
191b0 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d  assert( nExtra>=
191c0 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d  nColl );.      m
191d0 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43  emcpy(zExtra, zC
191e0 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20  oll, nColl);.   
191f0 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72     zColl = zExtr
19200 61 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20  a;.      zExtra 
19210 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  += nColl;.      
19220 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b  nExtra -= nColl;
19230 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19240 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e    zColl = pTab->
19250 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[j].zColl;. 
19260 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20       if( !zColl 
19270 29 20 7a 43 6f 6c 6c 20 3d 20 22 42 49 4e 41 52  ) zColl = "BINAR
19280 59 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Y";.    }.    if
19290 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
192a0 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61   && !sqlite3Loca
192b0 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
192c0 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  , zColl) ){.    
192d0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
192e0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
192f0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
19300 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20  ll[i] = zColl;. 
19310 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72 74     requestedSort
19320 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65  Order = pListIte
19330 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73  m->sortOrder & s
19340 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20  ortOrderMask;.  
19350 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f    pIndex->aSortO
19360 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65  rder[i] = (u8)re
19370 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
19380 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
19390 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d  aCol[j].notNull=
193a0 3d 30 20 29 20 70 49 6e 64 65 78 2d 3e 75 6e 69  =0 ) pIndex->uni
193b0 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20  qNotNull = 0;.  
193c0 7d 0a 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20  }.  if( pPk ){. 
193d0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50     for(j=0; j<pP
193e0 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  k->nKeyCol; j++)
193f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  {.      int x = 
19400 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  pPk->aiColumn[j]
19410 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 43  ;.      if( hasC
19420 6f 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e 61 69  olumn(pIndex->ai
19430 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e  Column, pIndex->
19440 6e 4b 65 79 43 6f 6c 2c 20 78 29 20 29 7b 0a 20  nKeyCol, x) ){. 
19450 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e         pIndex->n
19460 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20  Column--; .     
19470 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19480 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
19490 5b 69 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20 20  [i] = x;.       
194a0 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
194b0 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c  i] = pPk->azColl
194c0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  [j];.        pIn
194d0 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
194e0 69 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f  i] = pPk->aSortO
194f0 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  rder[j];.       
19500 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   i++;.      }.  
19510 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
19520 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75  i==pIndex->nColu
19530 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mn );.  }else{. 
19540 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
19550 75 6d 6e 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20  umn[i] = -1;.   
19560 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
19570 69 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  i] = "BINARY";. 
19580 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61   }.  sqlite3Defa
19590 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78  ultRowEst(pIndex
195a0 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
195b0 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 20  >pNewTable==0 ) 
195c0 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64  estimateIndexWid
195d0 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69  th(pIndex);..  i
195e0 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d  f( pTab==pParse-
195f0 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20  >pNewTable ){.  
19600 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
19610 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  e has been calle
19620 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61  d to create an a
19630 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61  utomatic index a
19640 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  s a.    ** resul
19650 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b  t of a PRIMARY K
19660 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
19670 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20  use on a column 
19680 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20  definition, or. 
19690 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20     ** a PRIMARY 
196a0 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
196b0 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ause following t
196c0 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69  he column defini
196d0 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e  tions..    ** i.
196e0 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a  e. one of:.    *
196f0 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  *.    ** CREATE 
19700 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52  TABLE t(x PRIMAR
19710 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a  Y KEY, y);.    *
19720 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
19730 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c  (x, y, UNIQUE(x,
19740 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20   y));.    **.   
19750 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20   ** Either way, 
19760 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
19770 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
19780 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e  y has such an in
19790 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73  dex. If.    ** s
197a0 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  o, don't bother 
197b0 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e  creating this on
197c0 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70  e. This only app
197d0 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61  lies to.    ** a
197e0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65  utomatically cre
197f0 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73  ated indices. Us
19800 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68  ers can do as th
19810 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20  ey wish with.   
19820 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64   ** explicit ind
19830 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ices..    **.   
19840 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f   ** Two UNIQUE o
19850 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
19860 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f  nstraints are co
19870 6e 73 69 64 65 72 65 64 20 65 71 75 69 76 61 6c  nsidered equival
19880 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20  ent.    ** (and 
19890 74 68 75 73 20 73 75 70 70 72 65 73 73 69 6e 67  thus suppressing
198a0 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29   the second one)
198b0 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 68 61   even if they ha
198c0 76 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20  ve different.   
198d0 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e   ** sort orders.
198e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
198f0 66 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66  f there are diff
19900 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20  erent collating 
19910 73 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20  sequences or if 
19920 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  the columns of. 
19930 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72     ** the constr
19940 61 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69  aint occur in di
19950 66 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20  fferent orders, 
19960 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61  then the constra
19970 69 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  ints are.    ** 
19980 63 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74 69  considered disti
19990 6e 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73  nct and both res
199a0 75 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65 20  ult in separate 
199b0 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a  indices..    */.
199c0 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
199d0 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
199e0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
199f0 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
19a00 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  xt){.      int k
19a10 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19a20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
19a30 64 78 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  dx) );.      ass
19a40 65 72 74 28 20 70 49 64 78 2d 3e 69 64 78 54 79  ert( pIdx->idxTy
19a50 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe!=SQLITE_IDXTY
19a60 50 45 5f 41 50 50 44 45 46 20 29 3b 0a 20 20 20  PE_APPDEF );.   
19a70 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e 69     assert( IsUni
19a80 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  queIndex(pIndex)
19a90 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   );..      if( p
19aa0 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49  Idx->nKeyCol!=pI
19ab0 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20  ndex->nKeyCol ) 
19ac0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
19ad0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d  for(k=0; k<pIdx-
19ae0 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a  >nKeyCol; k++){.
19af0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
19b00 61 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20  ar *z1;.        
19b10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a  const char *z2;.
19b20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
19b30 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70  ->aiColumn[k]!=p
19b40 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
19b50 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  k] ) break;.    
19b60 20 20 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61      z1 = pIdx->a
19b70 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  zColl[k];.      
19b80 20 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61    z2 = pIndex->a
19b90 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20  zColl[k];.      
19ba0 20 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26 20    if( z1!=z2 && 
19bb0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
19bc0 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a  1, z2) ) break;.
19bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
19be0 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ( k==pIdx->nKeyC
19bf0 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ol ){.        if
19c00 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
19c10 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  =pIndex->onError
19c20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
19c30 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   This constraint
19c40 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d   creates the sam
19c50 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65  e index as a pre
19c60 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20  vious.          
19c70 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70  ** constraint sp
19c80 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72  ecified somewher
19c90 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  e in the CREATE 
19ca0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
19cb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f  .          ** Ho
19cc0 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e  wever the ON CON
19cd0 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72  FLICT clauses ar
19ce0 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20  e different. If 
19cf0 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20  both this .     
19d00 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
19d10 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69  nt and the previ
19d20 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63  ous equivalent c
19d30 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65  onstraint have e
19d40 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20  xplicit.        
19d50 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54    ** ON CONFLICT
19d60 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73   clauses this is
19d70 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72   an error. Other
19d80 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20  wise, use the.  
19d90 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69          ** expli
19da0 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20  citly specified 
19db0 62 65 68 61 76 69 6f 72 20 66 6f 72 20 74 68 65  behavior for the
19dc0 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
19dd0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
19de0 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72  f( !(pIdx->onErr
19df0 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c  or==OE_Default |
19e00 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  | pIndex->onErro
19e10 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29  r==OE_Default) )
19e20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
19e30 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
19e40 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
19e50 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74         "conflict
19e60 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ing ON CONFLICT 
19e70 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65  clauses specifie
19e80 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  d", 0);.        
19e90 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
19ea0 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
19eb0 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20  =OE_Default ){. 
19ec0 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
19ed0 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65  >onError = pInde
19ee0 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  x->onError;.    
19ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19f00 7d 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d  }.        pRet =
19f10 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20 67   pIdx;.        g
19f20 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19f30 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
19f40 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c     }.  }..  /* L
19f50 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65  ink the new Inde
19f60 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  x structure to i
19f70 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20  ts table and to 
19f80 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69  the other.  ** i
19f90 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
19fa0 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20  e structures. . 
19fb0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
19fc0 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49  it.busy ){.    I
19fd0 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 61 73 73  ndex *p;.    ass
19fe0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
19ff0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
1a000 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  0, pIndex->pSche
1a010 6d 61 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73  ma) );.    p = s
1a020 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
1a030 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  (&pIndex->pSchem
1a040 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20  a->idxHash, .   
1a050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a060 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
1a070 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20  Name, pIndex);. 
1a080 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
1a090 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e    assert( p==pIn
1a0a0 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  dex );  /* Mallo
1a0b0 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
1a0c0 65 64 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e  ed */.      db->
1a0d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
1a0e0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
1a0f0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1a100 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c      }.    db->fl
1a110 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
1a120 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20  ternChanges;.   
1a130 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
1a140 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
1a150 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
1a160 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d  t.newTnum;.    }
1a170 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
1a180 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
1a190 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  l CREATE INDEX s
1a1a0 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45  tatement (or CRE
1a1b0 41 54 45 20 54 41 42 4c 45 20 69 66 20 74 68 65  ATE TABLE if the
1a1c0 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61  .  ** index is a
1a1d0 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20  n implied index 
1a1e0 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20  for a UNIQUE or 
1a1f0 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
1a200 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 2a  traint) then.  *
1a210 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f 20 61  * emit code to a
1a220 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
1a230 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69  x rootpage on di
1a240 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65  sk and make an e
1a250 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 74 68  ntry for.  ** th
1a260 65 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73  e index in the s
1a270 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
1a280 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  le and populate 
1a290 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 0a 20  the index with. 
1a2a0 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75   ** content.  Bu
1a2b0 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  t, do not do thi
1a2c0 73 20 69 66 20 77 65 20 61 72 65 20 73 69 6d 70  s if we are simp
1a2d0 6c 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  ly reading the s
1a2e0 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a  qlite_master.  *
1a2f0 2a 20 74 61 62 6c 65 20 74 6f 20 70 61 72 73 65  * table to parse
1a300 20 74 68 65 20 73 63 68 65 6d 61 2c 20 6f 72 20   the schema, or 
1a310 69 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  if this index is
1a320 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
1a330 20 69 6e 64 65 78 0a 20 20 2a 2a 20 6f 66 20 61   index.  ** of a
1a340 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
1a350 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
1a360 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69  If pTblName==0 i
1a370 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64  t means this ind
1a380 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ex is generated 
1a390 61 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52  as an implied PR
1a3a0 49 4d 41 52 59 20 4b 45 59 0a 20 20 2a 2a 20 6f  IMARY KEY.  ** o
1a3b0 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69  r UNIQUE index i
1a3c0 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
1a3d0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
1a3e0 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a  ce the table.  *
1a3f0 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
1a400 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
1a410 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
1a420 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
1a430 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73  alization.  ** s
1a440 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70  tep can be skipp
1a450 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
1a460 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1a470 3d 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69 64  ==0 && (HasRowid
1a480 28 70 54 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61  (pTab) || pTblNa
1a490 6d 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 56 64  me!=0) ){.    Vd
1a4a0 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
1a4b0 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20  *zStmt;.    int 
1a4c0 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
1a4d0 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20  >nMem;..    v = 
1a4e0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1a4f0 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
1a500 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
1a510 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
1a520 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
1a530 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20  he rootpage for 
1a540 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  the index.    */
1a550 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
1a560 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
1a570 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
1a580 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a590 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65  AddOp2(v, OP_Cre
1a5a0 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 69  ateIndex, iDb, i
1a5b0 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61  Mem);..    /* Ga
1a5c0 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  ther the complet
1a5d0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
1a5e0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1a5f0 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ment into.    **
1a600 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61   the zStmt varia
1a610 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ble.    */.    i
1a620 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
1a630 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29     int n = (int)
1a640 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f  (pParse->sLastTo
1a650 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a  ken.z - pName->z
1a660 29 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  ) + pParse->sLas
1a670 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20  tToken.n;.      
1a680 69 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31  if( pName->z[n-1
1a690 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20  ]==';' ) n--;.  
1a6a0 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69      /* A named i
1a6b0 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70  ndex with an exp
1a6c0 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44  licit CREATE IND
1a6d0 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
1a6e0 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
1a6f0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1a700 20 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58   "CREATE%s INDEX
1a710 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20   %.*s",.        
1a720 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
1a730 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45   ? "" : " UNIQUE
1a740 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b  ", n, pName->z);
1a750 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a760 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69    /* An automati
1a770 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20  c index created 
1a780 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  by a PRIMARY KEY
1a790 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
1a7a0 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f  raint */.      /
1a7b0 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  * zStmt = sqlite
1a7c0 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f  3MPrintf(""); */
1a7d0 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30  .      zStmt = 0
1a7e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1a7f0 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  Add an entry in 
1a800 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f  sqlite_master fo
1a810 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20  r this index.   
1a820 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
1a830 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
1a840 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53  e, .        "INS
1a850 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56  ERT INTO %Q.%s V
1a860 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51  ALUES('index',%Q
1a870 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20  ,%Q,#%d,%Q);",. 
1a880 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
1a890 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
1a8a0 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
1a8b0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
1a8c0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61  ame,.        pTa
1a8d0 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
1a8e0 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20    iMem,.        
1a8f0 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20  zStmt.    );.   
1a900 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1a910 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20  b, zStmt);..    
1a920 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65  /* Fill the inde
1a930 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20  x with data and 
1a940 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65  reparse the sche
1a950 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45  ma. Code an OP_E
1a960 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20  xpire.    ** to 
1a970 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  invalidate all p
1a980 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  re-compiled stat
1a990 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  ements..    */. 
1a9a0 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20     if( pTblName 
1a9b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a9c0 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
1a9d0 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d  se, pIndex, iMem
1a9e0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a9f0 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
1aa00 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
1aa10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
1aa20 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20  arseSchemaOp(v, 
1aa30 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 73 71  iDb,.         sq
1aa40 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1aa50 20 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20   "name='%q' AND 
1aa60 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 70  type='index'", p
1aa70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Index->zName));.
1aa80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1aa90 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 78  eAddOp1(v, OP_Ex
1aaa0 70 69 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  pire, 0);.    }.
1aab0 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61    }..  /* When a
1aac0 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74  dding an index t
1aad0 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
1aae0 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c  dices for a tabl
1aaf0 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  e, make.  ** sur
1ab00 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61  e all indices la
1ab10 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65  beled OE_Replace
1ab20 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20   come after all 
1ab30 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20  those labeled.  
1ab40 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54  ** OE_Ignore.  T
1ab50 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
1ab60 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74   for the correct
1ab70 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63   constraint chec
1ab80 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e  k.  ** processin
1ab90 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e  g (in sqlite3Gen
1aba0 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  erateConstraintC
1abb0 68 65 63 6b 73 28 29 29 20 61 73 20 70 61 72 74  hecks()) as part
1abc0 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20   of.  ** UPDATE 
1abd0 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74 65  and INSERT state
1abe0 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20  ments.  .  */.  
1abf0 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
1ac00 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  y || pTblName==0
1ac10 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72   ){.    if( onEr
1ac20 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
1ac30 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d  || pTab->pIndex=
1ac40 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
1ac50 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
1ac60 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
1ac70 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
1ac80 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
1ac90 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61  Index;.      pTa
1aca0 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  b->pIndex = pInd
1acb0 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ex;.    }else{. 
1acc0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68       Index *pOth
1acd0 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  er = pTab->pInde
1ace0 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
1acf0 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26  pOther->pNext &&
1ad00 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e   pOther->pNext->
1ad10 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
1ad20 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ace ){.        p
1ad30 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e  Other = pOther->
1ad40 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
1ad50 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
1ad60 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
1ad70 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72  xt;.      pOther
1ad80 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
1ad90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 74  ;.    }.    pRet
1ada0 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70   = pIndex;.    p
1adb0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Index = 0;.  }..
1adc0 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65    /* Clean up be
1add0 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
1ade0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1adf0 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  x:.  if( pIndex 
1ae00 29 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20  ) freeIndex(db, 
1ae10 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74  pIndex);.  sqlit
1ae20 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1ae30 20 70 50 49 57 68 65 72 65 29 3b 0a 20 20 73 71   pPIWhere);.  sq
1ae40 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
1ae50 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
1ae60 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1ae70 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c 4e  Delete(db, pTblN
1ae80 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
1ae90 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
1aea0 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
1aeb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74  .}../*.** Fill t
1aec0 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  he Index.aiRowEs
1aed0 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64  t[] array with d
1aee0 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69  efault informati
1aef0 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  on - information
1af00 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77  .** to be used w
1af10 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20  hen we have not 
1af20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20  run the ANALYZE 
1af30 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61  command..**.** a
1af40 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75  iRowEst[0] is su
1af50 70 70 6f 73 65 64 20 74 6f 20 63 6f 6e 74 61 69  pposed to contai
1af60 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1af70 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
1af80 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20  index..** Since 
1af90 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20  we do not know, 
1afa0 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e  guess 1 million.
1afb0 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73    aiRowEst[1] is
1afc0 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
1afd0 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
1afe0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1aff0 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e  le that match an
1b000 79 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c  y particular val
1b010 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72  ue of the.** fir
1b020 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
1b030 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73   index.  aiRowEs
1b040 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[2] is an estim
1b050 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
1b060 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61  r.** of rows tha
1b070 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
1b080 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69  icular combinati
1b090 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  on of the first 
1b0a0 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20  2 columns.** of 
1b0b0 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20  the index.  And 
1b0c0 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75  so forth.  It mu
1b0d0 73 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  st always be the
1b0e0 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20   case that.*.** 
1b0f0 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
1b100 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b  st[N]<=aiRowEst[
1b110 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20  N-1].**         
1b120 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31    aiRowEst[N]>=1
1b130 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f  .**.** Apart fro
1b140 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76 65 20  m that, we have 
1b150 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20  little to go on 
1b160 62 65 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f  besides intuitio
1b170 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61  n as to.** how a
1b180 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64  iRowEst[] should
1b190 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
1b1a0 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65    The numbers ge
1b1b0 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20  nerated here.** 
1b1c0 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70  are based on typ
1b1d0 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e  ical values foun
1b1e0 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69  d in actual indi
1b1f0 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
1b200 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
1b210 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  t(Index *pIdx){.
1b220 20 20 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20    /*            
1b230 20 20 20 20 31 30 2c 20 20 39 2c 20 20 38 2c 20      10,  9,  8, 
1b240 20 37 2c 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45   7,  6 */.  LogE
1b250 73 74 20 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33  st aVal[] = { 33
1b260 2c 20 33 32 2c 20 33 30 2c 20 32 38 2c 20 32 36  , 32, 30, 28, 26
1b270 20 7d 3b 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20   };.  LogEst *a 
1b280 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67  = pIdx->aiRowLog
1b290 45 73 74 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79  Est;.  int nCopy
1b2a0 20 3d 20 4d 49 4e 28 41 72 72 61 79 53 69 7a 65   = MIN(ArraySize
1b2b0 28 61 56 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b  (aVal), pIdx->nK
1b2c0 65 79 43 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b  eyCol);.  int i;
1b2d0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66  ..  /* Set the f
1b2e0 69 72 73 74 20 65 6e 74 72 79 20 28 6e 75 6d 62  irst entry (numb
1b2f0 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1b300 65 20 69 6e 64 65 78 29 20 74 6f 20 74 68 65 20  e index) to the 
1b310 65 73 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20  estimated .  ** 
1b320 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1b330 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 4f 72 20  n the table. Or 
1b340 31 30 2c 20 69 66 20 74 68 65 20 65 73 74 69 6d  10, if the estim
1b350 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72  ated number of r
1b360 6f 77 73 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ows .  ** in the
1b370 20 74 61 62 6c 65 20 69 73 20 6c 65 73 73 20 74   table is less t
1b380 68 61 6e 20 74 68 61 74 2e 20 20 2a 2f 0a 20 20  han that.  */.  
1b390 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61  a[0] = pIdx->pTa
1b3a0 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  ble->nRowLogEst;
1b3b0 0a 20 20 69 66 28 20 61 5b 30 5d 3c 33 33 20 29  .  if( a[0]<33 )
1b3c0 20 61 5b 30 5d 20 3d 20 33 33 3b 20 20 20 20 20   a[0] = 33;     
1b3d0 20 20 20 61 73 73 65 72 74 28 20 33 33 3d 3d 73     assert( 33==s
1b3e0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29  qlite3LogEst(10)
1b3f0 20 29 3b 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61   );..  /* Estima
1b400 74 65 20 74 68 61 74 20 61 5b 31 5d 20 69 73 20  te that a[1] is 
1b410 31 30 2c 20 61 5b 32 5d 20 69 73 20 39 2c 20 61  10, a[2] is 9, a
1b420 5b 33 5d 20 69 73 20 38 2c 20 61 5b 34 5d 20 69  [3] is 8, a[4] i
1b430 73 20 37 2c 20 61 5b 35 5d 20 69 73 0a 20 20 2a  s 7, a[5] is.  *
1b440 2a 20 36 20 61 6e 64 20 65 61 63 68 20 73 75 62  * 6 and each sub
1b450 73 65 71 75 65 6e 74 20 76 61 6c 75 65 20 28 69  sequent value (i
1b460 66 20 61 6e 79 29 20 69 73 20 35 2e 20 20 2a 2f  f any) is 5.  */
1b470 0a 20 20 6d 65 6d 63 70 79 28 26 61 5b 31 5d 2c  .  memcpy(&a[1],
1b480 20 61 56 61 6c 2c 20 6e 43 6f 70 79 2a 73 69 7a   aVal, nCopy*siz
1b490 65 6f 66 28 4c 6f 67 45 73 74 29 29 3b 0a 20 20  eof(LogEst));.  
1b4a0 66 6f 72 28 69 3d 6e 43 6f 70 79 2b 31 3b 20 69  for(i=nCopy+1; i
1b4b0 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  <=pIdx->nKeyCol;
1b4c0 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20   i++){.    a[i] 
1b4d0 3d 20 32 33 3b 20 20 20 20 20 20 20 20 20 20 20  = 23;           
1b4e0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1b4f0 20 32 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   23==sqlite3LogE
1b500 73 74 28 35 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  st(5) );.  }..  
1b510 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
1b520 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20  e3LogEst(1) );. 
1b530 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64   if( IsUniqueInd
1b540 65 78 28 70 49 64 78 29 20 29 20 61 5b 70 49 64  ex(pIdx) ) a[pId
1b550 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20 30 3b  x->nKeyCol] = 0;
1b560 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1b570 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70  outine will drop
1b580 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d   an existing nam
1b590 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20  ed index.  This 
1b5a0 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65  routine.** imple
1b5b0 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49  ments the DROP I
1b5c0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a  NDEX statement..
1b5d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
1b5e0 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ropIndex(Parse *
1b5f0 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
1b600 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78  *pName, int ifEx
1b610 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a  ists){.  Index *
1b620 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a  pIndex;.  Vdbe *
1b630 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
1b640 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1b650 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73   int iDb;..  ass
1b660 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
1b670 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76  r==0 );   /* Nev
1b680 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  er called with p
1b690 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20  rior errors */. 
1b6a0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1b6b0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
1b6c0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1b6d0 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  x;.  }.  assert(
1b6e0 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
1b6f0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
1b700 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
1b710 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
1b720 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1b730 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1b740 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
1b750 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70  3FindIndex(db, p
1b760 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
1b770 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
1b780 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20  atabase);.  if( 
1b790 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20  pIndex==0 ){.   
1b7a0 20 69 66 28 20 21 69 66 45 78 69 73 74 73 20 29   if( !ifExists )
1b7b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1b7c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1b7d0 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
1b7e0 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  %S", pName, 0);.
1b7f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b800 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
1b810 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50  fyNamedSchema(pP
1b820 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  arse, pName->a[0
1b830 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
1b840 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
1b850 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
1b860 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1b870 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1b880 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 64 78   if( pIndex->idx
1b890 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58  Type!=SQLITE_IDX
1b8a0 54 59 50 45 5f 41 50 50 44 45 46 20 29 7b 0a 20  TYPE_APPDEF ){. 
1b8b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1b8c0 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
1b8d0 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
1b8e0 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20  h UNIQUE ".     
1b8f0 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   "or PRIMARY KEY
1b900 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e   constraint cann
1b910 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
1b920 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  0);.    goto exi
1b930 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1b940 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
1b950 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
1b960 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  b, pIndex->pSche
1b970 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ma);.#ifndef SQL
1b980 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
1b990 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
1b9a0 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
1b9b0 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _DROP_INDEX;.   
1b9c0 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
1b9d0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20  Index->pTable;. 
1b9e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1b9f0 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
1ba00 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
1ba10 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
1ba20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
1ba30 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
1ba40 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1ba50 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
1ba60 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
1ba70 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
1ba80 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1ba90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f      }.    if( !O
1baa0 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
1bab0 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  b ) code = SQLIT
1bac0 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
1bad0 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
1bae0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1baf0 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78  se, code, pIndex
1bb00 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
1bb10 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
1bb20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1bb30 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
1bb40 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1bb50 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1bb60 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  o remove the ind
1bb70 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20  ex and from the 
1bb80 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
1bb90 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1bba0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1bbb0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
1bbc0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1bbd0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
1bbe0 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  1, iDb);.    sql
1bbf0 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
1bc00 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22  pParse,.       "
1bc10 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
1bc20 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 20  s WHERE name=%Q 
1bc30 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27  AND type='index'
1bc40 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ",.       db->aD
1bc50 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
1bc60 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
1bc70 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20   pIndex->zName. 
1bc80 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
1bc90 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
1bca0 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69  (pParse, iDb, "i
1bcb0 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  dx", pIndex->zNa
1bcc0 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
1bcd0 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
1bce0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64  rse, iDb);.    d
1bcf0 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
1bd00 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74  Parse, pIndex->t
1bd10 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  num, iDb);.    s
1bd20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1bd30 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78  (v, OP_DropIndex
1bd40 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e  , iDb, 0, 0, pIn
1bd50 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
1bd60 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69    }..exit_drop_i
1bd70 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53  ndex:.  sqlite3S
1bd80 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
1bd90 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pName);.}../*.*
1bda0 2a 20 70 41 72 72 61 79 20 69 73 20 61 20 70 6f  * pArray is a po
1bdb0 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61  inter to an arra
1bdc0 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45 61  y of objects. Ea
1bdd0 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ch object in the
1bde0 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45  .** array is szE
1bdf0 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20 73 69  ntry bytes in si
1be00 7a 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ze. This routine
1be10 20 75 73 65 73 20 73 71 6c 69 74 65 33 44 62 52   uses sqlite3DbR
1be20 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65  ealloc().** to e
1be30 78 74 65 6e 64 20 74 68 65 20 61 72 72 61 79 20  xtend the array 
1be40 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73  so that there is
1be50 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77   space for a new
1be60 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20 65   object at the e
1be70 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  nd..**.** When t
1be80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1be90 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79  called, *pnEntry
1bea0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75   contains the cu
1beb0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a  rrent size of.**
1bec0 20 74 68 65 20 61 72 72 61 79 20 28 69 6e 20 65   the array (in e
1bed0 6e 74 72 69 65 73 20 2d 20 73 6f 20 74 68 65 20  ntries - so the 
1bee0 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28 28  allocation is ((
1bef0 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e  *pnEntry) * szEn
1bf00 74 72 79 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e  try) bytes.** in
1bf10 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49   total)..**.** I
1bf20 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20  f the realloc() 
1bf30 69 73 20 73 75 63 63 65 73 73 66 75 6c 20 28 69  is successful (i
1bf40 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f  .e. if no OOM co
1bf50 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c  ndition occurs),
1bf60 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c   the.** space al
1bf70 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
1bf80 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20 7a 65  new object is ze
1bf90 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75  roed, *pnEntry u
1bfa0 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66  pdated to.** ref
1bfb0 6c 65 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a  lect the new siz
1bfc0 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 61  e of the array a
1bfd0 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
1bfe0 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
1bff0 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  on.** returned. 
1c000 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20  *pIdx is set to 
1c010 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
1c020 20 6e 65 77 20 61 72 72 61 79 20 65 6e 74 72 79   new array entry
1c030 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
1c040 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1c050 69 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29  if the realloc()
1c060 20 66 61 69 6c 73 2c 20 2a 70 49 64 78 20 69 73   fails, *pIdx is
1c070 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45   set to -1, *pnE
1c080 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20  ntry remains.** 
1c090 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20  unchanged and a 
1c0a0 63 6f 70 79 20 6f 66 20 70 41 72 72 61 79 20 72  copy of pArray r
1c0b0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  eturned..*/.void
1c0c0 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c   *sqlite3ArrayAl
1c0d0 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65  locate(.  sqlite
1c0e0 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43  3 *db,      /* C
1c0f0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
1c100 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61  ify of malloc fa
1c110 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64  ilures */.  void
1c120 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a   *pArray,     /*
1c130 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   Array of object
1c140 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65 61  s.  Might be rea
1c150 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e  llocated */.  in
1c160 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20  t szEntry,      
1c170 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20  /* Size of each 
1c180 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72  object in the ar
1c190 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ray */.  int *pn
1c1a0 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75  Entry,     /* Nu
1c1b0 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20  mber of objects 
1c1c0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
1c1d0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20   */.  int *pIdx 
1c1e0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1c1f0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
1c200 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f  new slot here */
1c210 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
1c220 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72   int n = *pnEntr
1c230 79 3b 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e  y;.  if( (n & (n
1c240 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  -1))==0 ){.    i
1c250 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f  nt sz = (n==0) ?
1c260 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f   1 : 2*n;.    vo
1c270 69 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  id *pNew = sqlit
1c280 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
1c290 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74  pArray, sz*szEnt
1c2a0 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ry);.    if( pNe
1c2b0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  w==0 ){.      *p
1c2c0 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Idx = -1;.      
1c2d0 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20  return pArray;. 
1c2e0 20 20 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20     }.    pArray 
1c2f0 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20  = pNew;.  }.  z 
1c300 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b  = (char*)pArray;
1c310 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a  .  memset(&z[n *
1c320 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a   szEntry], 0, sz
1c330 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20  Entry);.  *pIdx 
1c340 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72  = n;.  ++*pnEntr
1c350 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72  y;.  return pArr
1c360 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  ay;.}../*.** App
1c370 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  end a new elemen
1c380 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49  t to the given I
1c390 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  dList.  Create a
1c3a0 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a   new IdList if.*
1c3b0 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a  * need be..**.**
1c3c0 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73   A new IdList is
1c3d0 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
1c3e0 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66  LL if malloc() f
1c3f0 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20  ails..*/.IdList 
1c400 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70  *sqlite3IdListAp
1c410 70 65 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62  pend(sqlite3 *db
1c420 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  , IdList *pList,
1c430 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
1c440 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1c450 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
1c460 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
1c470 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
1c480 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29  sizeof(IdList) )
1c490 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
1c4a0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1c4b0 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20   }.  pList->a = 
1c4c0 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
1c4d0 63 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a  cate(.      db,.
1c4e0 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a        pList->a,.
1c4f0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69        sizeof(pLi
1c500 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20  st->a[0]),.     
1c510 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20   &pList->nId,.  
1c520 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66      &i.  );.  if
1c530 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  ( i<0 ){.    sql
1c540 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
1c550 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
1c560 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1c570 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1c580 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
1c590 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
1c5a0 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20  oken);.  return 
1c5b0 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
1c5c0 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74  Delete an IdList
1c5d0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1c5e0 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71  3IdListDelete(sq
1c5f0 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
1c600 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
1c610 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1c620 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1c630 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1c640 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
1c650 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1c660 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  , pList->a[i].zN
1c670 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ame);.  }.  sqli
1c680 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
1c690 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
1c6a0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
1c6b0 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
1c6c0 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
1c6d0 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69  n pList of the i
1c6e0 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20  dentifier named 
1c6f0 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  zId.  Return -1.
1c700 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ** if not found.
1c710 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
1c720 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73  dListIndex(IdLis
1c730 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  t *pList, const 
1c740 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
1c750 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1c760 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d  st==0 ) return -
1c770 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
1c780 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
1c790 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1c7a0 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
1c7b0 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  a[i].zName, zNam
1c7c0 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  e)==0 ) return i
1c7d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
1c7e0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61  1;.}../*.** Expa
1c7f0 6e 64 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c  nd the space all
1c800 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 67  ocated for the g
1c810 69 76 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a  iven SrcList obj
1c820 65 63 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69  ect by.** creati
1c830 6e 67 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c  ng nExtra new sl
1c840 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ots beginning at
1c850 20 69 53 74 61 72 74 2e 20 20 69 53 74 61 72 74   iStart.  iStart
1c860 20 69 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a   is zero based..
1c870 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65  ** New slots are
1c880 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46   zeroed..**.** F
1c890 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70  or example, supp
1c8a0 6f 73 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e  ose a SrcList in
1c8b0 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73  itially contains
1c8c0 20 74 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c   two entries: A,
1c8d0 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20  B..** To append 
1c8e0 33 20 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e  3 new entries on
1c8f0 74 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74  to the end, do t
1c900 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71  his:.**.**    sq
1c910 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
1c920 72 67 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74  rge(db, pSrclist
1c930 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41  , 3, 2);.**.** A
1c940 66 74 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62  fter the call ab
1c950 6f 76 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e  ove it would con
1c960 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c  tain:  A, B, nil
1c970 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49  , nil, nil..** I
1c980 66 20 74 68 65 20 69 53 74 61 72 74 20 61 72 67  f the iStart arg
1c990 75 6d 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31  ument had been 1
1c9a0 20 69 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74   instead of 2, t
1c9b0 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  hen the result.*
1c9c0 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  * would have bee
1c9d0 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  n:  A, nil, nil,
1c9e0 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65   nil, B.  To pre
1c9f0 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f  pend the new slo
1ca00 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72  ts,.** the iStar
1ca10 74 20 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65  t value would be
1ca20 20 30 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20   0.  The result 
1ca30 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65  then would.** be
1ca40 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  : nil, nil, nil,
1ca50 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   A, B..**.** If 
1ca60 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
1ca70 69 6f 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72  ion fails the Sr
1ca80 63 4c 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67  cList is unchang
1ca90 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e  ed.  The.** db->
1caa0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
1cab0 67 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  g will be set to
1cac0 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73   true..*/.SrcLis
1cad0 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
1cae0 74 45 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69  tEnlarge(.  sqli
1caf0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f  te3 *db,       /
1cb00 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
1cb10 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
1cb20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f  of OOM errors */
1cb30 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1cb40 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63  ,     /* The Src
1cb50 4c 69 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72  List to be enlar
1cb60 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ged */.  int nEx
1cb70 74 72 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  tra,        /* N
1cb80 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f  umber of new slo
1cb90 74 73 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72  ts to add to pSr
1cba0 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  c->a[] */.  int 
1cbb0 69 53 74 61 72 74 20 20 20 20 20 20 20 20 20 2f  iStart         /
1cbc0 2a 20 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d  * Index in pSrc-
1cbd0 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65  >a[] of first ne
1cbe0 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69  w slot */.){.  i
1cbf0 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  nt i;..  /* Sani
1cc00 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63  ty checking on c
1cc10 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72  alling parameter
1cc20 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
1cc30 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73  Start>=0 );.  as
1cc40 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20  sert( nExtra>=1 
1cc50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
1cc60 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  c!=0 );.  assert
1cc70 28 20 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e  ( iStart<=pSrc->
1cc80 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  nSrc );..  /* Al
1cc90 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61  locate additiona
1cca0 6c 20 73 70 61 63 65 20 69 66 20 6e 65 65 64 65  l space if neede
1ccb0 64 20 2a 2f 0a 20 20 69 66 28 20 28 75 33 32 29  d */.  if( (u32)
1ccc0 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72  pSrc->nSrc+nExtr
1ccd0 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29  a>pSrc->nAlloc )
1cce0 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  {.    SrcList *p
1ccf0 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c  New;.    int nAl
1cd00 6c 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63  loc = pSrc->nSrc
1cd10 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20 69 6e 74  +nExtra;.    int
1cd20 20 6e 47 6f 74 3b 0a 20 20 20 20 70 4e 65 77 20   nGot;.    pNew 
1cd30 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
1cd40 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20  oc(db, pSrc,.   
1cd50 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
1cd60 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c  of(*pSrc) + (nAl
1cd70 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53  loc-1)*sizeof(pS
1cd80 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  rc->a[0]) );.   
1cd90 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1cda0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
1cdb0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1cdc0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
1cdd0 53 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Src;.    }.    p
1cde0 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  Src = pNew;.    
1cdf0 6e 47 6f 74 20 3d 20 28 73 71 6c 69 74 65 33 44  nGot = (sqlite3D
1ce00 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20  bMallocSize(db, 
1ce10 70 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66 28 2a  pNew) - sizeof(*
1ce20 70 53 72 63 29 29 2f 73 69 7a 65 6f 66 28 70 53  pSrc))/sizeof(pS
1ce30 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20 20  rc->a[0])+1;.   
1ce40 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pSrc->nAlloc = 
1ce50 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nGot;.  }..  /* 
1ce60 4d 6f 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c  Move existing sl
1ce70 6f 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66  ots that come af
1ce80 74 65 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e  ter the newly in
1ce90 73 65 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a  serted slots.  *
1cea0 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79  * out of the way
1ceb0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63   */.  for(i=pSrc
1cec0 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74  ->nSrc-1; i>=iSt
1ced0 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70  art; i--){.    p
1cee0 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d  Src->a[i+nExtra]
1cef0 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20   = pSrc->a[i];. 
1cf00 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20   }.  pSrc->nSrc 
1cf10 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a  += nExtra;..  /*
1cf20 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20   Zero the newly 
1cf30 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20  allocated slots 
1cf40 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72  */.  memset(&pSr
1cf50 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  c->a[iStart], 0,
1cf60 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b   sizeof(pSrc->a[
1cf70 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66  0])*nExtra);.  f
1cf80 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69  or(i=iStart; i<i
1cf90 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b  Start+nExtra; i+
1cfa0 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  +){.    pSrc->a[
1cfb0 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  i].iCursor = -1;
1cfc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72  .  }..  /* Retur
1cfd0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1cfe0 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c  he enlarged SrcL
1cff0 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ist */.  return 
1d000 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pSrc;.}.../*.** 
1d010 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62  Append a new tab
1d020 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67  le name to the g
1d030 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43  iven SrcList.  C
1d040 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c  reate a new SrcL
1d050 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
1d060 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  e.  A new entry 
1d070 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  is created in th
1d080 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69  e SrcList even i
1d090 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c  f pTable is NULL
1d0a0 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73  ..**.** A SrcLis
1d0b0 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
1d0c0 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  r NULL if there 
1d0d0 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  is an OOM error.
1d0e0 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a    The returned.*
1d0f0 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  * SrcList might 
1d100 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
1d110 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
1d120 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20  was input or it 
1d130 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65  might be.** a ne
1d140 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f  w one.  If an OO
1d150 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  M error does occ
1d160 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72  urs, then the pr
1d170 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69  ior value of pLi
1d180 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e  st.** that is in
1d190 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
1d1a0 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63  ine is automatic
1d1b0 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a  ally freed..**.*
1d1c0 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69  * If pDatabase i
1d1d0 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d  s not null, it m
1d1e0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61  eans that the ta
1d1f0 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f  ble has an optio
1d200 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
1d210 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69  name prefix.  Li
1d220 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62  ke this:  "datab
1d230 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65  ase.table".  The
1d240 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f   pDatabase.** po
1d250 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c  ints to the tabl
1d260 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70  e name and the p
1d270 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  Table points to 
1d280 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1d290 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73  e..** The SrcLis
1d2a0 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c  t.a[].zName fiel
1d2b0 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  d is filled with
1d2c0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
1d2d0 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63  which might.** c
1d2e0 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20  ome from pTable 
1d2f0 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73  (if pDatabase is
1d300 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70   NULL) or from p
1d310 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53  Database.  .** S
1d320 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61  rcList.a[].zData
1d330 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77  base is filled w
1d340 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
1d350 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   name from pTabl
1d360 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55  e,.** or with NU
1d370 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73  LL if no databas
1d380 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  e is specified..
1d390 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
1d3a0 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69  ords, if call li
1d3b0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1d3c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1d3d0 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
1d3e0 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,0);.**.** Then
1d3f0 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61   B is a table na
1d400 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  me and the datab
1d410 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70  ase name is unsp
1d420 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c  ecified.  If cal
1d430 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73  led.** like this
1d440 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1d450 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1d460 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a  pend(D,A,B,C);.*
1d470 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74  *.** Then C is t
1d480 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
1d490 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62  d B is the datab
1d4a0 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20  ase name.  If C 
1d4b0 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68  is defined.** th
1d4c0 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20  en so is B.  In 
1d4d0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20  other words, we 
1d4e0 6e 65 76 65 72 20 68 61 76 65 20 61 20 63 61 73  never have a cas
1d4f0 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  e where:.**.**  
1d500 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1d510 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
1d520 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68  0,C);.**.** Both
1d530 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74   pTable and pDat
1d540 61 62 61 73 65 20 61 72 65 20 61 73 73 75 6d 65  abase are assume
1d550 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20  d to be quoted. 
1d560 20 54 68 65 79 20 61 72 65 20 64 65 71 75 6f 74   They are dequot
1d570 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69  ed.** before bei
1d580 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ng added to the 
1d590 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c  SrcList..*/.SrcL
1d5a0 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
1d5b0 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c  istAppend(.  sql
1d5c0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1d5d0 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74   /* Connection t
1d5e0 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c  o notify of mall
1d5f0 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20  oc failures */. 
1d600 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c   SrcList *pList,
1d610 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74       /* Append t
1d620 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20  o this SrcList. 
1d630 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e  NULL creates a n
1d640 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  ew SrcList */.  
1d650 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
1d660 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
1d670 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65  append */.  Toke
1d680 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20 20  n *pDatabase    
1d690 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20 74  /* Database of t
1d6a0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  he table */.){. 
1d6b0 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1d6c0 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
1d6d0 73 73 65 72 74 28 20 70 44 61 74 61 62 61 73 65  ssert( pDatabase
1d6e0 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30  ==0 || pTable!=0
1d6f0 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68   );  /* Cannot h
1d700 61 76 65 20 43 20 77 69 74 68 6f 75 74 20 42 20  ave C without B 
1d710 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
1d720 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
1d730 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1d740 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1d750 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
1d760 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1d770 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69  eturn 0;.    pLi
1d780 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
1d790 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71    }.  pList = sq
1d7a0 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
1d7b0 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31  rge(db, pList, 1
1d7c0 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a  , pList->nSrc);.
1d7d0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1d7e0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
1d7f0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1d800 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
1d810 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1d820 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  .  pItem = &pLis
1d830 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
1d840 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61  -1];.  if( pData
1d850 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73  base && pDatabas
1d860 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  e->z==0 ){.    p
1d870 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
1d880 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  }.  if( pDatabas
1d890 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a  e ){.    Token *
1d8a0 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73  pTemp = pDatabas
1d8b0 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  e;.    pDatabase
1d8c0 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70   = pTable;.    p
1d8d0 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20  Table = pTemp;. 
1d8e0 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   }.  pItem->zNam
1d8f0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
1d900 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61  romToken(db, pTa
1d910 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a  ble);.  pItem->z
1d920 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
1d930 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1d940 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  db, pDatabase);.
1d950 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
1d960 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
1d970 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78  VdbeCursor index
1d980 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20   numbers to all 
1d990 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
1d9a0 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
1d9b0 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
1d9c0 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
1d9d0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
1d9e0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1d9f0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1da00 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1da10 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c   assert(pList ||
1da20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1da30 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
1da40 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
1da50 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
1da60 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
1da70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
1da80 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
1da90 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e   pItem->iCursor>
1daa0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1dab0 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
1dac0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1dad0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  +;.      if( pIt
1dae0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
1daf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1db00 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
1db10 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  rs(pParse, pItem
1db20 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29  ->pSelect->pSrc)
1db30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1db40 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
1db50 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
1db60 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
1db70 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
1db80 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
1db90 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1dba0 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
1dbb0 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
1dbc0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1dbd0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1dbe0 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
1dbf0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1dc00 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
1dc10 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
1dc20 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
1dc30 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
1dc40 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1dc50 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
1dc60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
1dc70 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
1dc80 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    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 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1dcb0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1dcc0 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65  db, pItem->zInde
1dcd0 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  x);.    sqlite3D
1dce0 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
1dcf0 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
1dd00 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1dd10 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
1dd20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
1dd30 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1dd40 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b  db, pItem->pOn);
1dd50 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
1dd60 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
1dd70 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
1dd80 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1dd90 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
1dda0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1ddb0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
1ddc0 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61 64  the parser to ad
1ddd0 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  d a new term to 
1dde0 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20  the.** end of a 
1ddf0 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61  growing FROM cla
1de00 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70 61  use.  The "p" pa
1de10 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 70  rameter is the p
1de20 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52  art of.** the FR
1de30 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20 68  OM clause that h
1de40 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1de50 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70  constructed.  "p
1de60 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  " is NULL.** if 
1de70 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1de80 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52  t term of the FR
1de90 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62  OM clause.  pTab
1dea0 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65  le and pDatabase
1deb0 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65  .** are the name
1dec0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e   of the table an
1ded0 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  d database named
1dee0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1def0 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61  use term..** pDa
1df00 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69  tabase is NULL i
1df10 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  f the database n
1df20 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69 73  ame qualifier is
1df30 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a   missing - the.*
1df40 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49  * usual case.  I
1df50 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20 61  f the term has a
1df60 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41  n alias, then pA
1df70 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74  lias points to t
1df80 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65  he.** alias toke
1df90 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  n.  If the term 
1dfa0 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74  is a subquery, t
1dfb0 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69 73  hen pSubquery is
1dfc0 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73   the.** SELECT s
1dfd0 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68  tatement that th
1dfe0 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64  e subquery encod
1dff0 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20  es.  The pTable 
1e000 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  and.** pDatabase
1e010 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
1e020 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72  NULL for subquer
1e030 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e  ies.  The pOn an
1e040 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61  d pUsing.** para
1e050 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20 63  meters are the c
1e060 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e  ontent of the ON
1e070 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1e080 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  es..**.** Return
1e090 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77   a new SrcList w
1e0a0 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20  hich encodes is 
1e0b0 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68  the FROM with th
1e0c0 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64  e new.** term ad
1e0d0 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ded..*/.SrcList 
1e0e0 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
1e0f0 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20  ppendFromTerm(. 
1e100 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1e110 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1e120 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1e130 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20   SrcList *p,    
1e140 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e150 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68 65  left part of the
1e160 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72   FROM clause alr
1e170 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54  eady seen */.  T
1e180 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
1e190 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1e1a0 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61  f the table to a
1e1b0 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63  dd to the FROM c
1e1c0 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  lause */.  Token
1e1d0 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20 20   *pDatabase,    
1e1e0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1e1f0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
1e200 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a  ining pTable */.
1e210 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c    Token *pAlias,
1e220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e230 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
1e240 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65 78   of the AS subex
1e250 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65  pression */.  Se
1e260 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c  lect *pSubquery,
1e270 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75        /* A subqu
1e280 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63  ery used in plac
1e290 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d  e of a table nam
1e2a0 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e  e */.  Expr *pOn
1e2b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1e2c0 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  * The ON clause 
1e2d0 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49  of a join */.  I
1e2e0 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20  dList *pUsing   
1e2f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53         /* The US
1e300 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
1e310 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  join */.){.  str
1e320 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1e330 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
1e340 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1e350 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26  >db;.  if( !p &&
1e360 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29   (pOn || pUsing)
1e370 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1e380 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1e390 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69  "a JOIN clause i
1e3a0 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  s required befor
1e3b0 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70  e %s", .      (p
1e3c0 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49  On ? "ON" : "USI
1e3d0 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  NG").    );.    
1e3e0 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
1e3f0 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20  _error;.  }.  p 
1e400 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1e410 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54  Append(db, p, pT
1e420 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29  able, pDatabase)
1e430 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
1e440 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30  NEVER(p->nSrc==0
1e450 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70  ) ){.    goto ap
1e460 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b  pend_from_error;
1e470 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
1e480 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
1e490 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c 69 61  .  assert( pAlia
1e4a0 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41  s!=0 );.  if( pA
1e4b0 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70  lias->n ){.    p
1e4c0 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
1e4d0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1e4e0 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b  ken(db, pAlias);
1e4f0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53  .  }.  pItem->pS
1e500 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72  elect = pSubquer
1e510 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20  y;.  pItem->pOn 
1e520 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e  = pOn;.  pItem->
1e530 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b  pUsing = pUsing;
1e540 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61  .  return p;.. a
1e550 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1e560 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  :.  assert( p==0
1e570 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
1e580 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29  rDelete(db, pOn)
1e590 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
1e5a0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69  tDelete(db, pUsi
1e5b0 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ng);.  sqlite3Se
1e5c0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1e5d0 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74  Subquery);.  ret
1e5e0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1e5f0 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42  Add an INDEXED B
1e600 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44  Y or NOT INDEXED
1e610 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d   clause to the m
1e620 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
1e630 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f  ed .** element o
1e640 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
1e650 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1e660 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
1e670 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1e680 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79  SrcListIndexedBy
1e690 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1e6a0 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65  SrcList *p, Toke
1e6b0 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a  n *pIndexedBy){.
1e6c0 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
1e6d0 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28  edBy!=0 );.  if(
1e6e0 20 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e   p && ALWAYS(p->
1e6f0 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73  nSrc>0) ){.    s
1e700 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1e710 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
1e720 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
1e730 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1e740 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 26  >notIndexed==0 &
1e750 26 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d  & pItem->zIndex=
1e760 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  =0 );.    if( pI
1e770 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26  ndexedBy->n==1 &
1e780 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a  & !pIndexedBy->z
1e790 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22   ){.      /* A "
1e7a0 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61  NOT INDEXED" cla
1e7b0 75 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64  use was supplied
1e7c0 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20  . See parse.y . 
1e7d0 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63       ** construc
1e7e0 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20  t "indexed_opt" 
1e7f0 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a  for details. */.
1e800 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74        pItem->not
1e810 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20  Indexed = 1;.   
1e820 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
1e830 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71  tem->zIndex = sq
1e840 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1e850 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
1e860 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20  IndexedBy);.    
1e870 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  }.  }.}../*.** W
1e880 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20  hen building up 
1e890 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  a FROM clause in
1e8a0 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65   the parser, the
1e8b0 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a   join operator.*
1e8c0 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61  * is initially a
1e8d0 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c  ttached to the l
1e8e0 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75  eft operand.  Bu
1e8f0 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  t the code gener
1e900 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20  ator.** expects 
1e910 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
1e920 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72  r to be on the r
1e930 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54  ight operand.  T
1e940 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53  his routine.** S
1e950 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f  hifts all join o
1e960 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65  perators from le
1e970 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20  ft to right for 
1e980 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a  an entire FROM.*
1e990 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  * clause..**.** 
1e9a0 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65  Example: Suppose
1e9b0 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b   the join is lik
1e9c0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
1e9d0 20 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61          A natura
1e9e0 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a  l cross join B.*
1e9f0 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f  *.** The operato
1ea00 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72  r is "natural cr
1ea10 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20  oss join".  The 
1ea20 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73  A and B operands
1ea30 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69   are stored.** i
1ea40 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d  n p->a[0] and p-
1ea50 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76  >a[1], respectiv
1ea60 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72  ely.  The parser
1ea70 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65   initially store
1ea80 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f  s the.** operato
1ea90 72 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20  r with A.  This 
1eaa0 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74  routine shifts t
1eab0 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65  hat operator ove
1eac0 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20  r to B..*/.void 
1ead0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68  sqlite3SrcListSh
1eae0 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c  iftJoinType(SrcL
1eaf0 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ist *p){.  if( p
1eb00 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1eb10 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63     for(i=p->nSrc
1eb20 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
1eb30 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69       p->a[i].joi
1eb40 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31  ntype = p->a[i-1
1eb50 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ].jointype;.    
1eb60 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f  }.    p->a[0].jo
1eb70 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a  intype = 0;.  }.
1eb80 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
1eb90 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
1eba0 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
1ebb0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  nTransaction(Par
1ebc0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1ebd0 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  type){.  sqlite3
1ebe0 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
1ebf0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
1ec00 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
1ec10 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
1ec20 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
1ec30 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28 20  b!=0 );./*  if( 
1ec40 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d  db->aDb[0].pBt==
1ec50 30 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a 20  0 ) return; */. 
1ec60 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1ec70 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1ec80 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
1ec90 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29  , "BEGIN", 0, 0)
1eca0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
1ecb0 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
1ecc0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1ecd0 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74  ;.  if( !v ) ret
1ece0 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21  urn;.  if( type!
1ecf0 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a  =TK_DEFERRED ){.
1ed00 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
1ed10 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
1ed20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1ed30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e  ddOp2(v, OP_Tran
1ed40 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70  saction, i, (typ
1ed50 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29  e==TK_EXCLUSIVE)
1ed60 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
1ed70 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
1ed80 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  v, i);.    }.  }
1ed90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1eda0 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
1edb0 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a  ommit, 0, 0);.}.
1edc0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
1edd0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
1ede0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
1edf0 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  tTransaction(Par
1ee00 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
1ee10 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72  dbe *v;..  asser
1ee20 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
1ee30 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1ee40 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ->db!=0 );.  if(
1ee50 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1ee60 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1ee70 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43  _TRANSACTION, "C
1ee80 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b  OMMIT", 0, 0) ){
1ee90 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1eea0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1eeb0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1eec0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
1eed0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1eee0 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
1eef0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 0);.  }.}..
1ef00 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
1ef10 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
1ef20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
1ef30 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
1ef40 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1ef50 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73    Vdbe *v;..  as
1ef60 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
1ef70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1ef80 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  rse->db!=0 );.  
1ef90 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1efa0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1efb0 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
1efc0 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20   "ROLLBACK", 0, 
1efd0 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1efe0 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
1eff0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1f000 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
1f010 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1f020 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
1f030 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20  ommit, 1, 1);.  
1f040 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
1f050 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1f060 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
1f070 20 77 68 65 6e 20 69 74 20 70 61 72 73 65 73 20   when it parses 
1f080 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65  a command to cre
1f090 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20  ate,.** release 
1f0a0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53  or rollback an S
1f0b0 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a  QL savepoint. .*
1f0c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61  /.void sqlite3Sa
1f0d0 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70  vepoint(Parse *p
1f0e0 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54  Parse, int op, T
1f0f0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
1f100 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
1f110 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1f120 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
1f130 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
1f140 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  me ){.    Vdbe *
1f150 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1f160 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e  be(pParse);.#ifn
1f170 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f180 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
1f190 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1f1a0 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d  har * const az[]
1f1b0 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52   = { "BEGIN", "R
1f1c0 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41  ELEASE", "ROLLBA
1f1d0 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72  CK" };.    asser
1f1e0 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45  t( !SAVEPOINT_BE
1f1f0 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54  GIN && SAVEPOINT
1f200 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53  _RELEASE==1 && S
1f210 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1f220 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20  K==2 );.#endif. 
1f230 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c     if( !v || sql
1f240 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1f250 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56  arse, SQLITE_SAV
1f260 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20  EPOINT, az[op], 
1f270 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20  zName, 0) ){.   
1f280 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1f290 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
1f2a0 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
1f2b0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  n;.    }.    sql
1f2c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1f2d0 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20  , OP_Savepoint, 
1f2e0 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c  op, 0, 0, zName,
1f2f0 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
1f300 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
1f310 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  sure the TEMP da
1f320 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61  tabase is open a
1f330 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  nd available for
1f340 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a   use.  Return.**
1f350 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1f360 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e  rrors.  Leave an
1f370 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
1f380 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
1f390 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
1f3a0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
1f3b0 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a  Database(Parse *
1f3c0 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
1f3d0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1f3e0 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61  >db;.  if( db->a
1f3f0 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20  Db[1].pBt==0 && 
1f400 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
1f410 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
1f420 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a      Btree *pBt;.
1f430 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1f440 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20   int flags = .  
1f450 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1f460 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a  PEN_READWRITE |.
1f470 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1f480 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
1f490 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1f4a0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
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 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
1f4d0 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
1f4e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
1f4f0 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20  P_DB;..    rc = 
1f500 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
1f510 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62  (db->pVfs, 0, db
1f520 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73  , &pBt, 0, flags
1f530 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1f540 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f550 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1f560 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
1f570 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  e to open a temp
1f580 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22  orary database "
1f590 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66  .        "file f
1f5a0 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f  or storing tempo
1f5b0 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20  rary tables");. 
1f5c0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
1f5d0 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
1f5e0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
1f5f0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d  db->aDb[1].pBt =
1f600 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74   pBt;.    assert
1f610 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ( db->aDb[1].pSc
1f620 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20  hema );.    if( 
1f630 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71  SQLITE_NOMEM==sq
1f640 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
1f650 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e  eSize(pBt, db->n
1f660 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c  extPagesize, -1,
1f670 20 30 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d   0) ){.      db-
1f680 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
1f690 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1f6a0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
1f6b0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1f6c0 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63  * Record the fac
1f6d0 74 20 74 68 61 74 20 74 68 65 20 73 63 68 65 6d  t that the schem
1f6e0 61 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65  a cookie will ne
1f6f0 65 64 20 74 6f 20 62 65 20 76 65 72 69 66 69 65  ed to be verifie
1f700 64 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62 61 73  d.** for databas
1f710 65 20 69 44 62 2e 20 20 54 68 65 20 63 6f 64 65  e iDb.  The code
1f720 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 76 65 72   to actually ver
1f730 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
1f740 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63  ookie.** will oc
1f750 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 20 6f  cur at the end o
1f760 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
1f770 56 44 42 45 20 61 6e 64 20 77 69 6c 6c 20 62 65  VDBE and will be
1f780 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61   generated.** la
1f790 74 65 72 2c 20 62 79 20 73 71 6c 69 74 65 33 46  ter, by sqlite3F
1f7a0 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a  inishCoding()..*
1f7b0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
1f7c0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50  deVerifySchema(P
1f7d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1f7e0 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20  t iDb){.  Parse 
1f7f0 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
1f800 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
1f810 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  l(pParse);.  sql
1f820 69 74 65 33 20 2a 64 62 20 3d 20 70 54 6f 70 6c  ite3 *db = pTopl
1f830 65 76 65 6c 2d 3e 64 62 3b 0a 0a 20 20 61 73 73  evel->db;..  ass
1f840 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
1f850 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
1f860 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
1f870 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69  iDb].pBt!=0 || i
1f880 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  Db==1 );.  asser
1f890 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41  t( iDb<SQLITE_MA
1f8a0 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a  X_ATTACHED+2 );.
1f8b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1f8c0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
1f8d0 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
1f8e0 20 20 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74    if( DbMaskTest
1f8f0 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b  (pToplevel->cook
1f900 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
1f910 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74  ){.    DbMaskSet
1f920 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b  (pToplevel->cook
1f930 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20  ieMask, iDb);.  
1f940 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f    pToplevel->coo
1f950 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20  kieValue[iDb] = 
1f960 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
1f970 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
1f980 6b 69 65 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d  kie;.    if( !OM
1f990 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
1f9a0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==1 ){.      sql
1f9b0 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61  ite3OpenTempData
1f9c0 62 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b  base(pToplevel);
1f9d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1f9e0 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
1f9f0 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  zDb is NULL, the
1fa00 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f  n call sqlite3Co
1fa10 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 29  deVerifySchema()
1fa20 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61 74   for each .** at
1fa30 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2e  tached database.
1fa40 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 76 6f   Otherwise, invo
1fa50 6b 65 20 69 74 20 66 6f 72 20 74 68 65 20 64 61  ke it for the da
1fa60 74 61 62 61 73 65 20 6e 61 6d 65 64 20 7a 44 62  tabase named zDb
1fa70 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73   only..*/.void s
1fa80 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1fa90 4e 61 6d 65 64 53 63 68 65 6d 61 28 50 61 72 73  NamedSchema(Pars
1faa0 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1fab0 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73   char *zDb){.  s
1fac0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1fad0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
1fae0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
1faf0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
1fb00 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
1fb10 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
1fb20 20 70 44 62 2d 3e 70 42 74 20 26 26 20 28 21 7a   pDb->pBt && (!z
1fb30 44 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33  Db || 0==sqlite3
1fb40 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 70 44 62  StrICmp(zDb, pDb
1fb50 2d 3e 7a 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20  ->zName)) ){.   
1fb60 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
1fb70 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
1fb80 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, i);.    }.  }
1fb90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1fba0 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
1fbb0 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64  t prepares for d
1fbc0 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  oing an operatio
1fbd0 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  n that.** might 
1fbe0 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62  change the datab
1fbf0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
1fc00 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61  routine starts a
1fc10 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
1fc20 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61   if we are not a
1fc30 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a  lready within.**
1fc40 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
1fc50 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   If we are alrea
1fc60 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  dy within a tran
1fc70 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20  saction, then a 
1fc80 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73  checkpoint.** is
1fc90 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53   set if the setS
1fca0 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74  tatement paramet
1fcb0 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
1fcc0 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
1fcd0 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
1fce0 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
1fcf0 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
1fd00 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
1fd10 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
1fd20 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
1fd30 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
1fd40 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
1fd50 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
1fd60 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
1fd70 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
1fd80 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
1fd90 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
1fda0 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
1fdb0 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
1fdc0 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
1fdd0 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
1fde0 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
1fdf0 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
1fe00 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
1fe10 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
1fe20 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
1fe30 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76  not be set..*/.v
1fe40 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
1fe50 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
1fe60 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1fe70 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  t setStatement, 
1fe80 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73  int iDb){.  Pars
1fe90 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
1fea0 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
1feb0 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73  vel(pParse);.  s
1fec0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1fed0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
1fee0 44 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74  Db);.  DbMaskSet
1fef0 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74  (pToplevel->writ
1ff00 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70  eMask, iDb);.  p
1ff10 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74  Toplevel->isMult
1ff20 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61  iWrite |= setSta
1ff30 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tement;.}../*.**
1ff40 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   Indicate that t
1ff50 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72  he statement cur
1ff60 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
1ff70 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20  struction might 
1ff80 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68  write.** more th
1ff90 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78  an one entry (ex
1ffa0 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20  ample: deleting 
1ffb0 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73  one row then ins
1ffc0 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a  erting another,.
1ffd0 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c  ** inserting mul
1ffe0 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20  tiple rows in a 
1fff0 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74  table, or insert
20000 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e  ing a row and in
20010 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a  dex entries.).**
20020 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63   If an abort occ
20030 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f  urs after some o
20040 66 20 74 68 65 73 65 20 77 72 69 74 65 73 20 68  f these writes h
20050 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74  ave completed, t
20060 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62  hen it will.** b
20070 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75  e necessary to u
20080 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ndo the complete
20090 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69  d writes..*/.voi
200a0 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72  d sqlite3MultiWr
200b0 69 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ite(Parse *pPars
200c0 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  e){.  Parse *pTo
200d0 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
200e0 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
200f0 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76  arse);.  pToplev
20100 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  el->isMultiWrite
20110 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20   = 1;.}../* .** 
20120 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
20130 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  or calls this ro
20140 75 74 69 6e 65 20 69 66 20 69 73 20 64 69 73 63  utine if is disc
20150 6f 76 65 72 73 20 74 68 61 74 20 69 74 20 69 73  overs that it is
20160 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  .** possible to 
20170 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e  abort a statemen
20180 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c  t prior to compl
20190 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72  etion.  In order
201a0 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20   to .** perform 
201b0 74 68 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f  this abort witho
201c0 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68  ut corrupting th
201d0 65 20 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e  e database, we n
201e0 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73  eed to make.** s
201f0 75 72 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ure that the sta
20200 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63  tement is protec
20210 74 65 64 20 62 79 20 61 20 73 74 61 74 65 6d 65  ted by a stateme
20220 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
20230 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c  **.** Technicall
20240 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  y, we only need 
20250 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79 41 62  to set the mayAb
20260 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a  ort flag if the.
20270 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20  ** isMultiWrite 
20280 66 6c 61 67 20 77 61 73 20 70 72 65 76 69 6f 75  flag was previou
20290 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72 65 20  sly set.  There 
202a0 69 73 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64  is a time depend
202b0 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61  ency.** such tha
202c0 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74  t the abort must
202d0 20 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65   occur after the
202e0 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68   multiwrite.  Th
202f0 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65  is makes.** some
20300 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f   statements invo
20310 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43  lving the REPLAC
20320 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  E conflict resol
20330 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a  ution algorithm.
20340 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66  ** go a little f
20350 61 73 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69  aster.  But taki
20360 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  ng advantage of 
20370 74 68 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64  this time depend
20380 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74  ency.** makes it
20390 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20   more difficult 
203a0 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  to prove that th
203b0 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63  e code is correc
203c0 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63  t (in .** partic
203d0 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74  ular, it prevent
203e0 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  s us from writin
203f0 67 20 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a  g an effective.*
20400 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
20410 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73 65 72   of sqlite3Asser
20420 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64  tMayAbort()) and
20430 20 73 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73   so we have chos
20440 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68  en.** to take th
20450 65 20 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64  e safe route and
20460 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69   skip the optimi
20470 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  zation..*/.void 
20480 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
20490 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
204a0 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
204b0 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
204c0 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
204d0 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
204e0 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a  mayAbort = 1;.}.
204f0 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
20500 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61 75 73  P_Halt that caus
20510 65 73 20 74 68 65 20 76 64 62 65 20 74 6f 20 72  es the vdbe to r
20520 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
20530 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72  CONSTRAINT.** er
20540 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72  ror. The onError
20550 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72   parameter deter
20560 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69 66 20  mines which (if 
20570 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74 61 74  any) of the stat
20580 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20  ement.** and/or 
20590 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
205a0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
205b0 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ck..*/.void sqli
205c0 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
205d0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
205e0 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
205f0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
20600 6e 74 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20  nt errCode,     
20610 20 2f 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72   /* extended err
20620 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  or code */.  int
20630 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
20640 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70  * Constraint typ
20650 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c  e */.  char *p4,
20660 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
20670 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69  r message */.  i
20680 38 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20  8 p4type,       
20690 20 2f 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72   /* P4_STATIC or
206a0 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f   P4_TRANSIENT */
206b0 0a 20 20 75 38 20 70 35 45 72 72 6d 73 67 20 20  .  u8 p5Errmsg  
206c0 20 20 20 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73       /* P5_ErrMs
206d0 67 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56  g type */.){.  V
206e0 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
206f0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
20700 0a 20 20 61 73 73 65 72 74 28 20 28 65 72 72 43  .  assert( (errC
20710 6f 64 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  ode&0xff)==SQLIT
20720 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a  E_CONSTRAINT );.
20730 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
20740 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73  E_Abort ){.    s
20750 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
20760 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Parse);.  }.  sq
20770 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
20780 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43  v, OP_Halt, errC
20790 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ode, onError, 0,
207a0 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20   p4, p4type);.  
207b0 69 66 28 20 70 35 45 72 72 6d 73 67 20 29 20 73  if( p5Errmsg ) s
207c0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
207d0 50 35 28 76 2c 20 70 35 45 72 72 6d 73 67 29 3b  P5(v, p5Errmsg);
207e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
207f0 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f  n OP_Halt due to
20800 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41   UNIQUE or PRIMA
20810 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
20820 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  t violation..*/.
20830 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69 71  void sqlite3Uniq
20840 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ueConstraint(.  
20850 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
20860 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
20870 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  text */.  int on
20880 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
20890 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a  onstraint type *
208a0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
208b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
208c0 65 78 20 74 68 61 74 20 74 72 69 67 67 65 72 73  ex that triggers
208d0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
208e0 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  */.){.  char *zE
208f0 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53  rr;.  int j;.  S
20900 74 72 41 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a  trAccum errMsg;.
20910 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
20920 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20  pIdx->pTable;.. 
20930 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
20940 49 6e 69 74 28 26 65 72 72 4d 73 67 2c 20 30 2c  Init(&errMsg, 0,
20950 20 30 2c 20 32 30 30 29 3b 0a 20 20 65 72 72 4d   0, 200);.  errM
20960 73 67 2e 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  sg.db = pParse->
20970 64 62 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  db;.  for(j=0; j
20980 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
20990 6a 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  j++){.    char *
209a0 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  zCol = pTab->aCo
209b0 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  l[pIdx->aiColumn
209c0 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  [j]].zName;.    
209d0 69 66 28 20 6a 20 29 20 73 71 6c 69 74 65 33 53  if( j ) sqlite3S
209e0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 65  trAccumAppend(&e
209f0 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b  rrMsg, ", ", 2);
20a00 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41  .    sqlite3StrA
20a10 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 65  ccumAppendAll(&e
20a20 72 72 4d 73 67 2c 20 70 54 61 62 2d 3e 7a 4e 61  rrMsg, pTab->zNa
20a30 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
20a40 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
20a50 65 72 72 4d 73 67 2c 20 22 2e 22 2c 20 31 29 3b  errMsg, ".", 1);
20a60 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41  .    sqlite3StrA
20a70 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c 28 26 65  ccumAppendAll(&e
20a80 72 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20  rrMsg, zCol);.  
20a90 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74  }.  zErr = sqlit
20aa0 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
20ab0 28 26 65 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c  (&errMsg);.  sql
20ac0 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
20ad0 6e 74 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  nt(pParse, .    
20ae0 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  IsPrimaryKeyInde
20af0 78 28 70 49 64 78 29 20 3f 20 53 51 4c 49 54 45  x(pIdx) ? SQLITE
20b00 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d  _CONSTRAINT_PRIM
20b10 41 52 59 4b 45 59 20 0a 20 20 20 20 20 20 20 20  ARYKEY .        
20b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b30 20 20 20 20 3a 20 53 51 4c 49 54 45 5f 43 4f 4e      : SQLITE_CON
20b40 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a  STRAINT_UNIQUE,.
20b50 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72      onError, zEr
20b60 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20 50  r, P4_DYNAMIC, P
20b70 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71  5_ConstraintUniq
20b80 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ue);.}.../*.** C
20b90 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64  ode an OP_Halt d
20ba0 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65  ue to non-unique
20bb0 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20   rowid..*/.void 
20bc0 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e 73  sqlite3RowidCons
20bd0 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
20be0 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
20bf0 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
20c00 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
20c10 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63        /* Conflic
20c20 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67  t resolution alg
20c30 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61 62 6c  orithm */.  Tabl
20c40 65 20 2a 70 54 61 62 20 20 20 20 20 20 20 2f 2a  e *pTab       /*
20c50 20 54 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   The table with 
20c60 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72  the non-unique r
20c70 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20 63 68  owid */ .){.  ch
20c80 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74 20  ar *zMsg;.  int 
20c90 72 63 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  rc;.  if( pTab->
20ca0 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20  iPKey>=0 ){.    
20cb0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
20cc0 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
20cd0 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d  , "%s.%s", pTab-
20ce0 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
20cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d00 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61    pTab->aCol[pTa
20d10 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29  b->iPKey].zName)
20d20 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
20d30 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49  E_CONSTRAINT_PRI
20d40 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c 73 65  MARYKEY;.  }else
20d50 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c  {.    zMsg = sql
20d60 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72  ite3MPrintf(pPar
20d70 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f 77 69  se->db, "%s.rowi
20d80 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
20d90 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
20da0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57  E_CONSTRAINT_ROW
20db0 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ID;.  }.  sqlite
20dc0 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
20dd0 70 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e 45 72  pParse, rc, onEr
20de0 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59  ror, zMsg, P4_DY
20df0 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20 20 20 20  NAMIC,.         
20e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
20e10 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71  5_ConstraintUniq
20e20 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ue);.}../*.** Ch
20e30 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49  eck to see if pI
20e40 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f  ndex uses the co
20e50 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
20e60 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a   pColl.  Return.
20e70 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  ** true if it do
20e80 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  es and false if 
20e90 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  it does not..*/.
20ea0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20eb0 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
20ec0 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e  ic int collation
20ed0 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72  Match(const char
20ee0 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a   *zColl, Index *
20ef0 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69  pIndex){.  int i
20f00 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c  ;.  assert( zCol
20f10 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  l!=0 );.  for(i=
20f20 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f  0; i<pIndex->nCo
20f30 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
20f40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
20f50 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
20f60 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  ];.    assert( z
20f70 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 61  !=0 || pIndex->a
20f80 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a  iColumn[i]<0 );.
20f90 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
20fa0 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26  aiColumn[i]>=0 &
20fb0 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  & 0==sqlite3StrI
20fc0 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Cmp(z, zColl) ){
20fd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
20fe0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
20ff0 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
21000 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
21010 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
21020 70 54 61 62 20 74 68 61 74 20 75 73 65 20 74 68  pTab that use th
21030 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
21040 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49  ence pColl..** I
21050 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
21060 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  recompute all in
21070 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a  dices of pTab..*
21080 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
21090 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
210a0 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
210b0 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  xTable(Parse *pP
210c0 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
210d0 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  b, char const *z
210e0 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Coll){.  Index *
210f0 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
21100 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
21110 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21120 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28   pTab */..  for(
21130 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e  pIndex=pTab->pIn
21140 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e  dex; pIndex; pIn
21150 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78  dex=pIndex->pNex
21160 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c  t){.    if( zCol
21170 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f  l==0 || collatio
21180 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49  nMatch(zColl, pI
21190 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 69  ndex) ){.      i
211a0 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
211b0 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
211c0 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
211d0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
211e0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
211f0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
21200 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 0, iDb);.    
21210 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
21220 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
21230 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  dex, -1);.    }.
21240 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
21250 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
21260 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c  l indices of all
21270 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64   tables in all d
21280 61 74 61 62 61 73 65 73 20 77 68 65 72 65 20 74  atabases where t
21290 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73  he.** indices us
212a0 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  e the collating 
212b0 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
212c0 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
212d0 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61  n recompute.** a
212e0 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65 72 79  ll indices every
212f0 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  where..*/.#ifnde
21300 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
21310 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69  INDEX.static voi
21320 64 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73  d reindexDatabas
21330 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
21340 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43  , char const *zC
21350 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b  oll){.  Db *pDb;
21360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21370 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
21380 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
21390 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
213a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
213b0 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
213c0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
213d0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
213e0 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64  ->db;   /* The d
213f0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
21400 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d  on */.  HashElem
21410 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20   *k;            
21420 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
21430 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69  ng over tables i
21440 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65  n pDb */.  Table
21450 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
21460 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c         /* A tabl
21470 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
21480 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
21490 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
214a0 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
214b0 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f  );  /* Needed fo
214c0 72 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 20  r schema access 
214d0 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20  */.  for(iDb=0, 
214e0 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62  pDb=db->aDb; iDb
214f0 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c  <db->nDb; iDb++,
21500 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73   pDb++){.    ass
21510 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20  ert( pDb!=0 );. 
21520 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48     for(k=sqliteH
21530 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70  ashFirst(&pDb->p
21540 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
21550 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61  ;  k; k=sqliteHa
21560 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20  shNext(k)){.    
21570 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a    pTab = (Table*
21580 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
21590 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65  k);.      reinde
215a0 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
215b0 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Tab, zColl);.   
215c0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
215d0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
215e0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49  code for the REI
215f0 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
21600 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
21610 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EX              
21620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
21630 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   1.**        REI
21640 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e  NDEX  <collation
21650 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
21660 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 2.**        R
21670 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
21680 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e  se>.?<tablename>
21690 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20    -- 3.**       
216a0 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
216b0 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d  base>.?<indexnam
216c0 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46  e>  -- 4.**.** F
216d0 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c  orm 1 causes all
216e0 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
216f0 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
21700 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74  es to be rebuilt
21710 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75  ..** Form 2 rebu
21720 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  ilds all indices
21730 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
21740 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e  s that use the n
21750 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e  amed.** collatin
21760 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72  g function.  For
21770 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69  ms 3 and 4 rebui
21780 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  ld the named ind
21790 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64  ex or all.** ind
217a0 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
217b0 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74  with the named t
217c0 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
217d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
217e0 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65  NDEX.void sqlite
217f0 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a  3Reindex(Parse *
21800 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
21810 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Name1, Token *pN
21820 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ame2){.  CollSeq
21830 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
21840 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
21850 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65  g sequence to be
21860 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e   reindexed, or N
21870 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ULL */.  char *z
21880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21890 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
218a0 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
218b0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
218c0 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
218d0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
218e0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54   database */.  T
218f0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
21900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
21910 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
21920 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  abase */.  Index
21930 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
21940 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
21950 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
21960 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  th pTab */.  int
21970 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
21980 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21990 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
219a0 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
219b0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
219c0 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
219d0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
219e0 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f  n */.  Token *pO
219f0 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  bjName;         
21a00 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
21a10 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
21a20 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
21a30 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   */..  /* Read t
21a40 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
21a50 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
21a60 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
21a70 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
21a80 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
21a90 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
21aa0 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28  n NULL. */.  if(
21ab0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
21ac0 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
21ad0 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74  arse) ){.    ret
21ae0 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
21af0 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20  pName1==0 ){.   
21b00 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
21b10 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20  s(pParse, 0);.  
21b20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
21b30 65 20 69 66 28 20 4e 45 56 45 52 28 70 4e 61 6d  e if( NEVER(pNam
21b40 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32  e2==0) || pName2
21b50 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  ->z==0 ){.    ch
21b60 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61  ar *zColl;.    a
21b70 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a  ssert( pName1->z
21b80 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20   );.    zColl = 
21b90 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
21ba0 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
21bb0 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
21bc0 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72  ( !zColl ) retur
21bd0 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  n;.    pColl = s
21be0 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
21bf0 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a  q(db, ENC(db), z
21c00 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66  Coll, 0);.    if
21c10 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20  ( pColl ){.     
21c20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65   reindexDatabase
21c30 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  s(pParse, zColl)
21c40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
21c50 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
21c60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
21c70 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
21c80 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
21c90 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  l);.  }.  iDb = 
21ca0 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
21cb0 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
21cc0 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a  1, pName2, &pObj
21cd0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62  Name);.  if( iDb
21ce0 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  <0 ) return;.  z
21cf0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
21d00 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a  omToken(db, pObj
21d10 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  Name);.  if( z==
21d20 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44  0 ) return;.  zD
21d30 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
21d40 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d  .zName;.  pTab =
21d50 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
21d60 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  e(db, z, zDb);. 
21d70 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
21d80 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
21d90 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a  arse, pTab, 0);.
21da0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
21db0 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65  e(db, z);.    re
21dc0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  turn;.  }.  pInd
21dd0 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
21de0 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62  Index(db, z, zDb
21df0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
21e00 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28  ee(db, z);.  if(
21e10 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73   pIndex ){.    s
21e20 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
21e30 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
21e40 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 0, iDb);.    s
21e50 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
21e60 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
21e70 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  , -1);.    retur
21e80 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
21e90 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
21ea0 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e   "unable to iden
21eb0 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20  tify the object 
21ec0 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 22  to be reindexed"
21ed0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
21ee0 2a 2a 20 52 65 74 75 72 6e 20 61 20 4b 65 79 49  ** Return a KeyI
21ef0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
21f00 61 74 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  at is appropriat
21f10 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
21f20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Index..**.** The
21f30 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
21f40 72 65 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20  re for an index 
21f50 69 73 20 63 61 63 68 65 64 20 69 6e 20 74 68 65  is cached in the
21f60 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a   Index object..*
21f70 2a 20 53 6f 20 74 68 65 72 65 20 6d 69 67 68 74  * So there might
21f80 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 72 65 66   be multiple ref
21f90 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 72  erences to the r
21fa0 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 2e  eturned pointer.
21fb0 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20    The.** caller 
21fc0 73 68 6f 75 6c 64 20 6e 6f 74 20 74 72 79 20 74  should not try t
21fd0 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 4b 65 79  o modify the Key
21fe0 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  Info object..**.
21ff0 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68  ** The caller sh
22000 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69  ould invoke sqli
22010 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
22020 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65  ) on the returne
22030 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65 6e  d object.** when
22040 20 69 74 20 68 61 73 20 66 69 6e 69 73 68 65 64   it has finished
22050 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65   using it..*/.Ke
22060 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65  yInfo *sqlite3Ke
22070 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61 72  yInfoOfIndex(Par
22080 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
22090 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20  x *pIdx){.  int 
220a0 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  i;.  int nCol = 
220b0 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  pIdx->nColumn;. 
220c0 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78   int nKey = pIdx
220d0 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79  ->nKeyCol;.  Key
220e0 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69 66  Info *pKey;.  if
220f0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
22100 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
22110 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75   pIdx->uniqNotNu
22120 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d  ll ){.    pKey =
22130 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
22140 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
22150 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79   nKey, nCol-nKey
22160 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
22170 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65  pKey = sqlite3Ke
22180 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
22190 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b  e->db, nCol, 0);
221a0 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b 65 79 20  .  }.  if( pKey 
221b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
221c0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
221d0 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20 29  riteable(pKey) )
221e0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
221f0 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
22200 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d     char *zColl =
22210 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d   pIdx->azColl[i]
22220 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
22230 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 20 20  zColl!=0 );.    
22240 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d    pKey->aColl[i]
22250 20 3d 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c   = strcmp(zColl,
22260 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 3f 20 30  "BINARY")==0 ? 0
22270 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   :.             
22280 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
22290 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
222a0 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a  pParse, zColl);.
222b0 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72        pKey->aSor
222c0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78  tOrder[i] = pIdx
222d0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b  ->aSortOrder[i];
222e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
222f0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
22300 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49       sqlite3KeyI
22310 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 29 3b 0a  nfoUnref(pKey);.
22320 20 20 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a        pKey = 0;.
22330 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22340 72 6e 20 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e  rn pKey;.}..#ifn
22350 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22360 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  CTE./* .** This 
22370 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
22380 65 64 20 6f 6e 63 65 20 70 65 72 20 43 54 45 20  ed once per CTE 
22390 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
223a0 69 6c 65 20 70 61 72 73 69 6e 67 20 61 20 0a 2a  ile parsing a .*
223b0 2a 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 0a  * WITH clause. .
223c0 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69 74 65 33  */.With *sqlite3
223d0 57 69 74 68 41 64 64 28 0a 20 20 50 61 72 73 65  WithAdd(.  Parse
223e0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
223f0 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
22400 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69 74 68 20  ntext */.  With 
22410 2a 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20  *pWith,         
22420 20 20 20 2f 2a 20 45 78 69 73 74 69 6e 67 20 57     /* Existing W
22430 49 54 48 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e  ITH clause, or N
22440 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
22450 70 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  pName,          
22460 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
22470 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a  common-table */.
22480 20 20 45 78 70 72 4c 69 73 74 20 2a 70 41 72 67    ExprList *pArg
22490 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20 4f 70 74  list,     /* Opt
224a0 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ional column nam
224b0 65 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 74  e list for the t
224c0 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  able */.  Select
224d0 20 2a 70 51 75 65 72 79 20 20 20 20 20 20 20 20   *pQuery        
224e0 20 20 2f 2a 20 51 75 65 72 79 20 75 73 65 64 20    /* Query used 
224f0 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  to initialize th
22500 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
22510 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
22520 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57 69 74 68  arse->db;.  With
22530 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61 72 20 2a   *pNew;.  char *
22540 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68 65  zName;..  /* Che
22550 63 6b 20 74 68 61 74 20 74 68 65 20 43 54 45 20  ck that the CTE 
22560 6e 61 6d 65 20 69 73 20 75 6e 69 71 75 65 20 77  name is unique w
22570 69 74 68 69 6e 20 74 68 69 73 20 57 49 54 48 20  ithin this WITH 
22580 63 6c 61 75 73 65 2e 20 49 66 0a 20 20 2a 2a 20  clause. If.  ** 
22590 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e 20 65 72  not, store an er
225a0 72 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73 65  ror in the Parse
225b0 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20   structure. */. 
225c0 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
225d0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
225e0 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29  arse->db, pName)
225f0 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26  ;.  if( zName &&
22600 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e   pWith ){.    in
22610 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
22620 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b  ; i<pWith->nCte;
22630 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
22640 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
22650 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d 3e 61 5b  zName, pWith->a[
22660 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
22670 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
22680 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
22690 22 64 75 70 6c 69 63 61 74 65 20 57 49 54 48 20  "duplicate WITH 
226a0 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22 2c  table name: %s",
226b0 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
226c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
226d0 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69  ( pWith ){.    i
226e0 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
226f0 66 28 2a 70 57 69 74 68 29 20 2b 20 28 73 69 7a  f(*pWith) + (siz
22700 65 6f 66 28 70 57 69 74 68 2d 3e 61 5b 31 5d 29  eof(pWith->a[1])
22710 20 2a 20 70 57 69 74 68 2d 3e 6e 43 74 65 29 3b   * pWith->nCte);
22720 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
22730 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
22740 20 70 57 69 74 68 2c 20 6e 42 79 74 65 29 3b 0a   pWith, nByte);.
22750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
22760 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
22770 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
22780 6f 66 28 2a 70 57 69 74 68 29 29 3b 0a 20 20 7d  of(*pWith));.  }
22790 0a 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65  .  assert( zName
227a0 21 3d 30 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29  !=0 || pNew==0 )
227b0 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
227c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20  mallocFailed==0 
227d0 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 3b 0a 0a 20  || pNew==0 );.. 
227e0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
227f0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
22800 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 41  istDelete(db, pA
22810 72 67 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  rglist);.    sql
22820 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
22830 28 64 62 2c 20 70 51 75 65 72 79 29 3b 0a 20 20  (db, pQuery);.  
22840 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
22850 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
22860 70 4e 65 77 20 3d 20 70 57 69 74 68 3b 0a 20 20  pNew = pWith;.  
22870 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
22880 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70  >a[pNew->nCte].p
22890 53 65 6c 65 63 74 20 3d 20 70 51 75 65 72 79 3b  Select = pQuery;
228a0 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
228b0 77 2d 3e 6e 43 74 65 5d 2e 70 43 6f 6c 73 20 3d  w->nCte].pCols =
228c0 20 70 41 72 67 6c 69 73 74 3b 0a 20 20 20 20 70   pArglist;.    p
228d0 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
228e0 65 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  e].zName = zName
228f0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e  ;.    pNew->a[pN
22900 65 77 2d 3e 6e 43 74 65 5d 2e 7a 45 72 72 20 3d  ew->nCte].zErr =
22910 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43   0;.    pNew->nC
22920 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  te++;.  }..  ret
22930 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
22940 2a 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74  ** Free the cont
22950 65 6e 74 73 20 6f 66 20 74 68 65 20 57 69 74 68  ents of the With
22960 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
22970 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
22980 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
22990 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65  qlite3WithDelete
229a0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
229b0 74 68 20 2a 70 57 69 74 68 29 7b 0a 20 20 69 66  th *pWith){.  if
229c0 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69  ( pWith ){.    i
229d0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
229e0 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65  0; i<pWith->nCte
229f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
22a00 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d  ruct Cte *pCte =
22a10 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20   &pWith->a[i];. 
22a20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
22a30 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
22a40 43 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20  Cte->pCols);.   
22a50 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
22a60 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d  Delete(db, pCte-
22a70 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
22a80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
22a90 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b  b, pCte->zName);
22aa0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
22ab0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 69  e3DbFree(db, pWi
22ac0 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  th);.  }.}.#endi
22ad0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
22ae0 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a  LITE_OMIT_CTE) *
22af0 2f 0a                                            /.