/ Hex Artifact Content
Login

Artifact 555826ae03c3bc589a7b09b279c2e5ba989a4178:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
0d90: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
0da0: 65 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20  e given yDbMask 
0db0: 6f 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20  object is empty 
0dc0: 2d 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73  - if it contains
0dd0: 20 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20   no.** 1 bits.  
0de0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0df0: 75 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61  used by the DbMa
0e00: 73 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20  skAllZero() and 
0e10: 44 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a  DbMaskNotZero().
0e20: 2a 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53  ** macros when S
0e30: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
0e40: 45 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ED is greater th
0e50: 61 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51  an 30..*/.#if SQ
0e60: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0e70: 44 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33  D>30.int sqlite3
0e80: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44  DbMaskAllZero(yD
0e90: 62 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20  bMask m){.  int 
0ea0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
0eb0: 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b  sizeof(yDbMask);
0ec0: 20 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29   i++) if( m[i] )
0ed0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
0ee0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
0ef0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
0f00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
0f10: 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c  ter a single SQL
0f20: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f30: 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e  een.** parsed an
0f40: 64 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  d a VDBE program
0f50: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74   to execute that
0f60: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f70: 65 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e  een.** prepared.
0f80: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70    This routine p
0f90: 75 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e  uts the finishin
0fa0: 67 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65  g touches on the
0fb0: 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d  .** VDBE program
0fc0: 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
0fd0: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0fe0: 20 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a   for the next.**
0ff0: 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   parse..**.** No
1000: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
1010: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
1020: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
1030: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
1040: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
1050: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
1060: 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
1070: 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ng(Parse *pParse
1080: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1090: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
10a0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
10b0: 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a  pToplevel==0 );.
10c0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
10d0: 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  b;.  if( db->mal
10e0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
10f0: 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
1100: 2d 3e 6e 65 73 74 65 64 20 29 20 72 65 74 75 72  ->nested ) retur
1110: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
1120: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
1130: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67  .  /* Begin by g
1140: 65 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74  enerating some t
1150: 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20  ermination code 
1160: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
1170: 65 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67  e.  ** vdbe prog
1180: 72 61 6d 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  ram.  */.  v = s
1190: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
11a0: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
11b0: 20 21 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74   !pParse->isMult
11c0: 69 57 72 69 74 65 20 0a 20 20 20 20 20 20 20 7c  iWrite .       |
11d0: 7c 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  | sqlite3VdbeAss
11e0: 65 72 74 4d 61 79 41 62 6f 72 74 28 76 2c 20 70  ertMayAbort(v, p
11f0: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
1200: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
1210: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
1220: 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f  VdbeDeletePriorO
1230: 70 63 6f 64 65 28 76 2c 20 4f 50 5f 43 6c 6f 73  pcode(v, OP_Clos
1240: 65 29 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74  e) ){}.    sqlit
1250: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
1260: 4f 50 5f 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53  OP_Halt);..#if S
1270: 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
1280: 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 69 66  NTICATION.    if
1290: 28 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65  ( pParse->nTable
12a0: 4c 6f 63 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e  Lock>0 && db->in
12b0: 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20  it.busy==0 ){.  
12c0: 20 20 20 20 73 71 6c 69 74 65 33 55 73 65 72 41      sqlite3UserA
12d0: 75 74 68 49 6e 69 74 28 64 62 29 3b 0a 20 20 20  uthInit(db);.   
12e0: 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e     if( db->auth.
12f0: 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f  authLevel<UAUTH_
1300: 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  User ){.        
1310: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
1320: 49 54 45 5f 41 55 54 48 5f 55 53 45 52 3b 0a 20  ITE_AUTH_USER;. 
1330: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1340: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1350: 75 73 65 72 20 6e 6f 74 20 61 75 74 68 65 6e 74  user not authent
1360: 69 63 61 74 65 64 22 29 3b 0a 20 20 20 20 20 20  icated");.      
1370: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
1380: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
1390: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69      /* The cooki
13a0: 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20  e mask contains 
13b0: 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  one bit for each
13c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
13d0: 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74  pen..    ** (Bit
13e0: 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20   0 is for main, 
13f0: 62 69 74 20 31 20 69 73 20 66 6f 72 20 74 65 6d  bit 1 is for tem
1400: 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  p, and so forth.
1410: 29 20 20 42 69 74 73 20 61 72 65 0a 20 20 20 20  )  Bits are.    
1420: 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68 20  ** set for each 
1430: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
1440: 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74 65   used.  Generate
1450: 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20 61   code to start a
1460: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
1470: 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65 64  ion on each used
1480: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 6f   database and to
1490: 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
14a0: 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a  ma cookie.    **
14b0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
14c0: 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
14d0: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
14e0: 63 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20  cFailed==0 .    
14f0: 20 26 26 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65   && (DbMaskNonZe
1500: 72 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  ro(pParse->cooki
1510: 65 4d 61 73 6b 29 20 7c 7c 20 70 50 61 72 73 65  eMask) || pParse
1520: 2d 3e 70 43 6f 6e 73 74 45 78 70 72 29 0a 20 20  ->pConstExpr).  
1530: 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69    ){.      int i
1540: 44 62 2c 20 69 3b 0a 20 20 20 20 20 20 61 73 73  Db, i;.      ass
1550: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
1560: 47 65 74 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63  GetOp(v, 0)->opc
1570: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a  ode==OP_Init );.
1580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1590: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 30 29 3b  eJumpHere(v, 0);
15a0: 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30  .      for(iDb=0
15b0: 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
15c0: 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Db++){.        i
15d0: 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 50  f( DbMaskTest(pP
15e0: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
15f0: 2c 20 69 44 62 29 3d 3d 30 20 29 20 63 6f 6e 74  , iDb)==0 ) cont
1600: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71  inue;.        sq
1610: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
1620: 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  ee(v, iDb);.    
1630: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1640: 64 64 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20  ddOp4Int(v,.    
1650: 20 20 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63        OP_Transac
1660: 74 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  tion,           
1670: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
1680: 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  de */.          
1690: 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  iDb,            
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20     /* P1 */.    
16c0: 20 20 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74        DbMaskTest
16d0: 28 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61  (pParse->writeMa
16e0: 73 6b 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a  sk,iDb), /* P2 *
16f0: 2f 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  /.          pPar
1700: 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  se->cookieValue[
1710: 69 44 62 5d 2c 20 20 20 20 20 20 20 20 20 20 2f  iDb],          /
1720: 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20  * P3 */.        
1730: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70    db->aDb[iDb].p
1740: 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61 74  Schema->iGenerat
1750: 69 6f 6e 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20  ion  /* P4 */.  
1760: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
1770: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
1780: 73 79 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  sy==0 ) sqlite3V
1790: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31  dbeChangeP5(v, 1
17a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  );.      }.#ifnd
17b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
17c0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
17d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
17e0: 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b 20  rse->nVtabLock; 
17f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
1800: 61 72 20 2a 76 74 61 62 20 3d 20 28 63 68 61 72  ar *vtab = (char
1810: 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61   *)sqlite3GetVTa
1820: 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  ble(db, pParse->
1830: 61 70 56 74 61 62 4c 6f 63 6b 5b 69 5d 29 3b 0a  apVtabLock[i]);.
1840: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1850: 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1860: 56 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 2c  VBegin, 0, 0, 0,
1870: 20 76 74 61 62 2c 20 50 34 5f 56 54 41 42 29 3b   vtab, P4_VTAB);
1880: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1890: 50 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b  Parse->nVtabLock
18a0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
18b0: 20 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20      /* Once all 
18c0: 74 68 65 20 63 6f 6f 6b 69 65 73 20 68 61 76 65  the cookies have
18d0: 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 61   been verified a
18e0: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nd transactions 
18f0: 6f 70 65 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a  opened, .      *
1900: 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71  * obtain the req
1910: 75 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b  uired table-lock
1920: 73 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  s. This is a no-
1930: 6f 70 20 75 6e 6c 65 73 73 20 74 68 65 20 0a 20  op unless the . 
1940: 20 20 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63       ** shared-c
1950: 61 63 68 65 20 66 65 61 74 75 72 65 20 69 73 20  ache feature is 
1960: 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a  enabled..      *
1970: 2f 0a 20 20 20 20 20 20 63 6f 64 65 54 61 62 6c  /.      codeTabl
1980: 65 4c 6f 63 6b 73 28 70 50 61 72 73 65 29 3b 0a  eLocks(pParse);.
1990: 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  .      /* Initia
19a0: 6c 69 7a 65 20 61 6e 79 20 41 55 54 4f 49 4e 43  lize any AUTOINC
19b0: 52 45 4d 45 4e 54 20 64 61 74 61 20 73 74 72 75  REMENT data stru
19c0: 63 74 75 72 65 73 20 72 65 71 75 69 72 65 64 2e  ctures required.
19d0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19e0: 73 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65  sqlite3Autoincre
19f0: 6d 65 6e 74 42 65 67 69 6e 28 70 50 61 72 73 65  mentBegin(pParse
1a00: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
1a10: 65 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65  e constant expre
1a20: 73 73 69 6f 6e 73 20 74 68 61 74 20 77 68 65 72  ssions that wher
1a30: 65 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 6f  e factored out o
1a40: 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f  f inner loops */
1a50: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
1a60: 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 29 7b  e->pConstExpr ){
1a70: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
1a80: 74 20 2a 70 45 4c 20 3d 20 70 50 61 72 73 65 2d  t *pEL = pParse-
1a90: 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20  >pConstExpr;.   
1aa0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43       pParse->okC
1ab0: 6f 6e 73 74 46 61 63 74 6f 72 20 3d 20 30 3b 0a  onstFactor = 0;.
1ac0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1ad0: 20 69 3c 70 45 4c 2d 3e 6e 45 78 70 72 3b 20 69   i<pEL->nExpr; i
1ae0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
1af0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1b00: 50 61 72 73 65 2c 20 70 45 4c 2d 3e 61 5b 69 5d  Parse, pEL->a[i]
1b10: 2e 70 45 78 70 72 2c 20 70 45 4c 2d 3e 61 5b 69  .pExpr, pEL->a[i
1b20: 5d 2e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ].u.iConstExprRe
1b30: 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
1b40: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1b50: 46 69 6e 61 6c 6c 79 2c 20 6a 75 6d 70 20 62 61  Finally, jump ba
1b60: 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ck to the beginn
1b70: 69 6e 67 20 6f 66 20 74 68 65 20 65 78 65 63 75  ing of the execu
1b80: 74 61 62 6c 65 20 63 6f 64 65 2e 20 2a 2f 0a 20  table code. */. 
1b90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ba0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
1bb0: 6f 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  o, 0, 1);.    }.
1bc0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74    }...  /* Get t
1bd0: 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20  he VDBE program 
1be0: 72 65 61 64 79 20 66 6f 72 20 65 78 65 63 75 74  ready for execut
1bf0: 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76  ion.  */.  if( v
1c00: 20 26 26 20 41 4c 57 41 59 53 28 70 50 61 72 73   && ALWAYS(pPars
1c10: 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26 26 20 21  e->nErr==0) && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1c40: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1c50: 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69  vel==0 );  /* Di
1c60: 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e  sables and re-en
1c70: 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20  ables match */. 
1c80: 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d 20     /* A minimum 
1c90: 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20 69 73  of one cursor is
1ca0: 20 72 65 71 75 69 72 65 64 20 69 66 20 61 75 74   required if aut
1cb0: 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75 73  oincrement is us
1cc0: 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20 74 69  ed.    *  See ti
1cd0: 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63 31 66  cket [a696379c1f
1ce0: 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20 69 66  08866] */.    if
1cf0: 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e 63 21  ( pParse->pAinc!
1d00: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 54  =0 && pParse->nT
1d10: 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65 2d 3e  ab==0 ) pParse->
1d20: 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20 73 71  nTab = 1;.    sq
1d30: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61  lite3VdbeMakeRea
1d40: 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b 0a 20  dy(v, pParse);. 
1d50: 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20     pParse->rc = 
1d60: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
1d70: 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65   pParse->colName
1d80: 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  sSet = 0;.  }els
1d90: 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  e{.    pParse->r
1da0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1db0: 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  ;.  }.  pParse->
1dc0: 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72  nTab = 0;.  pPar
1dd0: 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20  se->nMem = 0;.  
1de0: 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30  pParse->nSet = 0
1df0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  ;.  pParse->nVar
1e00: 20 3d 20 30 3b 0a 20 20 44 62 4d 61 73 6b 5a 65   = 0;.  DbMaskZe
1e10: 72 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  ro(pParse->cooki
1e20: 65 4d 61 73 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eMask);.}../*.**
1e30: 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20   Run the parser 
1e40: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
1e50: 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69  or recursively i
1e60: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72  n order to gener
1e70: 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20  ate.** code for 
1e80: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
1e90: 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65  t given onto the
1ea0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72   end of the pPar
1eb0: 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75  se context.** cu
1ec0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
1ed0: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65  nstruction.  Whe
1ee0: 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20  n the parser is 
1ef0: 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a  run recursively.
1f00: 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65  ** this way, the
1f10: 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69   final OP_Halt i
1f20: 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61  s not appended a
1f30: 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c  nd other initial
1f40: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66  ization.** and f
1f50: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70  inalization step
1f60: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65  s are omitted be
1f70: 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20  cause those are 
1f80: 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a  handling by the.
1f90: 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72  ** outermost par
1fa0: 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65  ser..**.** Not e
1fb0: 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73  verything is nes
1fc0: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63  table.  This fac
1fd0: 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65  ility is designe
1fe0: 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49  d to permit.** I
1ff0: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61  NSERT, UPDATE, a
2000: 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74  nd DELETE operat
2010: 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c  ions against SQL
2020: 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65  ITE_MASTER.  Use
2030: 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20  .** care if you 
2040: 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f  decide to try to
2050: 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   use this routin
2060: 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
2070: 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f   purposes..*/.vo
2080: 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  id sqlite3Nested
2090: 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61  Parse(Parse *pPa
20a0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
20b0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
20c0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
20d0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68  char *zSql;.  ch
20e0: 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
20f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2100: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64   pParse->db;.# d
2110: 65 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28  efine SAVE_SZ  (
2120: 73 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20  sizeof(Parse) - 
2130: 6f 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e  offsetof(Parse,n
2140: 56 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76  Var)).  char sav
2150: 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a  eBuf[SAVE_SZ];..
2160: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
2170: 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  rr ) return;.  a
2180: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
2190: 65 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20  ested<10 );  /* 
21a0: 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f  Nesting should o
21b0: 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65  nly be of limite
21c0: 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f  d depth */.  va_
21d0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
21e0: 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  t);.  zSql = sql
21f0: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c  ite3VMPrintf(db,
2200: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
2210: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
2220: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
2230: 20 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41    return;   /* A
2240: 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   malloc must hav
2250: 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  e failed */.  }.
2260: 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64    pParse->nested
2270: 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76  ++;.  memcpy(sav
2280: 65 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e  eBuf, &pParse->n
2290: 56 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20  Var, SAVE_SZ);. 
22a0: 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d   memset(&pParse-
22b0: 3e 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53  >nVar, 0, SAVE_S
22c0: 5a 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e  Z);.  sqlite3Run
22d0: 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a  Parser(pParse, z
22e0: 53 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  Sql, &zErrMsg);.
22f0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2300: 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
2310: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2320: 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70  , zSql);.  memcp
2330: 79 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  y(&pParse->nVar,
2340: 20 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53   saveBuf, SAVE_S
2350: 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65  Z);.  pParse->ne
2360: 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53  sted--;.}..#if S
2370: 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
2380: 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  NTICATION./*.** 
2390: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a  Return TRUE if z
23a0: 54 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d  Table is the nam
23b0: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
23c0: 74 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65  table that store
23d0: 73 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66  s the.** list of
23e0: 20 75 73 65 72 73 20 61 6e 64 20 74 68 65 69 72   users and their
23f0: 20 61 63 63 65 73 73 20 63 72 65 64 65 6e 74 69   access credenti
2400: 61 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  als..*/.int sqli
2410: 74 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65  te3UserAuthTable
2420: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61  (const char *zTa
2430: 62 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  ble){.  return s
2440: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
2450: 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75  Table, "sqlite_u
2460: 73 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64  ser")==0;.}.#end
2470: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  if../*.** Locate
2480: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
2490: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
24a0: 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63  scribes a partic
24b0: 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a  ular database.**
24c0: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65   table given the
24d0: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61   name of that ta
24e0: 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61  ble and (optiona
24f0: 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66  lly) the name of
2500: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
2510: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
2520: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
2530: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
2540: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61  ..**.** If zData
2550: 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64  base is 0, all d
2560: 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61  atabases are sea
2570: 72 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61  rched for the ta
2580: 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66  ble and the.** f
2590: 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61  irst matching ta
25a0: 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ble is returned.
25b0: 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66    (No checking f
25c0: 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62  or duplicate tab
25d0: 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64  le.** names is d
25e0: 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63  one.)  The searc
25f0: 68 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20  h order is TEMP 
2600: 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e  first, then MAIN
2610: 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75  , then any.** au
2620: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2630: 73 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68  s added using th
2640: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
2650: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
2660: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
2670: 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ble()..*/.Table 
2680: 2a 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c  *sqlite3FindTabl
2690: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
26a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
26b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
26c0: 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c  atabase){.  Tabl
26d0: 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *p = 0;.  int 
26e0: 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e 61  i;.  assert( zNa
26f0: 6d 65 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 41 6c  me!=0 );.  /* Al
2700: 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65  l mutexes are re
2710: 71 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d  quired for schem
2720: 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20  a access.  Make 
2730: 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65  sure we hold the
2740: 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  m. */.  assert( 
2750: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c 20  zDatabase!=0 || 
2760: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2770: 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20  sAllMutexes(db) 
2780: 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53  );.#if SQLITE_US
2790: 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
27a0: 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20  N.  /* Only the 
27b0: 61 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61 6c  admin user is al
27c0: 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68  lowed to know th
27d0: 61 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75 73  at the sqlite_us
27e0: 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78  er table.  ** ex
27f0: 69 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62  ists */.  if( db
2800: 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c  ->auth.authLevel
2810: 3c 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26 20  <UAUTH_Admin && 
2820: 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54  sqlite3UserAuthT
2830: 61 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29  able(zName)!=0 )
2840: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
2850: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72    }.#endif.  for
2860: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
2870: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
2880: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
2890: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20  2) ? i^1 : i;   
28a0: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
28b0: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
28c0: 20 20 69 66 28 20 7a 44 61 74 61 62 61 73 65 21    if( zDatabase!
28d0: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
28e0: 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20  ICmp(zDatabase, 
28f0: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65  db->aDb[j].zName
2900: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2910: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2920: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
2930: 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20  (db, j, 0) );.  
2940: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
2950: 68 46 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a  hFind(&db->aDb[j
2960: 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ].pSchema->tblHa
2970: 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  sh, zName);.    
2980: 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20  if( p ) break;. 
2990: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
29a0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
29b0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
29c0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
29d0: 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c  ribes a particul
29e0: 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  ar database.** t
29f0: 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e  able given the n
2a00: 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c  ame of that tabl
2a10: 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c  e and (optionall
2a20: 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  y) the name of t
2a30: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
2a40: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
2a50: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ble.  Return NUL
2a60: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20  L if not found. 
2a70: 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a   Also leave an.*
2a80: 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * error message 
2a90: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
2aa0: 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  sg..**.** The di
2ab0: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
2ac0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
2ad0: 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  d sqlite3FindTab
2ae0: 6c 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  le() is that thi
2af0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61  s.** routine lea
2b00: 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ves an error mes
2b10: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
2b20: 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a  zErrMsg where.**
2b30: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
2b40: 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f  e() does not..*/
2b50: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c  .Table *sqlite3L
2b60: 6f 63 61 74 65 54 61 62 6c 65 28 0a 20 20 50 61  ocateTable(.  Pa
2b70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2b80: 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20       /* context 
2b90: 69 6e 20 77 68 69 63 68 20 74 6f 20 72 65 70 6f  in which to repo
2ba0: 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  rt errors */.  i
2bb0: 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20  nt isView,      
2bc0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2bd0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 56   looking for a V
2be0: 49 45 57 20 72 61 74 68 65 72 20 74 68 61 6e 20  IEW rather than 
2bf0: 61 20 54 41 42 4c 45 20 2a 2f 0a 20 20 63 6f 6e  a TABLE */.  con
2c00: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
2c10: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2c20: 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
2c30: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20  looking for */. 
2c40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2c50: 61 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ase     /* Name 
2c60: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
2c70: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
2c80: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
2c90: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
2ca0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
2cb0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
2cc0: 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
2cd0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
2ce0: 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
2cf0: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
2d00: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
2d10: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
2d20: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
2d30: 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
2d40: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20  n 0;.  }..  p = 
2d50: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2d60: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
2d70: 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69  me, zDbase);.  i
2d80: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63  f( p==0 ){.    c
2d90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20  onst char *zMsg 
2da0: 3d 20 69 73 56 69 65 77 20 3f 20 22 6e 6f 20 73  = isView ? "no s
2db0: 75 63 68 20 76 69 65 77 22 20 3a 20 22 6e 6f 20  uch view" : "no 
2dc0: 73 75 63 68 20 74 61 62 6c 65 22 3b 0a 20 20 20  such table";.   
2dd0: 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20   if( zDbase ){. 
2de0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2df0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
2e00: 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73 67 2c 20  : %s.%s", zMsg, 
2e10: 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a  zDbase, zName);.
2e20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e30: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2e40: 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73  (pParse, "%s: %s
2e50: 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65 29 3b  ", zMsg, zName);
2e60: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
2e70: 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
2e80: 20 31 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49   1;.  }.#if SQLI
2e90: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 49 43  TE_USER_AUTHENIC
2ea0: 41 54 49 4f 4e 0a 20 20 65 6c 73 65 20 69 66 28  ATION.  else if(
2eb0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 75 74   pParse->db->aut
2ec0: 68 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54  h.authLevel<UAUT
2ed0: 48 5f 55 73 65 72 20 29 7b 0a 20 20 20 20 73 71  H_User ){.    sq
2ee0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2ef0: 61 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20  arse, "user not 
2f00: 61 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b  authenticated");
2f10: 0a 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 7d 0a  .    p = 0;.  }.
2f20: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
2f30: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
2f40: 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 64 65  te the table ide
2f50: 6e 74 69 66 69 65 64 20 62 79 20 2a 70 2e 0a 2a  ntified by *p..*
2f60: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 77  *.** This is a w
2f70: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71  rapper around sq
2f80: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
2f90: 28 29 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e  (). The differen
2fa0: 63 65 20 62 65 74 77 65 65 6e 0a 2a 2a 20 73 71  ce between.** sq
2fb0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
2fc0: 28 29 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  () and this func
2fd0: 74 69 6f 6e 20 69 73 20 74 68 61 74 20 74 68 69  tion is that thi
2fe0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 74 72  s function restr
2ff0: 69 63 74 73 0a 2a 2a 20 74 68 65 20 73 65 61 72  icts.** the sear
3000: 63 68 20 74 6f 20 73 63 68 65 6d 61 20 28 70 2d  ch to schema (p-
3010: 3e 70 53 63 68 65 6d 61 29 20 69 66 20 69 74 20  >pSchema) if it 
3020: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e  is not NULL. p->
3030: 70 53 63 68 65 6d 61 20 6d 61 79 20 62 65 0a 2a  pSchema may be.*
3040: 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 69 74  * non-NULL if it
3050: 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 76 69   is part of a vi
3060: 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 70 72  ew or trigger pr
3070: 6f 67 72 61 6d 20 64 65 66 69 6e 69 74 69 6f 6e  ogram definition
3080: 2e 20 53 65 65 0a 2a 2a 20 73 71 6c 69 74 65 33  . See.** sqlite3
3090: 46 69 78 53 72 63 4c 69 73 74 28 29 20 66 6f 72  FixSrcList() for
30a0: 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62   details..*/.Tab
30b0: 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  le *sqlite3Locat
30c0: 65 54 61 62 6c 65 49 74 65 6d 28 0a 20 20 50 61  eTableItem(.  Pa
30d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
30e0: 69 6e 74 20 69 73 56 69 65 77 2c 20 0a 20 20 73  int isView, .  s
30f0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3100: 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e 73 74  em *p.){.  const
3110: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 61 73   char *zDb;.  as
3120: 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65 6d 61  sert( p->pSchema
3130: 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74 61 62  ==0 || p->zDatab
3140: 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ase==0 );.  if( 
3150: 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  p->pSchema ){.  
3160: 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
3170: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
3180: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e  (pParse->db, p->
3190: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7a 44  pSchema);.    zD
31a0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  b = pParse->db->
31b0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
31c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62    }else{.    zDb
31d0: 20 3d 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3b   = p->zDatabase;
31e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
31f0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
3200: 28 70 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c  (pParse, isView,
3210: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b   p->zName, zDb);
3220: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
3230: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
3240: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
3250: 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61  scribes .** a pa
3260: 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67  rticular index g
3270: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
3280: 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61   that index.** a
3290: 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
32a0: 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74  he database that
32b0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e   contains the in
32c0: 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e  dex..** Return N
32d0: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
32e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61  ..**.** If zData
32f0: 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64  base is 0, all d
3300: 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61  atabases are sea
3310: 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a  rched for the.**
3320: 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 66   table and the f
3330: 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 69 6e  irst matching in
3340: 64 65 78 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dex is returned.
3350: 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a    (No checking.*
3360: 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  * for duplicate 
3370: 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73 20 64  index names is d
3380: 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63  one.)  The searc
3390: 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54 45  h order is.** TE
33a0: 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d  MP first, then M
33b0: 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61 75  AIN, then any au
33c0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
33d0: 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67  s added.** using
33e0: 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d   the ATTACH comm
33f0: 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  and..*/.Index *s
3400: 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
3410: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
3420: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
3430: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29  const char *zDb)
3440: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 30  {.  Index *p = 0
3450: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 2f 2a 20  ;.  int i;.  /* 
3460: 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20  All mutexes are 
3470: 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 63 68  required for sch
3480: 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b  ema access.  Mak
3490: 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74  e sure we hold t
34a0: 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  hem. */.  assert
34b0: 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71 6c 69  ( zDb!=0 || sqli
34c0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
34d0: 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20  Mutexes(db) );. 
34e0: 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50   for(i=OMIT_TEMP
34f0: 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  DB; i<db->nDb; i
3500: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
3510: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
3520: 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d  ;  /* Search TEM
3530: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
3540: 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63  .    Schema *pSc
3550: 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 6a  hema = db->aDb[j
3560: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61  ].pSchema;.    a
3570: 73 73 65 72 74 28 20 70 53 63 68 65 6d 61 20 29  ssert( pSchema )
3580: 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26  ;.    if( zDb &&
3590: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
35a0: 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  zDb, db->aDb[j].
35b0: 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  zName) ) continu
35c0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  e;.    assert( s
35d0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
35e0: 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20  xHeld(db, j, 0) 
35f0: 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
3600: 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63 68  e3HashFind(&pSch
3610: 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e  ema->idxHash, zN
3620: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20  ame);.    if( p 
3630: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
3640: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
3650: 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65  * Reclaim the me
3660: 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20  mory used by an 
3670: 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20  index.*/.static 
3680: 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28 73  void freeIndex(s
3690: 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65  qlite3 *db, Inde
36a0: 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53  x *p){.#ifndef S
36b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59  QLITE_OMIT_ANALY
36c0: 5a 45 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  ZE.  sqlite3Dele
36d0: 74 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 64  teIndexSamples(d
36e0: 62 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20  b, p);.#endif.  
36f0: 69 66 28 20 64 62 3d 3d 30 20 7c 7c 20 64 62 2d  if( db==0 || db-
3700: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
3710: 20 29 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   ) sqlite3KeyInf
3720: 6f 55 6e 72 65 66 28 70 2d 3e 70 4b 65 79 49 6e  oUnref(p->pKeyIn
3730: 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  fo);.  sqlite3Ex
3740: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  prDelete(db, p->
3750: 70 50 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a  pPartIdxWhere);.
3760: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3770: 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b  db, p->zColAff);
3780: 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 69  .  if( p->isResi
3790: 7a 65 64 20 29 20 73 71 6c 69 74 65 33 44 62 46  zed ) sqlite3DbF
37a0: 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 43 6f 6c  ree(db, p->azCol
37b0: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  l);.  sqlite3DbF
37c0: 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
37d0: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64  *.** For the ind
37e0: 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61  ex called zIdxNa
37f0: 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e  me which is foun
3800: 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
3810: 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65  e iDb,.** unlike
3820: 20 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d   that index from
3830: 20 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20   its Table then 
3840: 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
3850: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64   from.** the ind
3860: 65 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e  ex hash table an
3870: 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  d free all memor
3880: 79 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73  y structures ass
3890: 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
38a0: 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f  the index..*/.vo
38b0: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
38c0: 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73  AndDeleteIndex(s
38d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
38e0: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
38f0: 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e  *zIdxName){.  In
3900: 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 48  dex *pIndex;.  H
3910: 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61  ash *pHash;..  a
3920: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
3930: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
3940: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70  , iDb, 0) );.  p
3950: 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b  Hash = &db->aDb[
3960: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64  iDb].pSchema->id
3970: 78 48 61 73 68 3b 0a 20 20 70 49 6e 64 65 78 20  xHash;.  pIndex 
3980: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
3990: 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78 4e  ert(pHash, zIdxN
39a0: 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 41  ame, 0);.  if( A
39b0: 4c 57 41 59 53 28 70 49 6e 64 65 78 29 20 29 7b  LWAYS(pIndex) ){
39c0: 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
39d0: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d  >pTable->pIndex=
39e0: 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20  =pIndex ){.     
39f0: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
3a00: 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
3a10: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
3a20: 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
3a30: 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73  *p;.      /* Jus
3a40: 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c  tification of AL
3a50: 57 41 59 53 28 29 3b 20 20 54 68 65 20 69 6e 64  WAYS();  The ind
3a60: 65 78 20 6d 75 73 74 20 62 65 20 6f 6e 20 74 68  ex must be on th
3a70: 65 20 6c 69 73 74 20 6f 66 0a 20 20 20 20 20 20  e list of.      
3a80: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20  ** indices. */. 
3a90: 20 20 20 20 20 70 20 3d 20 70 49 6e 64 65 78 2d       p = pIndex-
3aa0: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b  >pTable->pIndex;
3ab0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
3ac0: 57 41 59 53 28 70 29 20 26 26 20 70 2d 3e 70 4e  WAYS(p) && p->pN
3ad0: 65 78 74 21 3d 70 49 6e 64 65 78 20 29 7b 20 70  ext!=pIndex ){ p
3ae0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20   = p->pNext; }. 
3af0: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
3b00: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70  p && p->pNext==p
3b10: 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20  Index) ){.      
3b20: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e    p->pNext = pIn
3b30: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
3b40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72    }.    }.    fr
3b50: 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
3b60: 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66  ex);.  }.  db->f
3b70: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
3b80: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
3b90: 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f  ./*.** Look thro
3ba0: 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ugh the list of 
3bb0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
3bc0: 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  les in db->aDb[]
3bd0: 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79 20 68   and if.** any h
3be0: 61 76 65 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c  ave been closed,
3bf0: 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f   remove them fro
3c00: 6d 20 74 68 65 20 6c 69 73 74 2e 20 20 52 65 61  m the list.  Rea
3c10: 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a 20 64  llocate the.** d
3c20: 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63 74 75  b->aDb[] structu
3c30: 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65 72 20  re to a smaller 
3c40: 73 69 7a 65 2c 20 69 66 20 70 6f 73 73 69 62 6c  size, if possibl
3c50: 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20 30  e..**.** Entry 0
3c60: 20 28 74 68 65 20 22 6d 61 69 6e 22 20 64 61 74   (the "main" dat
3c70: 61 62 61 73 65 29 20 61 6e 64 20 65 6e 74 72 79  abase) and entry
3c80: 20 31 20 28 74 68 65 20 22 74 65 6d 70 22 20 64   1 (the "temp" d
3c90: 61 74 61 62 61 73 65 29 0a 2a 2a 20 61 72 65 20  atabase).** are 
3ca0: 6e 65 76 65 72 20 63 61 6e 64 69 64 61 74 65 73  never candidates
3cb0: 20 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c 6c 61   for being colla
3cc0: 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  psed..*/.void sq
3cd0: 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74  lite3CollapseDat
3ce0: 61 62 61 73 65 41 72 72 61 79 28 73 71 6c 69 74  abaseArray(sqlit
3cf0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
3d00: 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 32  , j;.  for(i=j=2
3d10: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
3d20: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
3d30: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3d40: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3d50: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
3d60: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3d70: 64 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b  db, pDb->zName);
3d80: 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d  .      pDb->zNam
3d90: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  e = 0;.      con
3da0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
3db0: 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20   if( j<i ){.    
3dc0: 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64    db->aDb[j] = d
3dd0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d  b->aDb[i];.    }
3de0: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
3df0: 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b  memset(&db->aDb[
3e00: 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d  j], 0, (db->nDb-
3e10: 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44  j)*sizeof(db->aD
3e20: 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44  b[j]));.  db->nD
3e30: 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d  b = j;.  if( db-
3e40: 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61  >nDb<=2 && db->a
3e50: 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69  Db!=db->aDbStati
3e60: 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  c ){.    memcpy(
3e70: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64  db->aDbStatic, d
3e80: 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66  b->aDb, 2*sizeof
3e90: 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20  (db->aDb[0]));. 
3ea0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3eb0: 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20  (db, db->aDb);. 
3ec0: 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d     db->aDb = db-
3ed0: 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a  >aDbStatic;.  }.
3ee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74  }../*.** Reset t
3ef0: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
3f00: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 69 6e  e database at in
3f10: 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f 20 72  dex iDb.  Also r
3f20: 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45 4d 50  eset the.** TEMP
3f30: 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 76 6f 69 64   schema..*/.void
3f40: 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65   sqlite3ResetOne
3f50: 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a  Schema(sqlite3 *
3f60: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
3f70: 44 62 20 2a 70 44 62 3b 0a 20 20 61 73 73 65 72  Db *pDb;.  asser
3f80: 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
3f90: 3b 0a 0a 20 20 2f 2a 20 43 61 73 65 20 31 3a 20  ;..  /* Case 1: 
3fa0: 20 52 65 73 65 74 20 74 68 65 20 73 69 6e 67 6c   Reset the singl
3fb0: 65 20 73 63 68 65 6d 61 20 69 64 65 6e 74 69 66  e schema identif
3fc0: 69 65 64 20 62 79 20 69 44 62 20 2a 2f 0a 20 20  ied by iDb */.  
3fd0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
3fe0: 44 62 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 73  Db];.  assert( s
3ff0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
4000: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
4010: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
4020: 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30 20 29  Db->pSchema!=0 )
4030: 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d  ;.  sqlite3Schem
4040: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
4050: 65 6d 61 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  ema);..  /* If a
4060: 6e 79 20 64 61 74 61 62 61 73 65 20 6f 74 68 65  ny database othe
4070: 72 20 74 68 61 6e 20 54 45 4d 50 20 69 73 20 72  r than TEMP is r
4080: 65 73 65 74 2c 20 74 68 65 6e 20 61 6c 73 6f 20  eset, then also 
4090: 72 65 73 65 74 20 54 45 4d 50 0a 20 20 2a 2a 20  reset TEMP.  ** 
40a0: 73 69 6e 63 65 20 54 45 4d 50 20 6d 69 67 68 74  since TEMP might
40b0: 20 62 65 20 68 6f 6c 64 69 6e 67 20 74 72 69 67   be holding trig
40c0: 67 65 72 73 20 74 68 61 74 20 72 65 66 65 72 65  gers that refere
40d0: 6e 63 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  nce tables in th
40e0: 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 64 61 74  e.  ** other dat
40f0: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
4100: 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20  ( iDb!=1 ){.    
4110: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 31  pDb = &db->aDb[1
4120: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
4130: 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30 20 29  Db->pSchema!=0 )
4140: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63 68  ;.    sqlite3Sch
4150: 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53  emaClear(pDb->pS
4160: 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 72 65  chema);.  }.  re
4170: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  turn;.}../*.** E
4180: 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20  rase all schema 
4190: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
41a0: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
41b0: 74 61 62 61 73 65 73 20 28 69 6e 63 6c 75 64 69  tabases (includi
41c0: 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61 6e 64  ng.** "main" and
41d0: 20 22 74 65 6d 70 22 29 20 66 6f 72 20 61 20 73   "temp") for a s
41e0: 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 63  ingle database c
41f0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
4200: 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 41  id sqlite3ResetA
4210: 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65  llSchemasOfConne
4220: 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64  ction(sqlite3 *d
4230: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  b){.  int i;.  s
4240: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
4250: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
4260: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
4270: 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  ++){.    Db *pDb
4280: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
4290: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63      if( pDb->pSc
42a0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71  hema ){.      sq
42b0: 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72  lite3SchemaClear
42c0: 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pDb->pSchema);.
42d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e      }.  }.  db->
42e0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
42f0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
4300: 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c    sqlite3VtabUnl
4310: 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73  ockList(db);.  s
4320: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
4330: 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  All(db);.  sqlit
4340: 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61  e3CollapseDataba
4350: 73 65 41 72 72 61 79 28 64 62 29 3b 0a 7d 0a 0a  seArray(db);.}..
4360: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4370: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
4380: 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72  n a commit occur
4390: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
43a0: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
43b0: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
43c0: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67  *db){.  db->flag
43d0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
43e0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
43f0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f  *.** Delete memo
4400: 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ry allocated for
4410: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
4420: 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  s of a table or 
4430: 76 69 65 77 20 28 74 68 65 0a 2a 2a 20 54 61 62  view (the.** Tab
4440: 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29  le.aCol[] array)
4450: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4460: 20 73 71 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c   sqliteDeleteCol
4470: 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65 33  umnNames(sqlite3
4480: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
4490: 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ble){.  int i;. 
44a0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
44b0: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21   assert( pTable!
44c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f  =0 );.  if( (pCo
44d0: 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  l = pTable->aCol
44e0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  )!=0 ){.    for(
44f0: 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  i=0; i<pTable->n
4500: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
4510: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4520: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
4530: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
4540: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4550: 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  (db, pCol->pDflt
4560: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4570: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
4580: 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73  >zDflt);.      s
4590: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
45a0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20   pCol->zType);. 
45b0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
45c0: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f  ee(db, pCol->zCo
45d0: 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ll);.    }.    s
45e0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
45f0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a   pTable->aCol);.
4600: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d    }.}../*.** Rem
4610: 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64  ove the memory d
4620: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61  ata structures a
4630: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
4640: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c  he given.** Tabl
4650: 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61  e.  No changes a
4660: 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20  re made to disk 
4670: 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
4680: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
4690: 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73  ine just deletes
46a0: 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74   the data struct
46b0: 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ure.  It does no
46c0: 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20  t unlink.** the 
46d0: 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75 63  table data struc
46e0: 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61  ture from the ha
46f0: 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69  sh table.  But i
4700: 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a  t does destroy.*
4710: 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  * memory structu
4720: 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63  res of the indic
4730: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
4740: 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  eys associated w
4750: 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c  ith .** the tabl
4760: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 62 20  e..**.** The db 
4770: 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 70 74  parameter is opt
4780: 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73 20 6e 65  ional.  It is ne
4790: 65 64 65 64 20 69 66 20 74 68 65 20 54 61 62 6c  eded if the Tabl
47a0: 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e  e object .** con
47b0: 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69 64 65 20  tains lookaside 
47c0: 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62 6c 65 20  memory.  (Table 
47d0: 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
47e0: 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20 75 73 65  chema do not use
47f0: 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65  .** lookaside me
4800: 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d 65 20 65  mory, but some e
4810: 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f  phemeral Table o
4820: 62 6a 65 63 74 73 20 64 6f 2e 29 20 20 4f 72 20  bjects do.)  Or 
4830: 74 68 65 0a 2a 2a 20 64 62 20 70 61 72 61 6d 65  the.** db parame
4840: 74 65 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  ter can be used 
4850: 77 69 74 68 20 64 62 2d 3e 70 6e 42 79 74 65 73  with db->pnBytes
4860: 46 72 65 65 64 20 74 6f 20 6d 65 61 73 75 72 65  Freed to measure
4870: 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75   the memory.** u
4880: 73 65 64 20 62 79 20 74 68 65 20 54 61 62 6c 65  sed by the Table
4890: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64   object..*/.void
48a0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
48b0: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
48c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
48d0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
48e0: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 54 45 53 54  , *pNext;.  TEST
48f0: 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c 6f 6f 6b 61  ONLY( int nLooka
4900: 73 69 64 65 3b 20 29 20 2f 2a 20 55 73 65 64 20  side; ) /* Used 
4910: 74 6f 20 76 65 72 69 66 79 20 6c 6f 6f 6b 61 73  to verify lookas
4920: 69 64 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72  ide not used for
4930: 20 73 63 68 65 6d 61 20 2a 2f 0a 0a 20 20 61 73   schema */..  as
4940: 73 65 72 74 28 20 21 70 54 61 62 6c 65 20 7c 7c  sert( !pTable ||
4950: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20   pTable->nRef>0 
4960: 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  );..  /* Do not 
4970: 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65  delete the table
4980: 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72   until the refer
4990: 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68  ence count reach
49a0: 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66  es zero. */.  if
49b0: 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74 75  ( !pTable ) retu
49c0: 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62 20  rn;.  if( ((!db 
49d0: 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  || db->pnBytesFr
49e0: 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54  eed==0) && (--pT
49f0: 61 62 6c 65 2d 3e 6e 52 65 66 29 3e 30 29 20 29  able->nRef)>0) )
4a00: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 52   return;..  /* R
4a10: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
4a20: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
4a30: 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61  lookaside alloca
4a40: 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61 20  tions in schema 
4a50: 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f  Tables.  ** prio
4a60: 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66  r to doing any f
4a70: 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 73  ree() operations
4a80: 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d 61 20  .  Since schema 
4a90: 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73  Tables do not us
4aa0: 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65  e.  ** lookaside
4ab0: 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20 73 68  , this number sh
4ac0: 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e  ould not change.
4ad0: 20 2a 2f 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20   */.  TESTONLY( 
4ae0: 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 28 64 62  nLookaside = (db
4af0: 20 26 26 20 28 70 54 61 62 6c 65 2d 3e 74 61 62   && (pTable->tab
4b00: 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d  Flags & TF_Ephem
4b10: 65 72 61 6c 29 3d 3d 30 29 20 3f 0a 20 20 20 20  eral)==0) ?.    
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b30: 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69       db->lookasi
4b40: 64 65 2e 6e 4f 75 74 20 3a 20 30 20 29 3b 0a 0a  de.nOut : 0 );..
4b50: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
4b60: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
4b70: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
4b80: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e  le. */.  for(pIn
4b90: 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49  dex = pTable->pI
4ba0: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49  ndex; pIndex; pI
4bb0: 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20  ndex=pNext){.   
4bc0: 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d   pNext = pIndex-
4bd0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65  >pNext;.    asse
4be0: 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  rt( pIndex->pSch
4bf0: 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63  ema==pTable->pSc
4c00: 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20  hema );.    if( 
4c10: 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74  !db || db->pnByt
4c20: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
4c30: 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20      char *zName 
4c40: 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b  = pIndex->zName;
4c50: 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59   .      TESTONLY
4c60: 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d   ( Index *pOld =
4c70: 20 29 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   ) sqlite3HashIn
4c80: 73 65 72 74 28 0a 20 20 20 20 20 20 20 20 20 26  sert(.         &
4c90: 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d  pIndex->pSchema-
4ca0: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >idxHash, zName,
4cb0: 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20   0.      );.    
4cc0: 20 20 61 73 73 65 72 74 28 20 64 62 3d 3d 30 20    assert( db==0 
4cd0: 7c 7c 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  || sqlite3Schema
4ce0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
4cf0: 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
4d00: 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
4d10: 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20  t( pOld==pIndex 
4d20: 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20  || pOld==0 );.  
4d30: 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65    }.    freeInde
4d40: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
4d50: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20   }..  /* Delete 
4d60: 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  any foreign keys
4d70: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 69   attached to thi
4d80: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71  s table. */.  sq
4d90: 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62  lite3FkDelete(db
4da0: 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a  , pTable);..  /*
4db0: 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c   Delete the Tabl
4dc0: 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65  e structure itse
4dd0: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  lf..  */.  sqlit
4de0: 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d  eDeleteColumnNam
4df0: 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  es(db, pTable);.
4e00: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4e10: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  db, pTable->zNam
4e20: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
4e30: 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ree(db, pTable->
4e40: 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69  zColAff);.  sqli
4e50: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
4e60: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  db, pTable->pSel
4e70: 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ect);.#ifndef SQ
4e80: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
4e90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
4ea0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  tDelete(db, pTab
4eb0: 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e  le->pCheck);.#en
4ec0: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
4ed0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
4ee0: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74  ABLE.  sqlite3Vt
4ef0: 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62  abClear(db, pTab
4f00: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  le);.#endif.  sq
4f10: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4f20: 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56  pTable);..  /* V
4f30: 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f  erify that no lo
4f40: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77  okaside memory w
4f50: 61 73 20 75 73 65 64 20 62 79 20 73 63 68 65 6d  as used by schem
4f60: 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73  a tables */.  as
4f70: 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65  sert( nLookaside
4f80: 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64  ==0 || nLookasid
4f90: 65 3d 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  e==db->lookaside
4fa0: 2e 6e 4f 75 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  .nOut );.}../*.*
4fb0: 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76  * Unlink the giv
4fc0: 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  en table from th
4fd0: 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  e hash tables an
4fe0: 64 20 74 68 65 20 64 65 6c 65 74 65 20 74 68 65  d the delete the
4ff0: 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74  .** table struct
5000: 75 72 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73  ure with all its
5010: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
5020: 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f  eign keys..*/.vo
5030: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
5040: 41 6e 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73  AndDeleteTable(s
5050: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
5060: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
5070: 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61  *zTabName){.  Ta
5080: 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44  ble *p;.  Db *pD
5090: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  b;..  assert( db
50a0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
50b0: 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
50c0: 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
50d0: 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a  rt( zTabName );.
50e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
50f0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
5100: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
5110: 20 20 74 65 73 74 63 61 73 65 28 20 7a 54 61 62    testcase( zTab
5120: 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f  Name[0]==0 );  /
5130: 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61  * Zero-length ta
5140: 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c  ble names are al
5150: 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d  lowed */.  pDb =
5160: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
5170: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
5180: 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53  hInsert(&pDb->pS
5190: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
51a0: 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  zTabName, 0);.  
51b0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
51c0: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
51d0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
51e0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
51f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
5200: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
5210: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
5220: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
5230: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
5240: 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  en.  Space to ho
5250: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
5260: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
5270: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
5280: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
5290: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
52a0: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
52b0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e  nction..**.** An
52c0: 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b  y quotation mark
52d0: 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20  s (ex:  "name", 
52e0: 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20  'name', [name], 
52f0: 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a  or `name`) that.
5300: 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20  ** surround the 
5310: 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65  body of the toke
5320: 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a  n are removed..*
5330: 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20  *.** Tokens are 
5340: 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74  often just point
5350: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ers into the ori
5360: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61  ginal SQL text a
5370: 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74  nd so.** are not
5380: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
5390: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72   and are not per
53a0: 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65  sistent.  The re
53b0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
53c0: 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61   is \000 termina
53d0: 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69  ted and is persi
53e0: 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stent..*/.char *
53f0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
5400: 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  oken(sqlite3 *db
5410: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
5420: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
5430: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
5440: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
5450: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
5460: 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c  (char*)pName->z,
5470: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
5480: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
5490: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
54a0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
54b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
54c0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  e;.}../*.** Open
54d0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
54e0: 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20  er table stored 
54f0: 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  in database numb
5500: 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72  er iDb for.** wr
5510: 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65  iting. The table
5520: 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
5530: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
5540: 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61  id sqlite3OpenMa
5550: 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20  sterTable(Parse 
5560: 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *p, int iDb){.  
5570: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
5580: 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73  3GetVdbe(p);.  s
5590: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
55a0: 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52  p, iDb, MASTER_R
55b0: 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54  OOT, 1, SCHEMA_T
55c0: 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71  ABLE(iDb));.  sq
55d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
55e0: 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  nt(v, OP_OpenWri
55f0: 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f  te, 0, MASTER_RO
5600: 4f 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69  OT, iDb, 5);.  i
5610: 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b  f( p->nTab==0 ){
5620: 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31  .    p->nTab = 1
5630: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
5640: 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70  arameter zName p
5650: 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74  oints to a nul-t
5660: 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72  erminated buffer
5670: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
5680: 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74  name.** of a dat
5690: 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22  abase ("main", "
56a0: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
56b0: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
56c0: 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75   db). This.** fu
56d0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
56e0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
56f0: 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69  named database i
5700: 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a  n db->aDb[], or.
5710: 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d  ** -1 if the nam
5720: 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20  ed db cannot be 
5730: 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
5740: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
5750: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
5760: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
5770: 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20  .  int i = -1;  
5780: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
5790: 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  se number */.  i
57a0: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
57b0: 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 69 6e 74  Db *pDb;.    int
57c0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
57d0: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  en30(zName);.   
57e0: 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d   for(i=(db->nDb-
57f0: 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62  1), pDb=&db->aDb
5800: 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  [i]; i>=0; i--, 
5810: 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  pDb--){.      if
5820: 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  ( (!OMIT_TEMPDB 
5830: 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d  || i!=1 ) && n==
5840: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
5850: 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a  pDb->zName) && .
5860: 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c            0==sql
5870: 69 74 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d  ite3StrICmp(pDb-
5880: 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29  >zName, zName) )
5890: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
58a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
58b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
58c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65  ../*.** The toke
58d0: 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e  n *pName contain
58e0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
58f0: 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72  database (either
5900: 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74   "main" or.** "t
5910: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
5920: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5930: 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  db). This routin
5940: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
5950: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61   index of the na
5960: 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20  med database in 
5970: 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31  db->aDb[], or -1
5980: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62   if the named db
5990: 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78   .** does not ex
59a0: 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
59b0: 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65  te3FindDb(sqlite
59c0: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
59d0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  ame){.  int i;  
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5a00: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
5a10: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
5a20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
5a40: 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69  e we are searchi
5a50: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d  ng for */.  zNam
5a60: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
5a70: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
5a80: 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74  me);.  i = sqlit
5a90: 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c  e3FindDbName(db,
5aa0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74   zName);.  sqlit
5ab0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
5ac0: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b  me);.  return i;
5ad0: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65  .}../* The table
5ae0: 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67   or view or trig
5af0: 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73  ger name is pass
5b00: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
5b10: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a  ne via tokens.**
5b20: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
5b30: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
5b40: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
5b50: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
5b60: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52  xample:.**.** CR
5b70: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
5b80: 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a  yy (...);.** .**
5b90: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
5ba0: 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64  set to "xxx" and
5bb0: 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f   pName2 "yyy". O
5bc0: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
5bd0: 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   if.** the table
5be0: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
5bf0: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
5c00: 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45  e.:.**.** CREATE
5c10: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
5c20: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  .**.** Then pNam
5c30: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79  e1 is set to "yy
5c40: 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73  y" and pName2 is
5c50: 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ""..**.** This 
5c60: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
5c70: 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74   *ppUnqual point
5c80: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
5c90: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
5ca0: 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74   or.** pName2) t
5cb0: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75  hat stores the u
5cc0: 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65  nqualified table
5cd0: 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65   name.  The inde
5ce0: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  x of the.** data
5cf0: 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65  base "xxx" is re
5d00: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
5d10: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
5d20: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
5d30: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
5d40: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
5d50: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
5d60: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
5d70: 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e1,      /* The 
5d80: 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d  "xxx" in the nam
5d90: 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22  e "xxx.yyy" or "
5da0: 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  xxx" */.  Token 
5db0: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a  *pName2,      /*
5dc0: 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68   The "yyy" in th
5dd0: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
5de0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55   */.  Token **pU
5df0: 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69  nqual     /* Wri
5e00: 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  te the unqualifi
5e10: 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68  ed object name h
5e20: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
5e30: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
5e40: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5e50: 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ase holding the 
5e60: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
5e70: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5e80: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 41 4c 57  ->db;..  if( ALW
5e90: 41 59 53 28 70 4e 61 6d 65 32 21 3d 30 29 20 26  AYS(pName2!=0) &
5ea0: 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b  & pName2->n>0 ){
5eb0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  .    if( db->ini
5ec0: 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20  t.busy ) {.     
5ed0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5ee0: 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70  (pParse, "corrup
5ef0: 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20  t database");.  
5f00: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
5f10: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
5f20: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a   -1;.    }.    *
5f30: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32  pUnqual = pName2
5f40: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
5f50: 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e  te3FindDb(db, pN
5f60: 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69  ame1);.    if( i
5f70: 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  Db<0 ){.      sq
5f80: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5f90: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  arse, "unknown d
5fa0: 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61  atabase %T", pNa
5fb0: 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72  me1);.      pPar
5fc0: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
5fd0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
5fe0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
5ff0: 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74  assert( db->init
6000: 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69  .iDb==0 || db->i
6010: 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
6020: 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69  iDb = db->init.i
6030: 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c  Db;.    *pUnqual
6040: 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20   = pName1;.  }. 
6050: 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a   return iDb;.}..
6060: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
6070: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  ne is used to ch
6080: 65 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38  eck if the UTF-8
6090: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73   string zName is
60a0: 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75   a legal.** unqu
60b0: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72  alified name for
60c0: 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62   a new schema ob
60d0: 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64  ject (table, ind
60e0: 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74  ex, view or.** t
60f0: 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d  rigger). All nam
6100: 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63  es are legal exc
6110: 65 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62  ept those that b
6120: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74  egin with the st
6130: 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f  ring.** "sqlite_
6140: 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77  " (in upper, low
6150: 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65  er or mixed case
6160: 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20  ). This portion 
6170: 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65  of the namespace
6180: 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20  .** is reserved 
6190: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65  for internal use
61a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
61b0: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
61c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
61d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
61e0: 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  ){.  if( !pParse
61f0: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ->db->init.busy 
6200: 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  && pParse->neste
6210: 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  d==0 .          
6220: 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  && (pParse->db->
6230: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57  flags & SQLITE_W
6240: 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20  riteSchema)==0. 
6250: 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
6260: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
6270: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
6280: 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   7) ){.    sqlit
6290: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
62a0: 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20  e, "object name 
62b0: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
62c0: 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20  ernal use: %s", 
62d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
62e0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
62f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
6300: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
6310: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49  * Return the PRI
6320: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f  MARY KEY index o
6330: 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64  f a table.*/.Ind
6340: 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61  ex *sqlite3Prima
6350: 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65  ryKeyIndex(Table
6360: 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78   *pTab){.  Index
6370: 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61   *p;.  for(p=pTa
6380: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20  b->pIndex; p && 
6390: 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  !IsPrimaryKeyInd
63a0: 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78  ex(p); p=p->pNex
63b0: 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  t){}.  return p;
63c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
63d0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69   the column of i
63e0: 6e 64 65 78 20 70 49 64 78 20 74 68 61 74 20 63  ndex pIdx that c
63f0: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 61  orresponds to ta
6400: 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43  ble.** column iC
6410: 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  ol.  Return -1 i
6420: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
6430: 69 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  i16 sqlite3Colum
6440: 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  nOfIndex(Index *
6450: 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b  pIdx, i16 iCol){
6460: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
6470: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
6480: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
6490: 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e  if( iCol==pIdx->
64a0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65  aiColumn[i] ) re
64b0: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
64c0: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
64d0: 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63  * Begin construc
64e0: 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
64f0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
6500: 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73  in memory.  This
6510: 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
6520: 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69   of several acti
6530: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  on routines that
6540: 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72   get called in r
6550: 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20  esponse.** to a 
6560: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
6570: 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74  tement.  In part
6580: 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75  icular, this rou
6590: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a  tine is called.*
65a0: 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74  * after seeing t
65b0: 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61  okens "CREATE" a
65c0: 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74  nd "TABLE" and t
65d0: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  he table name. T
65e0: 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61  he isTemp.** fla
65f0: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
6600: 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
6610: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
6620: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
6630: 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  e.** file instea
6640: 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e  d of in the main
6650: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
6660: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
6670: 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  y the case.** wh
6680: 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72  en the "TEMP" or
6690: 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79   "TEMPORARY" key
66a0: 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62  word occurs in b
66b0: 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45  etween.** CREATE
66c0: 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a   and TABLE..**.*
66d0: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
66e0: 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61  record is initia
66f0: 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e  lized and put in
6700: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
6710: 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f  le..** As more o
6720: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
6730: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  LE statement is 
6740: 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e  parsed, addition
6750: 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75  al action.** rou
6760: 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61  tines will be ca
6770: 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65  lled to add more
6780: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
6790: 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20  this record..** 
67a0: 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
67b0: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
67c0: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71  tatement, the sq
67d0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
67e0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
67f0: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
6800: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
6810: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
6820: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
6830: 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  id sqlite3StartT
6840: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
6850: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
6860: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
6870: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
6880: 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
6890: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
68a0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
68b0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
68c0: 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  e2,   /* Second 
68d0: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
68e0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
68f0: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
6900: 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54  sTemp,      /* T
6910: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
6920: 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20   TEMP table */. 
6930: 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20   int isView,    
6940: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
6950: 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20  s is a VIEW */. 
6960: 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20   int isVirtual, 
6970: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
6980: 73 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74  s is a VIRTUAL t
6990: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  able */.  int no
69a0: 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  Err        /* Do
69b0: 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c   nothing if tabl
69c0: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
69d0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
69e0: 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  pTable;.  char *
69f0: 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68  zName = 0; /* Th
6a00: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65  e name of the ne
6a10: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  w table */.  sql
6a20: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
6a30: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
6a40: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  ;.  int iDb;    
6a50: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
6a60: 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74   number to creat
6a70: 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a  e the table in *
6a80: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
6a90: 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
6aa0: 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
6ab0: 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  table to create 
6ac0: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62  */..  /* The tab
6ad0: 6c 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20  le or view name 
6ae0: 74 6f 20 63 72 65 61 74 65 20 69 73 20 70 61 73  to create is pas
6af0: 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74  sed to this rout
6b00: 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20  ine via tokens. 
6b10: 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70   ** pName1 and p
6b20: 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61  Name2. If the ta
6b30: 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c  ble name was ful
6b40: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f  ly qualified, fo
6b50: 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a  r example:.  **.
6b60: 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
6b70: 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b  E xxx.yyy (...);
6b80: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e  .  ** .  ** Then
6b90: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
6ba0: 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d  o "xxx" and pNam
6bb0: 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65  e2 "yyy". On the
6bc0: 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20   other hand if. 
6bd0: 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61   ** the table na
6be0: 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20  me is not fully 
6bf0: 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a  qualified, i.e.:
6c00: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54  .  **.  ** CREAT
6c10: 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29  E TABLE yyy(...)
6c20: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  ;.  **.  ** Then
6c30: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
6c40: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
6c50: 65 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20  e2 is ""..  **. 
6c60: 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c   ** The call bel
6c70: 6f 77 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d  ow sets the pNam
6c80: 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69  e pointer to poi
6c90: 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20  nt at the token 
6ca0: 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20  (pName1 or.  ** 
6cb0: 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f  pName2) that sto
6cc0: 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66  res the unqualif
6cd0: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
6ce0: 54 68 65 20 76 61 72 69 61 62 6c 65 20 69 44 62  The variable iDb
6cf0: 20 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20   is.  ** set to 
6d00: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
6d10: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 74   database that t
6d20: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
6d30: 20 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63   is to be.  ** c
6d40: 72 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a  reated in..  */.
6d50: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
6d60: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
6d70: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
6d80: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66  2, &pName);.  if
6d90: 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e  ( iDb<0 ) return
6da0: 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45  ;.  if( !OMIT_TE
6db0: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 26  MPDB && isTemp &
6dc0: 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26  & pName2->n>0 &&
6dd0: 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 2f   iDb!=1 ){.    /
6de0: 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
6df0: 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20  temp table, the 
6e00: 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  name may not be 
6e10: 71 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73  qualified. Unles
6e20: 73 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61  s .    ** the da
6e30: 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22  tabase name is "
6e40: 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a  temp" anyway.  *
6e50: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  /.    sqlite3Err
6e60: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
6e70: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e  emporary table n
6e80: 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75  ame must be unqu
6e90: 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72  alified");.    r
6ea0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
6eb0: 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
6ec0: 20 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20   isTemp ) iDb = 
6ed0: 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e  1;..  pParse->sN
6ee0: 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d  ameToken = *pNam
6ef0: 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  e;.  zName = sql
6f00: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
6f10: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
6f20: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72  if( zName==0 ) r
6f30: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c  eturn;.  if( SQL
6f40: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
6f50: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
6f60: 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
6f70: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
6f80: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
6f90: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
6fa0: 69 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20  iDb==1 ) isTemp 
6fb0: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
6fc0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
6fd0: 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28  ZATION.  assert(
6fe0: 20 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69   (isTemp & 1)==i
6ff0: 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20  sTemp );.  {.   
7000: 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63   int code;.    c
7010: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
7020: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
7030: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
7040: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
7050: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53  SQLITE_INSERT, S
7060: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65  CHEMA_TABLE(isTe
7070: 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  mp), 0, zDb) ){.
7080: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
7090: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
70a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
70b0: 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
70c0: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
70d0: 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20  isTemp ){.      
70e0: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
70f0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57  CREATE_TEMP_VIEW
7100: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7110: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
7120: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
7130: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
7140: 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
7150: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
7160: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
7170: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
7180: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
7190: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
71a0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
71b0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c  LITE_CREATE_TABL
71c0: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
71d0: 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74  .    if( !isVirt
71e0: 75 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75  ual && sqlite3Au
71f0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
7200: 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20  code, zName, 0, 
7210: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
7220: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7230: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
7240: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b  #endif..  /* Mak
7250: 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74  e sure the new t
7260: 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e  able name does n
7270: 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20  ot collide with 
7280: 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a  an existing.  **
7290: 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20   index or table 
72a0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65  name in the same
72b0: 20 64 61 74 61 62 61 73 65 2e 20 20 49 73 73 75   database.  Issu
72c0: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
72d0: 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f  ge if.  ** it do
72e0: 65 73 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f  es. The exceptio
72f0: 6e 20 69 73 20 69 66 20 74 68 65 20 73 74 61 74  n is if the stat
7300: 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73  ement being pars
7310: 65 64 20 77 61 73 20 70 61 73 73 65 64 0a 20 20  ed was passed.  
7320: 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  ** to an sqlite3
7330: 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20  _declare_vtab() 
7340: 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61  call. In that ca
7350: 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  se only the colu
7360: 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e  mn names.  ** an
7370: 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20  d types will be 
7380: 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69  used, so there i
7390: 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73  s no need to tes
73a0: 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a  t for namespace.
73b0: 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e    ** collisions.
73c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f  .  */.  if( !IN_
73d0: 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a  DECLARE_VTAB ){.
73e0: 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20      char *zDb = 
73f0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
7400: 6d 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  me;.    if( SQLI
7410: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
7420: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
7430: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
7440: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7450: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
7460: 6c 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  le = sqlite3Find
7470: 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c  Table(db, zName,
7480: 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70   zDb);.    if( p
7490: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  Table ){.      i
74a0: 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20  f( !noErr ){.   
74b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
74c0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
74d0: 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65  ble %T already e
74e0: 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a  xists", pName);.
74f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7500: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
7510: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
7520: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
7530: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
7540: 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
7550: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
7560: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
7570: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
7580: 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
7590: 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  x(db, zName, zDb
75a0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )!=0 ){.      sq
75b0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
75c0: 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
75d0: 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78  already an index
75e0: 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d   named %s", zNam
75f0: 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62  e);.      goto b
7600: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7610: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
7620: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44  Table = sqlite3D
7630: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
7640: 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a  sizeof(Table));.
7650: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
7660: 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  ){.    db->mallo
7670: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
7680: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
7690: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
76a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
76b0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
76c0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
76d0: 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20    pTable->zName 
76e0: 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c  = zName;.  pTabl
76f0: 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  e->iPKey = -1;. 
7700: 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61   pTable->pSchema
7710: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
7720: 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c  pSchema;.  pTabl
7730: 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70  e->nRef = 1;.  p
7740: 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73  Table->nRowLogEs
7750: 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 28  t = 200; assert(
7760: 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67   200==sqlite3Log
7770: 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b 0a  Est(1048576) );.
7780: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
7790: 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29  ->pNewTable==0 )
77a0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ;.  pParse->pNew
77b0: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
77c0: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
77d0: 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74   the magic sqlit
77e0: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
77f0: 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63   used by autoinc
7800: 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65  rement,.  ** the
7810: 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  n record a point
7820: 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  er to this table
7830: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
7840: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a  abase structure.
7850: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53    ** so that INS
7860: 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65  ERT can find the
7870: 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20   table easily.. 
7880: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
7890: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
78a0: 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61  EMENT.  if( !pPa
78b0: 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73  rse->nested && s
78c0: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  trcmp(zName, "sq
78d0: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d  lite_sequence")=
78e0: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
78f0: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
7900: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
7910: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 54 61 62  , 0) );.    pTab
7920: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  le->pSchema->pSe
7930: 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20  qTab = pTable;. 
7940: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
7950: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
7960: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
7970: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
7980: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
7990: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
79a0: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
79b0: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
79c0: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
79d0: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
79e0: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
79f0: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
7a00: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
7a10: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
7a20: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
7a30: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
7a40: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
7a50: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
7a60: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
7a70: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
7a80: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
7a90: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
7aa0: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
7ab0: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
7ac0: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
7ad0: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
7ae0: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
7af0: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
7b00: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
7b10: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
7b20: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
7b30: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
7b40: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b  0 ){.    int j1;
7b50: 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72  .    int fileFor
7b60: 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  mat;.    int reg
7b70: 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20  1, reg2, reg3;. 
7b80: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
7b90: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
7ba0: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a  arse, 0, iDb);..
7bb0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7bc0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
7bd0: 0a 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75  .    if( isVirtu
7be0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
7bf0: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
7c00: 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20   OP_VBegin);.   
7c10: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
7c20: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * If the file fo
7c30: 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e  rmat and encodin
7c40: 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  g in the databas
7c50: 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20  e have not been 
7c60: 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74  set, .    ** set
7c70: 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a   them now..    *
7c80: 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50 61  /.    reg1 = pPa
7c90: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20  rse->regRowid = 
7ca0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
7cb0: 20 20 20 20 72 65 67 32 20 3d 20 70 50 61 72 73      reg2 = pPars
7cc0: 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70  e->regRoot = ++p
7cd0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
7ce0: 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65   reg3 = ++pParse
7cf0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
7d00: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7d10: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
7d20: 69 44 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45  iDb, reg3, BTREE
7d30: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20  _FILE_FORMAT);. 
7d40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
7d50: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
7d60: 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  .    j1 = sqlite
7d70: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
7d80: 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56 64 62  P_If, reg3); Vdb
7d90: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7da0: 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28    fileFormat = (
7db0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
7dc0: 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74  TE_LegacyFileFmt
7dd0: 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20  )!=0 ?.         
7de0: 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c           1 : SQL
7df0: 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52  ITE_MAX_FILE_FOR
7e00: 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MAT;.    sqlite3
7e10: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7e20: 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46 6f  _Integer, fileFo
7e30: 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20 20 20  rmat, reg3);.   
7e40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7e50: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
7e60: 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 46  ie, iDb, BTREE_F
7e70: 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 72 65 67 33  ILE_FORMAT, reg3
7e80: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7e90: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7ea0: 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29 2c  nteger, ENC(db),
7eb0: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
7ec0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7ed0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
7ee0: 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f 45  Db, BTREE_TEXT_E
7ef0: 4e 43 4f 44 49 4e 47 2c 20 72 65 67 33 29 3b 0a  NCODING, reg3);.
7f00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
7f10: 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a  umpHere(v, j1);.
7f20: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73  .    /* This jus
7f30: 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63  t creates a plac
7f40: 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20  e-holder record 
7f50: 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  in the sqlite_ma
7f60: 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20  ster table..    
7f70: 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72  ** The record cr
7f80: 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63  eated does not c
7f90: 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20  ontain anything 
7fa0: 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  yet.  It will be
7fb0: 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a   replaced.    **
7fc0: 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74   by the real ent
7fd0: 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72  ry in code gener
7fe0: 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45  ated at sqlite3E
7ff0: 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a  ndTable()..    *
8000: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  *.    ** The row
8010: 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65  id for the new e
8020: 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20  ntry is left in 
8030: 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d  register pParse-
8040: 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a  >regRowid..    *
8050: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
8060: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
8070: 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20  w table is left 
8080: 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72  in reg pParse->r
8090: 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54  egRoot..    ** T
80a0: 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f  he rowid and roo
80b0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61  t page number va
80c0: 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65 64 20  lues are needed 
80d0: 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  by the code that
80e0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45  .    ** sqlite3E
80f0: 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e  ndTable will gen
8100: 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69  erate..    */.#i
8110: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
8120: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
8130: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8140: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
8150: 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69 65  E).    if( isVie
8160: 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29  w || isVirtual )
8170: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8180: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8190: 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32  Integer, 0, reg2
81a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
81b0: 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
81c0: 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61  pParse->addrCrTa
81d0: 62 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  b = sqlite3VdbeA
81e0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61  ddOp2(v, OP_Crea
81f0: 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20 72 65  teTable, iDb, re
8200: 67 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  g2);.    }.    s
8210: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
8220: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44  Table(pParse, iD
8230: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
8240: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8250: 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65 67  NewRowid, 0, reg
8260: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
8270: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8280: 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 33 29 3b 0a  Null, 0, reg3);.
8290: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
82a0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65  ddOp3(v, OP_Inse
82b0: 72 74 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67  rt, 0, reg3, reg
82c0: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
82d0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
82e0: 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20  PFLAG_APPEND);. 
82f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8300: 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp0(v, OP_Close
8310: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72  );.  }..  /* Nor
8320: 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20  mal (non-error) 
8330: 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74  return. */.  ret
8340: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  urn;..  /* If an
8350: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77   error occurs, w
8360: 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62  e jump here */.b
8370: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
8380: 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
8390: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
83a0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
83b0: 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75   This macro is u
83c0: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74  sed to compare t
83d0: 77 6f 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20  wo strings in a 
83e0: 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65  case-insensitive
83f0: 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69   manner..** It i
8400: 73 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65  s slightly faste
8410: 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73  r than calling s
8420: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 29 20  qlite3StrICmp() 
8430: 64 69 72 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a  directly, but.**
8440: 20 70 72 6f 64 75 63 65 73 20 6c 61 72 67 65 72   produces larger
8450: 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52   code..**.** WAR
8460: 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61 63 72 6f  NING: This macro
8470: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62   is not compatib
8480: 6c 65 20 77 69 74 68 20 74 68 65 20 73 74 72 63  le with the strc
8490: 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a  mp() family. It.
84a0: 2a 2a 20 72 65 74 75 72 6e 73 20 74 72 75 65 20  ** returns true 
84b0: 69 66 20 74 68 65 20 74 77 6f 20 73 74 72 69 6e  if the two strin
84c0: 67 73 20 61 72 65 20 65 71 75 61 6c 2c 20 6f 74  gs are equal, ot
84d0: 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a  herwise false..*
84e0: 2f 0a 23 64 65 66 69 6e 65 20 53 54 52 49 43 4d  /.#define STRICM
84f0: 50 28 78 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74  P(x, y) (\.sqlit
8500: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  e3UpperToLower[*
8510: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
8520: 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69  )(x)]==   \.sqli
8530: 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  te3UpperToLower[
8540: 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  *(unsigned char 
8550: 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a 26 26 20  *)(y)]     \.&& 
8560: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 28  sqlite3StrICmp((
8570: 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29  x)+1,(y)+1)==0 )
8580: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
8590: 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20  w column to the 
85a0: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
85b0: 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
85c0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  d..**.** The par
85d0: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
85e0: 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20  outine once for 
85f0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c  each column decl
8600: 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20  aration.** in a 
8610: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
8620: 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33  tement.  sqlite3
8630: 53 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 74  StartTable() get
8640: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73  s called.** firs
8650: 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20  t to get things 
8660: 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69  going.  Then thi
8670: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8680: 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  led for each.** 
8690: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  column..*/.void 
86a0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
86b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
86c0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
86d0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
86e0: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
86f0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
8700: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
8710: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
8720: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
8730: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
8740: 74 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45  turn;.#if SQLITE
8750: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
8760: 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e  ( p->nCol+1>db->
8770: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
8780: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
8790: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
87a0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
87b0: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20  many columns on 
87c0: 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  %s", p->zName);.
87d0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
87e0: 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c  #endif.  z = sql
87f0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
8800: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
8810: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
8820: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
8830: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
8840: 20 20 20 69 66 28 20 53 54 52 49 43 4d 50 28 7a     if( STRICMP(z
8850: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61  , p->aCol[i].zNa
8860: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  me) ){.      sql
8870: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8880: 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20  rse, "duplicate 
8890: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22  column name: %s"
88a0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , z);.      sqli
88b0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
88c0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
88d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
88e0: 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d  (p->nCol & 0x7)=
88f0: 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e  =0 ){.    Column
8900: 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77   *aNew;.    aNew
8910: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
8920: 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28  loc(db,p->aCol,(
8930: 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f  p->nCol+8)*sizeo
8940: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
8950: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
8960: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8970: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
8980: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
8990: 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d   }.    p->aCol =
89a0: 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f   aNew;.  }.  pCo
89b0: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
89c0: 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nCol];.  memset(
89d0: 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCol, 0, sizeof(
89e0: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  p->aCol[0]));.  
89f0: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b  pCol->zName = z;
8a00: 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  . .  /* If there
8a10: 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63   is no type spec
8a20: 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68  ified, columns h
8a30: 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  ave the default 
8a40: 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e  affinity.  ** 'N
8a50: 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20 69  ONE'. If there i
8a60: 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69  s a type specifi
8a70: 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33  ed, then sqlite3
8a80: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20  AddColumnType() 
8a90: 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c  will.  ** be cal
8aa0: 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20  led next to set 
8ab0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63  pCol->affinity c
8ac0: 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20  orrectly..  */. 
8ad0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
8ae0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
8af0: 45 3b 0a 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74  E;.  pCol->szEst
8b00: 20 3d 20 31 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b   = 1;.  p->nCol+
8b10: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  +;.}../*.** This
8b20: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
8b30: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
8b40: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
8b50: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
8b60: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
8b70: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20  E statement.  A 
8b80: 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
8b90: 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65  raint has.** bee
8ba0: 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75  n seen on a colu
8bb0: 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  mn.  This routin
8bc0: 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75  e sets the notNu
8bd0: 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68  ll flag on.** th
8be0: 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  e column current
8bf0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
8c00: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
8c10: 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c  qlite3AddNotNull
8c20: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8c30: 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20  int onError){.  
8c40: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d 20  Table *p;.  p = 
8c50: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
8c60: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  e;.  if( p==0 ||
8c70: 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31   NEVER(p->nCol<1
8c80: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d  ) ) return;.  p-
8c90: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
8ca0: 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f  .notNull = (u8)o
8cb0: 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nError;.}../*.**
8cc0: 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e   Scan the column
8cd0: 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65   type name zType
8ce0: 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20   (length nType) 
8cf0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  and return the.*
8d00: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66  * associated aff
8d10: 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a  inity type..**.*
8d20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
8d30: 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70  oes a case-indep
8d40: 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66  endent search of
8d50: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a   zType for the .
8d60: 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  ** substrings in
8d70: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
8d80: 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20  able. If one of 
8d90: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
8da0: 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20  s.** found, the 
8db0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66  corresponding af
8dc0: 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e  finity is return
8dd0: 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e  ed. If zType con
8de0: 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68  tains.** more th
8df0: 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  an one of the su
8e00: 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65  bstrings, entrie
8e10: 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70  s toward the top
8e20: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c   of .** the tabl
8e30: 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e  e take priority.
8e40: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
8e50: 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49   zType is 'BLOBI
8e60: 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  NT', .** SQLITE_
8e70: 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72  AFF_INTEGER is r
8e80: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  eturned..**.** S
8e90: 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41  ubstring     | A
8ea0: 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d  ffinity.** -----
8eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27  -----------.** '
8ed0: 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53  INT'         | S
8ee0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
8ef0: 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20  R.** 'CHAR'     
8f00: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
8f10: 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20  TEXT.** 'CLOB'  
8f20: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
8f30: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54  FF_TEXT.** 'TEXT
8f40: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
8f50: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42  E_AFF_TEXT.** 'B
8f60: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
8f70: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a  LITE_AFF_NONE.**
8f80: 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c   'REAL'        |
8f90: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
8fa0: 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20  .** 'FLOA'      
8fb0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
8fc0: 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20  EAL.** 'DOUB'   
8fd0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
8fe0: 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20  F_REAL.**.** If 
8ff0: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73  none of the subs
9000: 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62  trings in the ab
9010: 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f  ove table are fo
9020: 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  und,.** SQLITE_A
9030: 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65  FF_NUMERIC is re
9040: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20  turned..*/.char 
9050: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
9060: 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ype(const char *
9070: 7a 49 6e 2c 20 75 38 20 2a 70 73 7a 45 73 74 29  zIn, u8 *pszEst)
9080: 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20  {.  u32 h = 0;. 
9090: 20 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49   char aff = SQLI
90a0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
90b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
90c0: 68 61 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  har = 0;..  if( 
90d0: 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  zIn==0 ) return 
90e0: 61 66 66 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49  aff;.  while( zI
90f0: 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20  n[0] ){.    h = 
9100: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
9110: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a  UpperToLower[(*z
9120: 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a  In)&0xff];.    z
9130: 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d  In++;.    if( h=
9140: 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27  =(('c'<<24)+('h'
9150: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
9160: 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  r') ){          
9170: 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20     /* CHAR */.  
9180: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9190: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20  _AFF_TEXT;.     
91a0: 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20   zChar = zIn;.  
91b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
91c0: 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('c'<<24)+('l'<<
91d0: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27  16)+('o'<<8)+'b'
91e0: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c  ) ){       /* CL
91f0: 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  OB */.      aff 
9200: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
9210: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
9220: 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28   h==(('t'<<24)+(
9230: 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38  'e'<<16)+('x'<<8
9240: 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20  )+'t') ){       
9250: 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20  /* TEXT */.     
9260: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9270: 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73  F_TEXT;.    }els
9280: 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c  e if( h==(('b'<<
9290: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
92a0: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  o'<<8)+'b')     
92b0: 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a       /* BLOB */.
92c0: 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d          && (aff=
92d0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
92e0: 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  RIC || aff==SQLI
92f0: 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a  TE_AFF_REAL) ){.
9300: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9310: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
9320: 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27     if( zIn[0]=='
9330: 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e  (' ) zChar = zIn
9340: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
9350: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
9360: 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69  OINT.    }else i
9370: 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29  f( h==(('r'<<24)
9380: 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c  +('e'<<16)+('a'<
9390: 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20  <8)+'l')        
93a0: 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20    /* REAL */.   
93b0: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
93c0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
93d0: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
93e0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
93f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9400: 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('f'<<24)+('l'
9410: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
9420: 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a')          /* 
9430: 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20  FLOA */.        
9440: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
9450: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
9460: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9470: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
9480: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64  else if( h==(('d
9490: 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29  '<<24)+('o'<<16)
94a0: 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20  +('u'<<8)+'b')  
94b0: 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20          /* DOUB 
94c0: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
94d0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
94e0: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
94f0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9500: 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20  REAL;.#endif.   
9510: 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78   }else if( (h&0x
9520: 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27  00FFFFFF)==(('i'
9530: 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27  <<16)+('n'<<8)+'
9540: 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54  t') ){    /* INT
9550: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
9560: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
9570: 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ER;.      break;
9580: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
9590: 20 49 66 20 70 73 7a 45 73 74 20 69 73 20 6e 6f   If pszEst is no
95a0: 74 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e  t NULL, store an
95b0: 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
95c0: 20 66 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68   field size.  Th
95d0: 65 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20  e.  ** estimate 
95e0: 69 73 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61  is scaled so tha
95f0: 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  t the size of an
9600: 20 69 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20   integer is 1.  
9610: 2a 2f 0a 20 20 69 66 28 20 70 73 7a 45 73 74 20  */.  if( pszEst 
9620: 29 7b 0a 20 20 20 20 2a 70 73 7a 45 73 74 20 3d  ){.    *pszEst =
9630: 20 31 3b 20 20 20 2f 2a 20 64 65 66 61 75 6c 74   1;   /* default
9640: 20 73 69 7a 65 20 69 73 20 61 70 70 72 6f 78 20   size is approx 
9650: 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69  4 bytes */.    i
9660: 66 28 20 61 66 66 3c 3d 53 51 4c 49 54 45 5f 41  f( aff<=SQLITE_A
9670: 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  FF_NONE ){.     
9680: 20 69 66 28 20 7a 43 68 61 72 20 29 7b 0a 20 20   if( zChar ){.  
9690: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 43 68        while( zCh
96a0: 61 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  ar[0] ){.       
96b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
96c0: 64 69 67 69 74 28 7a 43 68 61 72 5b 30 5d 29 20  digit(zChar[0]) 
96d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
96e0: 6e 74 20 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt v = 0;.      
96f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74        sqlite3Get
9700: 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76 29  Int32(zChar, &v)
9710: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 20  ;.            v 
9720: 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 20  = v/4 + 1;.     
9730: 20 20 20 20 20 20 20 69 66 28 20 76 3e 32 35 35         if( v>255
9740: 20 29 20 76 20 3d 20 32 35 35 3b 0a 20 20 20 20   ) v = 255;.    
9750: 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20          *pszEst 
9760: 3d 20 76 3b 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c  = v; /* BLOB(k),
9770: 20 56 41 52 43 48 41 52 28 6b 29 2c 20 43 48 41   VARCHAR(k), CHA
9780: 52 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31  R(k) -> r=(k/4+1
9790: 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
97a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
97b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43    }.          zC
97c0: 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  har++;.        }
97d0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
97e0: 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20        *pszEst = 
97f0: 35 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45  5;   /* BLOB, TE
9800: 58 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20  XT, CLOB -> r=5 
9810: 20 28 61 70 70 72 6f 78 20 32 30 20 62 79 74 65   (approx 20 byte
9820: 73 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  s)*/.      }.   
9830: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
9840: 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  aff;.}../*.** Th
9850: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9860: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
9870: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
9880: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
9890: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
98a0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
98b0: 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e  The pFirst token
98c0: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
98d0: 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65   token in the se
98e0: 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73  quence of tokens
98f0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74   that describe t
9900: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a  he type of the.*
9910: 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  * column current
9920: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
9930: 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69  ction.   pLast i
9940: 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e  s the last token
9950: 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65  .** in the seque
9960: 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69  nce.  Use this i
9970: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f  nformation to co
9980: 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67  nstruct a string
9990: 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  .** that contain
99a0: 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f  s the typename o
99b0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64  f the column and
99c0: 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69   store that stri
99d0: 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a  ng.** in zType..
99e0: 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
99f0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61  AddColumnType(Pa
9a00: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
9a10: 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61  en *pType){.  Ta
9a20: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
9a30: 20 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70   *pCol;..  p = p
9a40: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
9a50: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
9a60: 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29  NEVER(p->nCol<1)
9a70: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f   ) return;.  pCo
9a80: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
9a90: 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72  nCol-1];.  asser
9aa0: 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d  t( pCol->zType==
9ab0: 30 20 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79  0 );.  pCol->zTy
9ac0: 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  pe = sqlite3Name
9ad0: 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
9ae0: 2d 3e 64 62 2c 20 70 54 79 70 65 29 3b 0a 20 20  ->db, pType);.  
9af0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
9b00: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
9b10: 54 79 70 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65  Type(pCol->zType
9b20: 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b  , &pCol->szEst);
9b30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78  .}../*.** The ex
9b40: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20  pression is the 
9b50: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f  default value fo
9b60: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
9b70: 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e  tly added column
9b80: 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65  .** of the table
9b90: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
9ba0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
9bb0: 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  *.** Default val
9bc0: 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d  ue expressions m
9bd0: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e  ust be constant.
9be0: 20 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70    Raise an excep
9bf0: 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20  tion if this.** 
9c00: 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e  is not the case.
9c10: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9c20: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
9c30: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
9c40: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
9c50: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
9c60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
9c70: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
9c80: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
9c90: 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50  tValue(Parse *pP
9ca0: 61 72 73 65 2c 20 45 78 70 72 53 70 61 6e 20 2a  arse, ExprSpan *
9cb0: 70 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20  pSpan){.  Table 
9cc0: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
9cd0: 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
9ce0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9cf0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
9d00: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
9d10: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20  !=0 ){.    pCol 
9d20: 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  = &(p->aCol[p->n
9d30: 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28  Col-1]);.    if(
9d40: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
9d50: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
9d60: 6e 28 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 20  n(pSpan->pExpr) 
9d70: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9d80: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9d90: 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20   "default value 
9da0: 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69  of column [%s] i
9db0: 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c  s not constant",
9dc0: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d  .          pCol-
9dd0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  >zName);.    }el
9de0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63  se{.      /* A c
9df0: 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20  opy of pExpr is 
9e00: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
9e10: 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73  the original, as
9e20: 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a   pExpr contains.
9e30: 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20        ** tokens 
9e40: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f  that point to vo
9e50: 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54  latile memory. T
9e60: 68 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65  he 'span' of the
9e70: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
9e80: 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
9e90: 20 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65   by pragma table
9ea0: 5f 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a  _info..      */.
9eb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
9ec0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  rDelete(db, pCol
9ed0: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
9ee0: 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71  pCol->pDflt = sq
9ef0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
9f00: 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 45   pSpan->pExpr, E
9f10: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
9f20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
9f30: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44  ree(db, pCol->zD
9f40: 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  flt);.      pCol
9f50: 2d 3e 7a 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->zDflt = sqlite
9f60: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
9f70: 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74  char*)pSpan->zSt
9f80: 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  art,.           
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fa0: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
9fb0: 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53  pSpan->zEnd - pS
9fc0: 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20  pan->zStart));. 
9fd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
9fe0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
9ff0: 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a   pSpan->pExpr);.
a000: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61  }../*.** Designa
a010: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
a020: 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  EY for the table
a030: 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  .  pList is a li
a040: 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20  st of names .** 
a050: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
a060: 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79  form the primary
a070: 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20   key.  If pList 
a080: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
a090: 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
a0a0: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20  ly added column 
a0b0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
a0c0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
a0d0: 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63  .**.** A table c
a0e0: 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  an have at most 
a0f0: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  one primary key.
a100: 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61    If the table a
a110: 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20  lready has.** a 
a120: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64  primary key (and
a130: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
a140: 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29  ond primary key)
a150: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a   then create an.
a160: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
a170: 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  If the PRIMARY K
a180: 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c  EY is on a singl
a190: 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64  e column whose d
a1a0: 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47  atatype is INTEG
a1b0: 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77  ER,.** then we w
a1c0: 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  ill try to use t
a1d0: 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  hat column as th
a1e0: 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68  e rowid.  Set th
a1f0: 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a  e Table.iPKey.**
a200: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61   field of the ta
a210: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
a220: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65  uction to be the
a230: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
a240: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
a250: 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61   KEY column.  Ta
a260: 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74  ble.iPKey is set
a270: 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20   to -1 if there 
a280: 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52  is.** no INTEGER
a290: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a   PRIMARY KEY..**
a2a0: 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69  .** If the key i
a2b0: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
a2c0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
a2d0: 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  en create a uniq
a2e0: 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20  ue.** index for 
a2f0: 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64  the key.  No ind
a300: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f  ex is created fo
a310: 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  r INTEGER PRIMAR
a320: 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20  Y KEYs..*/.void 
a330: 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
a340: 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  yKey(.  Parse *p
a350: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
a360: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
a370: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
a380: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66  t,  /* List of f
a390: 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65  ield names to be
a3a0: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
a3b0: 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
a3c0: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
a3d0: 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20  th a uniqueness 
a3e0: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e  conflict */.  in
a3f0: 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20  t autoInc,      
a400: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41  /* True if the A
a410: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79  UTOINCREMENT key
a420: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
a430: 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
a440: 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  er     /* SQLITE
a450: 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54  _SO_ASC or SQLIT
a460: 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a  E_SO_DESC */.){.
a470: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
a480: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
a490: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  e;.  char *zType
a4a0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
a4b0: 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 6e 74 20   = -1, i;.  int 
a4c0: 6e 54 65 72 6d 3b 0a 20 20 69 66 28 20 70 54 61  nTerm;.  if( pTa
a4d0: 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  b==0 || IN_DECLA
a4e0: 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 70  RE_VTAB ) goto p
a4f0: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
a500: 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62  .  if( pTab->tab
a510: 46 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72  Flags & TF_HasPr
a520: 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20  imaryKey ){.    
a530: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
a540: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22  pParse, .      "
a550: 74 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73  table \"%s\" has
a560: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70   more than one p
a570: 72 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61  rimary key", pTa
a580: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
a590: 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f  oto primary_key_
a5a0: 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62  exit;.  }.  pTab
a5b0: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46  ->tabFlags |= TF
a5c0: 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a  _HasPrimaryKey;.
a5d0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
a5e0: 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61  {.    iCol = pTa
a5f0: 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20  b->nCol - 1;.   
a600: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
a610: 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f  ].colFlags |= CO
a620: 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20  LFLAG_PRIMKEY;. 
a630: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
a640: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
a650: 65 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 31  e;.    nTerm = 1
a660: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
a670: 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  Term = pList->nE
a680: 78 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  xpr;.    for(i=0
a690: 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b  ; i<nTerm; i++){
a6a0: 0a 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d  .      for(iCol=
a6b0: 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  0; iCol<pTab->nC
a6c0: 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ol; iCol++){.   
a6d0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
a6e0: 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
a6f0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  [i].zName, pTab-
a700: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
a710: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
a720: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43     pTab->aCol[iC
a730: 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20  ol].colFlags |= 
a740: 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b  COLFLAG_PRIMKEY;
a750: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
a760: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
a770: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20  ol].zType;.     
a780: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a790: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a7a0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54    }.  }.  if( nT
a7b0: 65 72 6d 3d 3d 31 0a 20 20 20 26 26 20 7a 54 79  erm==1.   && zTy
a7c0: 70 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  pe && sqlite3Str
a7d0: 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54  ICmp(zType, "INT
a7e0: 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 26 26 20  EGER")==0.   && 
a7f0: 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54  sortOrder==SQLIT
a800: 45 5f 53 4f 5f 41 53 43 0a 20 20 29 7b 0a 20 20  E_SO_ASC.  ){.  
a810: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
a820: 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e  iCol;.    pTab->
a830: 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e  keyConf = (u8)on
a840: 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72  Error;.    asser
a850: 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c  t( autoInc==0 ||
a860: 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20   autoInc==1 );. 
a870: 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
a880: 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f  s |= autoInc*TF_
a890: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20  Autoincrement;. 
a8a0: 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 70     if( pList ) p
a8b0: 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72  Parse->iPkSortOr
a8c0: 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30  der = pList->a[0
a8d0: 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  ].sortOrder;.  }
a8e0: 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63  else if( autoInc
a8f0: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
a900: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
a910: 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65  EMENT.    sqlite
a920: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a930: 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  , "AUTOINCREMENT
a940: 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64   is only allowed
a950: 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20   on an ".       
a960: 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59  "INTEGER PRIMARY
a970: 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20   KEY");.#endif. 
a980: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65   }else{.    Vdbe
a990: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
a9a0: 64 62 65 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  dbe;.    Index *
a9b0: 70 3b 0a 20 20 20 20 69 66 28 20 76 20 29 20 70  p;.    if( v ) p
a9c0: 50 61 72 73 65 2d 3e 61 64 64 72 53 6b 69 70 50  Parse->addrSkipP
a9d0: 4b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  K = sqlite3VdbeA
a9e0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70  ddOp0(v, OP_Noop
a9f0: 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  );.    p = sqlit
aa00: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
aa10: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70  arse, 0, 0, 0, p
aa20: 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30  List, onError, 0
aa30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
aa50: 73 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20  sortOrder, 0);. 
aa60: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
aa70: 20 20 70 2d 3e 69 64 78 54 79 70 65 20 3d 20 53    p->idxType = S
aa80: 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52  QLITE_IDXTYPE_PR
aa90: 49 4d 41 52 59 4b 45 59 3b 0a 20 20 20 20 20 20  IMARYKEY;.      
aaa0: 69 66 28 20 76 20 29 20 73 71 6c 69 74 65 33 56  if( v ) sqlite3V
aab0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
aac0: 50 61 72 73 65 2d 3e 61 64 64 72 53 6b 69 70 50  Parse->addrSkipP
aad0: 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  K);.    }.    pL
aae0: 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72  ist = 0;.  }..pr
aaf0: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a  imary_key_exit:.
ab00: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
ab10: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
ab20: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65  db, pList);.  re
ab30: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  turn;.}../*.** A
ab40: 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63  dd a new CHECK c
ab50: 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65  onstraint to the
ab60: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
ab70: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
ab80: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
ab90: 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73  ite3AddCheckCons
aba0: 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20  traint(.  Parse 
abb0: 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50  *pParse,    /* P
abc0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
abd0: 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b  /.  Expr *pCheck
abe0: 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65  Expr  /* The che
abf0: 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  ck expression */
ac00: 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
ac10: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
ac20: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50  Table *pTab = pP
ac30: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
ac40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
ac50: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
ac60: 66 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44  f( pTab && !IN_D
ac70: 45 43 4c 41 52 45 5f 56 54 41 42 0a 20 20 20 26  ECLARE_VTAB.   &
ac80: 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 49  & !sqlite3BtreeI
ac90: 73 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e 61 44  sReadonly(db->aD
aca0: 62 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e  b[db->init.iDb].
acb0: 70 42 74 29 0a 20 20 29 7b 0a 20 20 20 20 70 54  pBt).  ){.    pT
acc0: 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c  ab->pCheck = sql
acd0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
ace0: 6e 64 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  nd(pParse, pTab-
acf0: 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b 45  >pCheck, pCheckE
ad00: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50  xpr);.    if( pP
ad10: 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74  arse->constraint
ad20: 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20  Name.n ){.      
ad30: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
ad40: 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  etName(pParse, p
ad50: 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50  Tab->pCheck, &pP
ad60: 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74  arse->constraint
ad70: 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Name, 1);.    }.
ad80: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
ad90: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   {.    sqlite3Ex
ada0: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
adb0: 3e 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29  >db, pCheckExpr)
adc0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
add0: 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  et the collation
ade0: 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65   function of the
adf0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70   most recently p
ae00: 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75  arsed table colu
ae10: 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c  mn.** to the Col
ae20: 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76  lSeq given..*/.v
ae30: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
ae40: 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20  llateType(Parse 
ae50: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
ae60: 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65  pToken){.  Table
ae70: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
ae80: 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20  char *zColl;    
ae90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71            /* Deq
aea0: 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f  uoted name of co
aeb0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
aec0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
aed0: 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70  b;..  if( (p = p
aee0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
aef0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  )==0 ) return;. 
af00: 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a   i = p->nCol-1;.
af10: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
af20: 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  b;.  zColl = sql
af30: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
af40: 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20  n(db, pToken);. 
af50: 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65   if( !zColl ) re
af60: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c  turn;..  if( sql
af70: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
af80: 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29  q(pParse, zColl)
af90: 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
afa0: 49 64 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Idx;.    sqlite3
afb0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
afc0: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20  ol[i].zColl);.  
afd0: 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f    p->aCol[i].zCo
afe0: 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20  ll = zColl;.  . 
aff0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
b000: 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20  umn is declared 
b010: 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41  as "<name> PRIMA
b020: 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c  RY KEY COLLATE <
b030: 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74  type>",.    ** t
b040: 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79  hen an index may
b050: 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74   have been creat
b060: 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d  ed on this colum
b070: 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  n before the.   
b080: 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79   ** collation ty
b090: 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f  pe was added. Co
b0a0: 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74  rrect this if it
b0b0: 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
b0c0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64    */.    for(pId
b0d0: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
b0e0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
b0f0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
b100: 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  rt( pIdx->nKeyCo
b110: 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  l==1 );.      if
b120: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
b130: 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  [0]==i ){.      
b140: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30    pIdx->azColl[0
b150: 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  ] = p->aCol[i].z
b160: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
b170: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
b180: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
b190: 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d  b, zColl);.  }.}
b1a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
b1b0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
b1c0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
b1d0: 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73  ence for databas
b1e0: 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a  e native text.**
b1f0: 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69   encoding identi
b200: 66 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69  fied by the stri
b210: 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68  ng zName, length
b220: 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   nName..**.** If
b230: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
b240: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
b250: 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
b260: 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c  le, or not avail
b270: 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64  able.** in the d
b280: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65  atabase native e
b290: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c  ncoding, the col
b2a0: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
b2b0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20  s invoked to.** 
b2c0: 72 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74  request it. If t
b2d0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
b2e0: 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75  tory does not su
b2f0: 70 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75  pply such a sequ
b300: 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65  ence,.** and the
b310: 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61   sequence is ava
b320: 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65  ilable in anothe
b330: 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c  r text encoding,
b340: 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a   then that is.**
b350: 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
b360: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76  d..**.** If no v
b370: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72  ersions of the r
b380: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
b390: 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65  ons sequence are
b3a0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a   available, or.*
b3b0: 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20  * another error 
b3c0: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
b3d0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20  returned and an 
b3e0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72  error message wr
b3f0: 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50  itten into.** pP
b400: 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  arse..**.** This
b410: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72   routine is a wr
b420: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
b430: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
b440: 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ).  This routine
b450: 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  .** invokes the 
b460: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
b470: 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63  y if the named c
b480: 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  ollation cannot 
b490: 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20  be found.** and 
b4a0: 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72  generates an err
b4b0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  or message..**.*
b4c0: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69  * See also: sqli
b4d0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29  te3FindCollSeq()
b4e0: 2c 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  , sqlite3GetColl
b4f0: 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  Seq().*/.CollSeq
b500: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   *sqlite3LocateC
b510: 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50  ollSeq(Parse *pP
b520: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
b530: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69   *zName){.  sqli
b540: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b550: 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d  ->db;.  u8 enc =
b560: 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69   ENC(db);.  u8 i
b570: 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e  nitbusy = db->in
b580: 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53  it.busy;.  CollS
b590: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43  eq *pColl;..  pC
b5a0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
b5b0: 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63  dCollSeq(db, enc
b5c0: 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73  , zName, initbus
b5d0: 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62  y);.  if( !initb
b5e0: 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c  usy && (!pColl |
b5f0: 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20  | !pColl->xCmp) 
b600: 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  ){.    pColl = s
b610: 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
b620: 28 70 50 61 72 73 65 2c 20 65 6e 63 2c 20 70 43  (pParse, enc, pC
b630: 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d  oll, zName);.  }
b640: 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  ..  return pColl
b650: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
b660: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
b670: 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  ill increment th
b680: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
b690: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d  .**.** The schem
b6a0: 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64  a cookie is used
b6b0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
b6c0: 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f  en the schema fo
b6d0: 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  r the.** databas
b6e0: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65  e changes.  Afte
b6f0: 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68  r each schema ch
b700: 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65  ange, the cookie
b710: 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65   value.** change
b720: 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65  s.  When a proce
b730: 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74  ss first reads t
b740: 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63  he schema it rec
b750: 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b  ords the.** cook
b760: 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c  ie.  Thereafter,
b770: 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65   whenever it goe
b780: 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
b790: 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20  database,.** it 
b7a0: 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69  checks the cooki
b7b0: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
b7c0: 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f  he schema has no
b7d0: 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e  t changed.** sin
b7e0: 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72  ce it was last r
b7f0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
b800: 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70  plan is not comp
b810: 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72  letely bullet-pr
b820: 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73  oof.  It is poss
b830: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  ible for.** the 
b840: 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65  schema to change
b850: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
b860: 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b  and for the cook
b870: 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20  ie to be.** set 
b880: 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61  back to prior va
b890: 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61  lue.  But schema
b8a0: 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66   changes are inf
b8b0: 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74  requent.** and t
b8c0: 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
b8d0: 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61  f hitting the sa
b8e0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  me cookie value 
b8f0: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61  is only.** 1 cha
b900: 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f  nce in 2^32.  So
b910: 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75   we're safe enou
b920: 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  gh..*/.void sqli
b930: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
b940: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
b950: 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 72  nt iDb){.  int r
b960: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
b970: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
b980: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b990: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
b9a0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
b9b0: 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Vdbe;.  assert( 
b9c0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
b9d0: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
b9e0: 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  0) );.  sqlite3V
b9f0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
ba00: 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62  Integer, db->aDb
ba10: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73  [iDb].pSchema->s
ba20: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20  chema_cookie+1, 
ba30: 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
ba40: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
ba50: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
ba60: 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53  TREE_SCHEMA_VERS
ba70: 49 4f 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  ION, r1);.  sqli
ba80: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
ba90: 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
baa0: 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20  ../*.** Measure 
bab0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
bac0: 61 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20  aracters needed 
bad0: 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69  to output the gi
bae0: 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65  ven.** identifie
baf0: 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72  r.  The number r
bb00: 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73  eturned includes
bb10: 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64   any quotes used
bb20: 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  .** but does not
bb30: 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c   include the nul
bb40: 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a  l terminator..**
bb50: 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65  .** The estimate
bb60: 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65   is conservative
bb70: 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c  .  It might be l
bb80: 61 72 67 65 72 20 74 68 61 74 20 77 68 61 74 20  arger that what 
bb90: 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65  is.** really nee
bba0: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
bbb0: 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63  nt identLength(c
bbc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
bbd0: 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d   int n;.  for(n=
bbe0: 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29  0; *z; n++, z++)
bbf0: 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22  {.    if( *z=='"
bc00: 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a  ' ){ n++; }.  }.
bc10: 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a    return n + 2;.
bc20: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72  }../*.** The fir
bc30: 73 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  st parameter is 
bc40: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
bc50: 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54  output buffer. T
bc60: 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61  he second .** pa
bc70: 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
bc80: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67  nter to an integ
bc90: 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  er that contains
bca0: 20 74 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a   the offset at.*
bcb0: 2a 20 77 68 69 63 68 20 74 6f 20 77 72 69 74 65  * which to write
bcc0: 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74   into the output
bcd0: 20 62 75 66 66 65 72 2e 20 54 68 69 73 20 66 75   buffer. This fu
bce0: 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68  nction copies th
bcf0: 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  e.** nul-termina
bd00: 74 65 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74  ted string point
bd10: 65 64 20 74 6f 20 62 79 20 74 68 65 20 74 68 69  ed to by the thi
bd20: 72 64 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53  rd parameter, zS
bd30: 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74  ignedIdent,.** t
bd40: 6f 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  o the specified 
bd50: 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 62 75  offset in the bu
bd60: 66 66 65 72 20 61 6e 64 20 75 70 64 61 74 65 73  ffer and updates
bd70: 20 2a 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a   *pIdx to refer.
bd80: 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ** to the first 
bd90: 62 79 74 65 20 61 66 74 65 72 20 74 68 65 20 6c  byte after the l
bda0: 61 73 74 20 62 79 74 65 20 77 72 69 74 74 65 6e  ast byte written
bdb0: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
bdc0: 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  g..** .** If the
bdd0: 20 73 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49   string zSignedI
bde0: 64 65 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e  dent consists en
bdf0: 74 69 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d  tirely of alpha-
be00: 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61  numeric.** chara
be10: 63 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20  cters, does not 
be20: 62 65 67 69 6e 20 77 69 74 68 20 61 20 64 69 67  begin with a dig
be30: 69 74 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e  it and is not an
be40: 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a   SQL keyword,.**
be50: 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69   then it is copi
be60: 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ed to the output
be70: 20 62 75 66 66 65 72 20 65 78 61 63 74 6c 79 20   buffer exactly 
be80: 61 73 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77  as it is. Otherw
be90: 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75  ise,.** it is qu
bea0: 6f 74 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c  oted using doubl
beb0: 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61  e-quotes..*/.sta
bec0: 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75  tic void identPu
bed0: 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a  t(char *z, int *
bee0: 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67  pIdx, char *zSig
bef0: 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73  nedIdent){.  uns
bf00: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65  igned char *zIde
bf10: 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  nt = (unsigned c
bf20: 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e  har*)zSignedIden
bf30: 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e  t;.  int i, j, n
bf40: 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20  eedQuote;.  i = 
bf50: 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d  *pIdx;..  for(j=
bf60: 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b  0; zIdent[j]; j+
bf70: 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c  +){.    if( !sql
bf80: 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65  ite3Isalnum(zIde
bf90: 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74  nt[j]) && zIdent
bfa0: 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b  [j]!='_' ) break
bfb0: 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74  ;.  }.  needQuot
bfc0: 65 20 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67  e = sqlite3Isdig
bfd0: 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20  it(zIdent[0]).  
bfe0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
bff0: 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28  ite3KeywordCode(
c000: 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49  zIdent, j)!=TK_I
c010: 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  D.            ||
c020: 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20   zIdent[j]!=0.  
c030: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d            || j==
c040: 30 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75  0;..  if( needQu
c050: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
c060: 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  "';.  for(j=0; z
c070: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
c080: 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64      z[i++] = zId
c090: 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  ent[j];.    if( 
c0a0: 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29  zIdent[j]=='"' )
c0b0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
c0c0: 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f   }.  if( needQuo
c0d0: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  te ) z[i++] = '"
c0e0: 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20  ';.  z[i] = 0;. 
c0f0: 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f   *pIdx = i;.}../
c100: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
c110: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
c120: 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61  tement appropria
c130: 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  te for the given
c140: 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f  .** table.  Memo
c150: 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74  ry to hold the t
c160: 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  ext of the state
c170: 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64  ment is obtained
c180: 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  .** from sqliteM
c190: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
c1a0: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
c1b0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
c1c0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
c1d0: 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74  r *createTableSt
c1e0: 6d 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  mt(sqlite3 *db, 
c1f0: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Table *p){.  int
c200: 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72   i, k, n;.  char
c210: 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20   *zStmt;.  char 
c220: 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a  *zSep, *zSep2, *
c230: 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  zEnd;.  Column *
c240: 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20  pCol;.  n = 0;. 
c250: 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61   for(pCol = p->a
c260: 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e  Col, i=0; i<p->n
c270: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
c280: 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e  ){.    n += iden
c290: 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e  tLength(pCol->zN
c2a0: 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20  ame) + 5;.  }.  
c2b0: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
c2c0: 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  (p->zName);.  if
c2d0: 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a  ( n<50 ){ .    z
c2e0: 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53  Sep = "";.    zS
c2f0: 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a  ep2 = ",";.    z
c300: 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c  End = ")";.  }el
c310: 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  se{.    zSep = "
c320: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32  \n  ";.    zSep2
c330: 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20   = ",\n  ";.    
c340: 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20  zEnd = "\n)";.  
c350: 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a  }.  n += 35 + 6*
c360: 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74  p->nCol;.  zStmt
c370: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
c380: 6f 63 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69  ocRaw(0, n);.  i
c390: 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20  f( zStmt==0 ){. 
c3a0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
c3b0: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  led = 1;.    ret
c3c0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
c3d0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c  ite3_snprintf(n,
c3e0: 20 7a 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20   zStmt, "CREATE 
c3f0: 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20  TABLE ");.  k = 
c400: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
c410: 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50  zStmt);.  identP
c420: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d  ut(zStmt, &k, p-
c430: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74  >zName);.  zStmt
c440: 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66  [k++] = '(';.  f
c450: 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c  or(pCol=p->aCol,
c460: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
c470: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
c480: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
c490: 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54  char * const azT
c4a0: 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ype[] = {.      
c4b0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    /* SQLITE_AFF_
c4c0: 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54 45 58  TEXT    */ " TEX
c4d0: 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  T",.        /* S
c4e0: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20  QLITE_AFF_NONE  
c4f0: 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20 20 20    */ "",.       
c500: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   /* SQLITE_AFF_N
c510: 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22  UMERIC */ " NUM"
c520: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
c530: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
c540: 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20 20 20 20  */ " INT",.     
c550: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
c560: 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22 20 52 45  _REAL    */ " RE
c570: 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69  AL".    };.    i
c580: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73  nt len;.    cons
c590: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a  t char *zType;..
c5a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
c5b0: 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74  intf(n-k, &zStmt
c5c0: 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20  [k], zSep);.    
c5d0: 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  k += sqlite3Strl
c5e0: 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b  en30(&zStmt[k]);
c5f0: 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70  .    zSep = zSep
c600: 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28  2;.    identPut(
c610: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d  zStmt, &k, pCol-
c620: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73 73  >zName);.    ass
c630: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
c640: 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ity-SQLITE_AFF_T
c650: 45 58 54 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20  EXT >= 0 );.    
c660: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66  assert( pCol->af
c670: 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46  finity-SQLITE_AF
c680: 46 5f 54 45 58 54 20 3c 20 41 72 72 61 79 53 69  F_TEXT < ArraySi
c690: 7a 65 28 61 7a 54 79 70 65 29 20 29 3b 0a 20 20  ze(azType) );.  
c6a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
c6b0: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
c6c0: 54 45 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20  TE_AFF_TEXT );. 
c6d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
c6e0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
c6f0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 3b 0a  ITE_AFF_NONE );.
c700: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
c710: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
c720: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
c730: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
c740: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
c750: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
c760: 45 47 45 52 20 29 3b 0a 20 20 20 20 74 65 73 74  EGER );.    test
c770: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
c780: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
c790: 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20  _REAL );.    .  
c7a0: 20 20 7a 54 79 70 65 20 3d 20 61 7a 54 79 70 65    zType = azType
c7b0: 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20  [pCol->affinity 
c7c0: 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  - SQLITE_AFF_TEX
c7d0: 54 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71  T];.    len = sq
c7e0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
c7f0: 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ype);.    assert
c800: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
c810: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
c820: 45 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  E .            |
c830: 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  | pCol->affinity
c840: 3d 3d 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  ==sqlite3Affinit
c850: 79 54 79 70 65 28 7a 54 79 70 65 2c 20 30 29 20  yType(zType, 0) 
c860: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
c870: 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20  Stmt[k], zType, 
c880: 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c  len);.    k += l
c890: 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  en;.    assert( 
c8a0: 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71  k<=n );.  }.  sq
c8b0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
c8c0: 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22  -k, &zStmt[k], "
c8d0: 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65  %s", zEnd);.  re
c8e0: 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f  turn zStmt;.}../
c8f0: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61 6e 20 49  *.** Resize an I
c900: 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 68  ndex object to h
c910: 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f  old N columns to
c920: 74 61 6c 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  tal.  Return SQL
c930: 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
c940: 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54 45 5f  cess and SQLITE_
c950: 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20  NOMEM on an OOM 
c960: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
c970: 20 69 6e 74 20 72 65 73 69 7a 65 49 6e 64 65 78   int resizeIndex
c980: 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Object(sqlite3 *
c990: 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 2c  db, Index *pIdx,
c9a0: 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61 72 20   int N){.  char 
c9b0: 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e  *zExtra;.  int n
c9c0: 42 79 74 65 3b 0a 20 20 69 66 28 20 70 49 64 78  Byte;.  if( pIdx
c9d0: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72  ->nColumn>=N ) r
c9e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c9f0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d  .  assert( pIdx-
ca00: 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b  >isResized==0 );
ca10: 0a 20 20 6e 42 79 74 65 20 3d 20 28 73 69 7a 65  .  nByte = (size
ca20: 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69 7a 65  of(char*) + size
ca30: 6f 66 28 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a  of(i16) + 1)*N;.
ca40: 20 20 7a 45 78 74 72 61 20 3d 20 73 71 6c 69 74    zExtra = sqlit
ca50: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
ca60: 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  b, nByte);.  if(
ca70: 20 7a 45 78 74 72 61 3d 3d 30 20 29 20 72 65 74   zExtra==0 ) ret
ca80: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
ca90: 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72  ;.  memcpy(zExtr
caa0: 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c  a, pIdx->azColl,
cab0: 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70   sizeof(char*)*p
cac0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Idx->nColumn);. 
cad0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20   pIdx->azColl = 
cae0: 28 63 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a  (char**)zExtra;.
caf0: 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65    zExtra += size
cb00: 6f 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d  of(char*)*N;.  m
cb10: 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49  emcpy(zExtra, pI
cb20: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69  dx->aiColumn, si
cb30: 7a 65 6f 66 28 69 31 36 29 2a 70 49 64 78 2d 3e  zeof(i16)*pIdx->
cb40: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78  nColumn);.  pIdx
cb50: 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31  ->aiColumn = (i1
cb60: 36 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78  6*)zExtra;.  zEx
cb70: 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31  tra += sizeof(i1
cb80: 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a  6)*N;.  memcpy(z
cb90: 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f  Extra, pIdx->aSo
cba0: 72 74 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e  rtOrder, pIdx->n
cbb0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d  Column);.  pIdx-
cbc0: 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
cbd0: 38 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70 49 64  8*)zExtra;.  pId
cbe0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a  x->nColumn = N;.
cbf0: 20 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65    pIdx->isResize
cc00: 64 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  d = 1;.  return 
cc10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
cc20: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65  .** Estimate the
cc30: 20 74 6f 74 61 6c 20 72 6f 77 20 77 69 64 74 68   total row width
cc40: 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f   for a table..*/
cc50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74  .static void est
cc60: 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28  imateTableWidth(
cc70: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
cc80: 75 6e 73 69 67 6e 65 64 20 77 54 61 62 6c 65 20  unsigned wTable 
cc90: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  = 0;.  const Col
cca0: 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20  umn *pTabCol;.  
ccb0: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70  int i;.  for(i=p
ccc0: 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43  Tab->nCol, pTabC
ccd0: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69  ol=pTab->aCol; i
cce0: 3e 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c  >0; i--, pTabCol
ccf0: 2b 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c 65 20  ++){.    wTable 
cd00: 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73  += pTabCol->szEs
cd10: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  t;.  }.  if( pTa
cd20: 62 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77 54 61  b->iPKey<0 ) wTa
cd30: 62 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73  ble++;.  pTab->s
cd40: 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65  zTabRow = sqlite
cd50: 33 4c 6f 67 45 73 74 28 77 54 61 62 6c 65 2a 34  3LogEst(wTable*4
cd60: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69  );.}../*.** Esti
cd70: 6d 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65  mate the average
cd80: 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 66   size of a row f
cd90: 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a  or an index..*/.
cda0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69  static void esti
cdb0: 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 49  mateIndexWidth(I
cdc0: 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75  ndex *pIdx){.  u
cdd0: 6e 73 69 67 6e 65 64 20 77 49 6e 64 65 78 20 3d  nsigned wIndex =
cde0: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63   0;.  int i;.  c
cdf0: 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  onst Column *aCo
ce00: 6c 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  l = pIdx->pTable
ce10: 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d  ->aCol;.  for(i=
ce20: 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; i<pIdx->nColu
ce30: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31  mn; i++){.    i1
ce40: 36 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  6 x = pIdx->aiCo
ce50: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73  lumn[i];.    ass
ce60: 65 72 74 28 20 78 3c 70 49 64 78 2d 3e 70 54 61  ert( x<pIdx->pTa
ce70: 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  ble->nCol );.   
ce80: 20 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f   wIndex += x<0 ?
ce90: 20 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e   1 : aCol[pIdx->
cea0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45  aiColumn[i]].szE
ceb0: 73 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e  st;.  }.  pIdx->
cec0: 73 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74  szIdxRow = sqlit
ced0: 65 33 4c 6f 67 45 73 74 28 77 49 6e 64 65 78 2a  e3LogEst(wIndex*
cee0: 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  4);.}../* Return
cef0: 20 74 72 75 65 20 69 66 20 76 61 6c 75 65 20 78   true if value x
cf00: 20 69 73 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66   is found any of
cf10: 20 74 68 65 20 66 69 72 73 74 20 6e 43 6f 6c 20   the first nCol 
cf20: 65 6e 74 72 69 65 73 20 6f 66 20 61 69 43 6f 6c  entries of aiCol
cf30: 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  [].*/.static int
cf40: 20 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74   hasColumn(const
cf50: 20 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74   i16 *aiCol, int
cf60: 20 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20   nCol, int x){. 
cf70: 20 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e   while( nCol-- >
cf80: 20 30 20 29 20 69 66 28 20 78 3d 3d 2a 28 61 69   0 ) if( x==*(ai
cf90: 43 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72 6e 20  Col++) ) return 
cfa0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
cfb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
cfc0: 74 69 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65  tine runs at the
cfd0: 20 65 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20   end of parsing 
cfe0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
cff0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a  tatement that.**
d000: 20 68 61 73 20 61 20 57 49 54 48 4f 55 54 20 52   has a WITHOUT R
d010: 4f 57 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68  OWID clause.  Th
d020: 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f  e job of this ro
d030: 75 74 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76  utine is to conv
d040: 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65  ert both.** inte
d050: 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61  rnal schema data
d060: 20 73 74 72 75 63 74 75 72 65 73 20 61 6e 64 20   structures and 
d070: 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 56 44  the generated VD
d080: 42 45 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20  BE code so that 
d090: 74 68 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72  they.** are appr
d0a0: 6f 70 72 69 61 74 65 20 66 6f 72 20 61 20 57 49  opriate for a WI
d0b0: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
d0c0: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72  e instead of a r
d0d0: 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43  owid table..** C
d0e0: 68 61 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a  hanges include:.
d0f0: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 43  **.**     (1)  C
d100: 6f 6e 76 65 72 74 20 74 68 65 20 4f 50 5f 43 72  onvert the OP_Cr
d110: 65 61 74 65 54 61 62 6c 65 20 69 6e 74 6f 20 61  eateTable into a
d120: 6e 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  n OP_CreateIndex
d130: 2e 20 20 54 68 65 72 65 20 69 73 0a 2a 2a 20 20  .  There is.**  
d140: 20 20 20 20 20 20 20 20 6e 6f 20 72 6f 77 69 64          no rowid
d150: 20 62 74 72 65 65 20 66 6f 72 20 61 20 57 49 54   btree for a WIT
d160: 48 4f 55 54 20 52 4f 57 49 44 2e 20 20 49 6e 73  HOUT ROWID.  Ins
d170: 74 65 61 64 2c 20 74 68 65 20 63 61 6e 6f 6e 69  tead, the canoni
d180: 63 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  cal.**          
d190: 64 61 74 61 20 73 74 6f 72 61 67 65 20 69 73 20  data storage is 
d1a0: 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
d1b0: 20 62 74 72 65 65 2e 0a 2a 2a 20 20 20 20 20 28   btree..**     (
d1c0: 32 29 20 20 42 79 70 61 73 73 20 74 68 65 20 63  2)  Bypass the c
d1d0: 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  reation of the s
d1e0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
d1f0: 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20  le entry.**     
d200: 20 20 20 20 20 66 6f 72 20 74 68 65 20 50 52 49       for the PRI
d210: 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68 65 20  MARY KEY as the 
d220: 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
d230: 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20  x is now.**     
d240: 20 20 20 20 20 69 64 65 6e 74 69 66 69 65 64 20       identified 
d250: 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  by the sqlite_ma
d260: 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79  ster table entry
d270: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 74   of the table it
d280: 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 33 29  self..**     (3)
d290: 20 20 53 65 74 20 74 68 65 20 49 6e 64 65 78 2e    Set the Index.
d2a0: 74 6e 75 6d 20 6f 66 20 74 68 65 20 50 52 49 4d  tnum of the PRIM
d2b0: 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62  ARY KEY Index ob
d2c0: 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20  ject in the.**  
d2d0: 20 20 20 20 20 20 20 20 73 63 68 65 6d 61 20 74          schema t
d2e0: 6f 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  o the rootpage f
d2f0: 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61 62  rom the main tab
d300: 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20  le..**     (4)  
d310: 53 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20  Set all columns 
d320: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
d330: 45 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  EY schema object
d340: 20 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e   to be NOT NULL.
d350: 0a 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64 64  .**     (5)  Add
d360: 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d   all table colum
d370: 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52  ns to the PRIMAR
d380: 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65  Y KEY Index obje
d390: 63 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73  ct.**          s
d3a0: 6f 20 74 68 61 74 20 74 68 65 20 50 52 49 4d 41  o that the PRIMA
d3b0: 52 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65  RY KEY is a cove
d3c0: 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65  ring index.  The
d3d0: 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20   surplus.**     
d3e0: 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65       columns are
d3f0: 20 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f   part of KeyInfo
d400: 2e 6e 58 46 69 65 6c 64 20 61 6e 64 20 61 72 65  .nXField and are
d410: 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a   not used for.**
d420: 20 20 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e            sortin
d430: 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75  g or lookup or u
d440: 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73  niqueness checks
d450: 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65  ..**     (6)  Re
d460: 70 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64 20  place the rowid 
d470: 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f  tail on all auto
d480: 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61  matically genera
d490: 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20  ted UNIQUE.**   
d4a0: 20 20 20 20 20 20 20 69 6e 64 69 63 65 73 20 77         indices w
d4b0: 69 74 68 20 74 68 65 20 50 52 49 4d 41 52 59 20  ith the PRIMARY 
d4c0: 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a  KEY columns..*/.
d4d0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 76  static void conv
d4e0: 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
d4f0: 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  dTable(Parse *pP
d500: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
d510: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  b){.  Index *pId
d520: 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b  x;.  Index *pPk;
d530: 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e  .  int nPk;.  in
d540: 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65  t i, j;.  sqlite
d550: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
d560: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  db;.  Vdbe *v = 
d570: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a  pParse->pVdbe;..
d580: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
d590: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20   OP_CreateTable 
d5a0: 6f 70 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c  opcode that woul
d5b0: 64 20 6e 6f 72 6d 61 6c 6c 79 20 63 72 65 61 74  d normally creat
d5c0: 65 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6f 74 2d  e the.  ** root-
d5d0: 70 61 67 65 20 66 6f 72 20 74 68 65 20 74 61 62  page for the tab
d5e0: 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 43 72  le into an OP_Cr
d5f0: 65 61 74 65 49 6e 64 65 78 20 6f 70 63 6f 64 65  eateIndex opcode
d600: 2e 20 20 54 68 65 20 69 6e 64 65 78 0a 20 20 2a  .  The index.  *
d610: 2a 20 63 72 65 61 74 65 64 20 77 69 6c 6c 20 62  * created will b
d620: 65 63 6f 6d 65 20 74 68 65 20 50 52 49 4d 41 52  ecome the PRIMAR
d630: 59 20 4b 45 59 20 69 6e 64 65 78 2e 0a 20 20 2a  Y KEY index..  *
d640: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
d650: 61 64 64 72 43 72 54 61 62 20 29 7b 0a 20 20 20  addrCrTab ){.   
d660: 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20   assert( v );.  
d670: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
d680: 4f 70 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64  Op(v, pParse->ad
d690: 64 72 43 72 54 61 62 29 2d 3e 6f 70 63 6f 64 65  drCrTab)->opcode
d6a0: 20 3d 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65   = OP_CreateInde
d6b0: 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 79 70  x;.  }..  /* Byp
d6c0: 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e  ass the creation
d6d0: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
d6e0: 4b 45 59 20 62 74 72 65 65 20 61 6e 64 20 74 68  KEY btree and th
d6f0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a  e sqlite_master.
d700: 20 20 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79    ** table entry
d710: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
d720: 72 73 65 2d 3e 61 64 64 72 53 6b 69 70 50 4b 20  rse->addrSkipPK 
d730: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  ){.    assert( v
d740: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   );.    sqlite3V
d750: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 50 61 72  dbeGetOp(v, pPar
d760: 73 65 2d 3e 61 64 64 72 53 6b 69 70 50 4b 29 2d  se->addrSkipPK)-
d770: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 47 6f 74  >opcode = OP_Got
d780: 6f 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  o;.  }..  /* Loc
d790: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
d7a0: 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20  KEY index.  Or, 
d7b0: 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 77 61  if this table wa
d7c0: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  s originally.  *
d7d0: 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  * an INTEGER PRI
d7e0: 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20  MARY KEY table, 
d7f0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 52 49  create a new PRI
d800: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20  MARY KEY index. 
d810: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
d820: 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20  ->iPKey>=0 ){.  
d830: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
d840: 74 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  t;.    pList = s
d850: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
d860: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
d870: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  0);.    if( pLis
d880: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
d890: 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a     pList->a[0].z
d8a0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
d8b0: 53 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  StrDup(pParse->d
d8c0: 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
d8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8e0: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
d8f0: 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65  >aCol[pTab->iPKe
d900: 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  y].zName);.    p
d910: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
d920: 72 64 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 69  rder = pParse->i
d930: 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  PkSortOrder;.   
d940: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
d950: 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62  >pNewTable==pTab
d960: 20 29 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71   );.    pPk = sq
d970: 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
d980: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
d990: 2c 20 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b  , pList, pTab->k
d9a0: 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c  eyConf, 0, 0, 0,
d9b0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 50 6b   0);.    if( pPk
d9c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
d9d0: 20 20 70 50 6b 2d 3e 69 64 78 54 79 70 65 20 3d    pPk->idxType =
d9e0: 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f   SQLITE_IDXTYPE_
d9f0: 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 20 20  PRIMARYKEY;.    
da00: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  pTab->iPKey = -1
da10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
da20: 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d  Pk = sqlite3Prim
da30: 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62  aryKeyIndex(pTab
da40: 29 3b 0a 20 20 7d 0a 20 20 70 50 6b 2d 3e 69 73  );.  }.  pPk->is
da50: 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20  Covering = 1;.  
da60: 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29  assert( pPk!=0 )
da70: 3b 0a 20 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e  ;.  nPk = pPk->n
da80: 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 4d 61  KeyCol;..  /* Ma
da90: 6b 65 20 73 75 72 65 20 65 76 65 72 79 20 63 6f  ke sure every co
daa0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 50 52 49 4d  lumn of the PRIM
dab0: 41 52 59 20 4b 45 59 20 69 73 20 4e 4f 54 20 4e  ARY KEY is NOT N
dac0: 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ULL */.  for(i=0
dad0: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
dae0: 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 50     pTab->aCol[pP
daf0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e  k->aiColumn[i]].
db00: 6e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 7d  notNull = 1;.  }
db10: 0a 20 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e  .  pPk->uniqNotN
db20: 75 6c 6c 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54  ull = 1;..  /* T
db30: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
db40: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
db50: 69 73 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  is the table roo
db60: 74 20 70 61 67 65 20 2a 2f 0a 20 20 70 50 6b 2d  t page */.  pPk-
db70: 3e 74 6e 75 6d 20 3d 20 70 54 61 62 2d 3e 74 6e  >tnum = pTab->tn
db80: 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65  um;..  /* Update
db90: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
dba0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
dbb0: 20 61 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64 69   all UNIQUE indi
dbc0: 63 65 73 20 62 79 20 63 6f 6e 76 65 72 74 69 6e  ces by convertin
dbd0: 67 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c  g.  ** the final
dbe0: 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e   rowid column in
dbf0: 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63  to one or more c
dc00: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52  olumns of the PR
dc10: 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a  IMARY KEY..  */.
dc20: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
dc30: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
dc40: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
dc50: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
dc60: 20 69 66 28 20 49 73 50 72 69 6d 61 72 79 4b 65   if( IsPrimaryKe
dc70: 79 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 63  yIndex(pIdx) ) c
dc80: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
dc90: 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69  (i=n=0; i<nPk; i
dca0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
dcb0: 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e  hasColumn(pIdx->
dcc0: 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e  aiColumn, pIdx->
dcd0: 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69  nKeyCol, pPk->ai
dce0: 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b  Column[i]) ) n++
dcf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
dd00: 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  n==0 ){.      /*
dd10: 20 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 61   This index is a
dd20: 20 73 75 70 65 72 73 65 74 20 6f 66 20 74 68 65   superset of the
dd30: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a   primary key */.
dd40: 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c        pIdx->nCol
dd50: 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79  umn = pIdx->nKey
dd60: 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  Col;.      conti
dd70: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
dd80: 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62  f( resizeIndexOb
dd90: 6a 65 63 74 28 64 62 2c 20 70 49 64 78 2c 20 70  ject(db, pIdx, p
dda0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20  Idx->nKeyCol+n) 
ddb0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f  ) return;.    fo
ddc0: 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e  r(i=0, j=pIdx->n
ddd0: 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69  KeyCol; i<nPk; i
dde0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
ddf0: 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e  hasColumn(pIdx->
de00: 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e  aiColumn, pIdx->
de10: 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69  nKeyCol, pPk->ai
de20: 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20  Column[i]) ){.  
de30: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
de40: 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61  lumn[j] = pPk->a
de50: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
de60: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
de70: 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c  [j] = pPk->azCol
de80: 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 6a 2b  l[i];.        j+
de90: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
dea0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
deb0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78  x->nColumn>=pIdx
dec0: 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20  ->nKeyCol+n );. 
ded0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
dee0: 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20  >nColumn>=j );. 
def0: 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c   }..  /* Add all
df00: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74   table columns t
df10: 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  o the PRIMARY KE
df20: 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 69  Y index.  */.  i
df30: 66 28 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f  f( nPk<pTab->nCo
df40: 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73  l ){.    if( res
df50: 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64  izeIndexObject(d
df60: 62 2c 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e 43  b, pPk, pTab->nC
df70: 6f 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ol) ) return;.  
df80: 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b    for(i=0, j=nPk
df90: 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; i<pTab->nCol; 
dfa0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
dfb0: 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e  !hasColumn(pPk->
dfc0: 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20  aiColumn, j, i) 
dfd0: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
dfe0: 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d  t( j<pPk->nColum
dff0: 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 6b  n );.        pPk
e000: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20  ->aiColumn[j] = 
e010: 69 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e  i;.        pPk->
e020: 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 22 42 49 4e  azColl[j] = "BIN
e030: 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6a 2b  ARY";.        j+
e040: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
e050: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b  .    assert( pPk
e060: 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a  ->nColumn==j );.
e070: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
e080: 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d  ->nCol==j );.  }
e090: 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e  else{.    pPk->n
e0a0: 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e  Column = pTab->n
e0b0: 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  Col;.  }.}../*.*
e0c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
e0d0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f  s called to repo
e0e0: 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22  rt the final ")"
e0f0: 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73   that terminates
e100: 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42  .** a CREATE TAB
e110: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
e120: 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74  .** The table st
e130: 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74 68  ructure that oth
e140: 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e  er action routin
e150: 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75 69  es have been bui
e160: 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65  lding.** is adde
e170: 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61  d to the interna
e180: 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61  l hash tables, a
e190: 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72  ssuming no error
e1a0: 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72  s have.** occurr
e1b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74  ed..**.** An ent
e1c0: 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ry for the table
e1d0: 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20   is made in the 
e1e0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20  master table on 
e1f0: 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20  disk, unless.** 
e200: 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72  this is a tempor
e210: 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d  ary table or db-
e220: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20  >init.busy==1.  
e230: 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75  When db->init.bu
e240: 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e  sy==1.** it mean
e250: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
e260: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
e270: 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65  er table because
e280: 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e   we just.** conn
e290: 65 63 74 65 64 20 74 6f 20 74 68 65 20 64 61 74  ected to the dat
e2a0: 61 62 61 73 65 20 6f 72 20 62 65 63 61 75 73 65  abase or because
e2b0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
e2c0: 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20  er table has.** 
e2d0: 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64  recently changed
e2e0: 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66  , so the entry f
e2f0: 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c  or this table al
e300: 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a  ready exists in.
e310: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ** the sqlite_ma
e320: 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20  ster table.  We 
e330: 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63  do not want to c
e340: 72 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a  reate it again..
e350: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65  **.** If the pSe
e360: 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73  lect argument is
e370: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65   not NULL, it me
e380: 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 72 6f  ans that this ro
e390: 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c  utine.** was cal
e3a0: 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20  led to create a 
e3b0: 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20  table generated 
e3c0: 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41  from a .** "CREA
e3d0: 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20  TE TABLE ... AS 
e3e0: 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74  SELECT ..." stat
e3f0: 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75  ement.  The colu
e400: 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  mn names of.** t
e410: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c  he new table wil
e420: 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65 73 75  l match the resu
e430: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
e440: 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  LECT..*/.void sq
e450: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20  lite3EndTable(. 
e460: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
e470: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
e480: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  e context */.  T
e490: 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20  oken *pCons,    
e4a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c         /* The ',
e4b0: 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68  ' token after th
e4c0: 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65  e last column de
e4d0: 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  fn. */.  Token *
e4e0: 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  pEnd,           
e4f0: 20 2f 2a 20 54 68 65 20 27 29 27 20 62 65 66 6f   /* The ')' befo
e500: 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68  re options in th
e510: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a  e CREATE TABLE *
e520: 2f 0a 20 20 75 38 20 74 61 62 4f 70 74 73 2c 20  /.  u8 tabOpts, 
e530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
e540: 78 74 72 61 20 74 61 62 6c 65 20 6f 70 74 69 6f  xtra table optio
e550: 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a  ns. Usually 0. *
e560: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
e570: 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ect         /* S
e580: 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52  elect from a "CR
e590: 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  EATE ... AS SELE
e5a0: 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  CT" */.){.  Tabl
e5b0: 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
e5c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
e5d0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
e5e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
e5f0: 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74  ->db; /* The dat
e600: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
e610: 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
e620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e630: 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20 77  /* Database in w
e640: 68 69 63 68 20 74 68 65 20 74 61 62 6c 65 20 6c  hich the table l
e650: 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ives */.  Index 
e660: 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
e670: 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65      /* An implie
e680: 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74  d index of the t
e690: 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 28  able */..  if( (
e6a0: 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65  pEnd==0 && pSele
e6b0: 63 74 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61  ct==0) || db->ma
e6c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
e6d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
e6e0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
e6f0: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
e700: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  0 ) return;..  a
e710: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
e720: 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63  .busy || !pSelec
e730: 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  t );..  /* If th
e740: 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
e750: 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65  is 1 it means we
e760: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
e770: 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a   SQL off the.  *
e780: 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  * "sqlite_master
e790: 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d  " or "sqlite_tem
e7a0: 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20  p_master" table 
e7b0: 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a  on the disk..  *
e7c0: 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74  * So do not writ
e7d0: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67  e to the disk ag
e7e0: 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68  ain.  Extract th
e7f0: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
e800: 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
e810: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64  table from the d
e820: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20  b->init.newTnum 
e830: 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67  field.  (The pag
e840: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68  e number.  ** sh
e850: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
e860: 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20  ut there by the 
e870: 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75  sqliteOpenCb rou
e880: 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  tine.).  */.  if
e890: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
e8a0: 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d  ){.    p->tnum =
e8b0: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
e8c0: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65  m;.  }..  /* Spe
e8d0: 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  cial processing 
e8e0: 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
e8f0: 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66  D Tables */.  if
e900: 28 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f 57  ( tabOpts & TF_W
e910: 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20  ithoutRowid ){. 
e920: 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c     if( (p->tabFl
e930: 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
e940: 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20 20  rement) ){.     
e950: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
e960: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
e970: 20 20 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e     "AUTOINCREMEN
e980: 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  T not allowed on
e990: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
e9a0: 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 72  ables");.      r
e9b0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
e9c0: 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67   if( (p->tabFlag
e9d0: 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72  s & TF_HasPrimar
e9e0: 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  yKey)==0 ){.    
e9f0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
ea00: 67 28 70 50 61 72 73 65 2c 20 22 50 52 49 4d 41  g(pParse, "PRIMA
ea10: 52 59 20 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f  RY KEY missing o
ea20: 6e 20 74 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e  n table %s", p->
ea30: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
ea40: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61 62 46  e{.      p->tabF
ea50: 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f  lags |= TF_Witho
ea60: 75 74 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63  utRowid;.      c
ea70: 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52  onvertToWithoutR
ea80: 6f 77 69 64 54 61 62 6c 65 28 70 50 61 72 73 65  owidTable(pParse
ea90: 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , p);.    }.  }.
eaa0: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
eab0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
eac0: 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  , p->pSchema);..
ead0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
eae0: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52  MIT_CHECK.  /* R
eaf0: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
eb00: 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  all CHECK constr
eb10: 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  aint expressions
eb20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
eb30: 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71  pCheck ){.    sq
eb40: 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
eb50: 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65  Reference(pParse
eb60: 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c  , p, NC_IsCheck,
eb70: 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a   0, p->pCheck);.
eb80: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
eb90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
eba0: 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20  IT_CHECK) */..  
ebb0: 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  /* Estimate the 
ebc0: 61 76 65 72 61 67 65 20 72 6f 77 20 73 69 7a 65  average row size
ebd0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61   for the table a
ebe0: 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69  nd for all impli
ebf0: 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  ed indices */.  
ec00: 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64  estimateTableWid
ec10: 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 70 49 64  th(p);.  for(pId
ec20: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
ec30: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
ec40: 65 78 74 29 7b 0a 20 20 20 20 65 73 74 69 6d 61  ext){.    estima
ec50: 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49 64  teIndexWidth(pId
ec60: 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  x);.  }..  /* If
ec70: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   not initializin
ec80: 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  g, then create a
ec90: 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20   record for the 
eca0: 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69  new table.  ** i
ecb0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  n the SQLITE_MAS
ecc0: 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65  TER table of the
ecd0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a   database..  **.
ece0: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
ecf0: 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c  a TEMPORARY tabl
ed00: 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74  e, write the ent
ed10: 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69  ry into the auxi
ed20: 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20  liary.  ** file 
ed30: 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20  instead of into 
ed40: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
ed50: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
ed60: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
ed70: 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  y ){.    int n;.
ed80: 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
ed90: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20   char *zType;   
eda0: 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74   /* "view" or "t
edb0: 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61  able" */.    cha
edc0: 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20  r *zType2;   /* 
edd0: 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45  "VIEW" or "TABLE
ede0: 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  " */.    char *z
edf0: 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74  Stmt;    /* Text
ee00: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
ee10: 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56  ABLE or CREATE V
ee20: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  IEW statement */
ee30: 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
ee40: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
ee50: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
ee60: 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  v==0) ) return;.
ee70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ee80: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
ee90: 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  se, 0);..    /* 
eea0: 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69  .    ** Initiali
eeb0: 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65  ze zType for the
eec0: 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61 62   new view or tab
eed0: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
eee0: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  f( p->pSelect==0
eef0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72   ){.      /* A r
ef00: 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a  egular table */.
ef10: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74        zType = "t
ef20: 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79  able";.      zTy
ef30: 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23  pe2 = "TABLE";.#
ef40: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ef50: 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73  IT_VIEW.    }els
ef60: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69  e{.      /* A vi
ef70: 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70  ew */.      zTyp
ef80: 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20  e = "view";.    
ef90: 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57    zType2 = "VIEW
efa0: 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  ";.#endif.    }.
efb0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
efc0: 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  is a CREATE TABL
efd0: 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e  E xx AS SELECT .
efe0: 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20  .., execute the 
eff0: 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74  SELECT.    ** st
f000: 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c  atement to popul
f010: 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ate the new tabl
f020: 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65  e. The root-page
f030: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a   number for the.
f040: 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65      ** new table
f050: 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72 20   is in register 
f060: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e  pParse->regRoot.
f070: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
f080: 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68  nce the SELECT h
f090: 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79  as been coded by
f0a0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
f0b0: 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20  , it is in a.   
f0c0: 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61   ** suitable sta
f0d0: 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  te to query for 
f0e0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
f0f0: 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65   and types to be
f100: 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20   used.    ** by 
f110: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20  the new table.. 
f120: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73     **.    ** A s
f130: 68 61 72 65 64 2d 63 61 63 68 65 20 77 72 69 74  hared-cache writ
f140: 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  e-lock is not re
f150: 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65 20  quired to write 
f160: 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  to the new table
f170: 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63  ,.    ** as a sc
f180: 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68  hema-lock must h
f190: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
f1a0: 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65   obtained to cre
f1b0: 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20  ate it. Since.  
f1c0: 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f    ** a schema-lo
f1d0: 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20  ck excludes all 
f1e0: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 75  other database u
f1f0: 73 65 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d  sers, the write-
f200: 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a  lock would.    *
f210: 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a  * be redundant..
f220: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
f230: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
f240: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
f250: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53  .      Table *pS
f260: 65 6c 54 61 62 3b 0a 0a 20 20 20 20 20 20 61 73  elTab;..      as
f270: 73 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61  sert(pParse->nTa
f280: 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  b==1);.      sql
f290: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
f2a0: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
f2b0: 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  1, pParse->regRo
f2c0: 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  ot, iDb);.      
f2d0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
f2e0: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32  eP5(v, OPFLAG_P2
f2f0: 49 53 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50  ISREG);.      pP
f300: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a  arse->nTab = 2;.
f310: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
f320: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
f330: 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 29  t, SRT_Table, 1)
f340: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
f350: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
f360: 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20  elect, &dest);. 
f370: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f380: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
f390: 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  se, 1);.      if
f3a0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
f3b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65  0 ){.        pSe
f3c0: 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65  lTab = sqlite3Re
f3d0: 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28  sultSetOfSelect(
f3e0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29  pParse, pSelect)
f3f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
f400: 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72  elTab==0 ) retur
f410: 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
f420: 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b  t( p->aCol==0 );
f430: 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c  .        p->nCol
f440: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
f450: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  ;.        p->aCo
f460: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
f470: 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  l;.        pSelT
f480: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
f490: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61        pSelTab->a
f4a0: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
f4b0: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
f4c0: 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29  ble(db, pSelTab)
f4d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
f4e0: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
f4f0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
f500: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
f510: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
f520: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
f530: 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72        zStmt = cr
f540: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62  eateTableStmt(db
f550: 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , p);.    }else{
f560: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45  .      Token *pE
f570: 6e 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f 20  nd2 = tabOpts ? 
f580: 26 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f  &pParse->sLastTo
f590: 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20  ken : pEnd;.    
f5a0: 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64    n = (int)(pEnd
f5b0: 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73  2->z - pParse->s
f5c0: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20  NameToken.z);.  
f5d0: 20 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a      if( pEnd2->z
f5e0: 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20  [0]!=';' ) n += 
f5f0: 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20  pEnd2->n;.      
f600: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
f610: 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20  Printf(db, .    
f620: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 25 73        "CREATE %s
f630: 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20   %.*s", zType2, 
f640: 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  n, pParse->sName
f650: 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b  Token.z.      );
f660: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
f670: 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65   slot for the re
f680: 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79  cord has already
f690: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
f6a0: 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53  in the .    ** S
f6b0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
f6c0: 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65  le.  We just nee
f6d0: 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74  d to update that
f6e0: 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20   slot with all. 
f6f0: 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d     ** the inform
f700: 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c  ation we've coll
f710: 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ected..    */.  
f720: 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
f730: 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
f740: 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
f750: 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45 54   ".         "SET
f760: 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65   type='%s', name
f770: 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  =%Q, tbl_name=%Q
f780: 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20  , rootpage=#%d, 
f790: 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20  sql=%Q ".       
f7a0: 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64  "WHERE rowid=#%d
f7b0: 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  ",.      db->aDb
f7c0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
f7d0: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
f7e0: 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20        zType,.   
f7f0: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
f800: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20     p->zName,.   
f810: 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f     pParse->regRo
f820: 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c  ot,.      zStmt,
f830: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
f840: 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20  egRowid.    );. 
f850: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
f860: 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20  (db, zStmt);.   
f870: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
f880: 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
f890: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
f8a0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
f8b0: 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65  EMENT.    /* Che
f8c0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
f8d0: 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  need to create a
f8e0: 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  n sqlite_sequenc
f8f0: 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20  e table for.    
f900: 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b  ** keeping track
f910: 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   of autoincremen
f920: 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20  t keys..    */. 
f930: 20 20 20 69 66 28 20 70 2d 3e 74 61 62 46 6c 61     if( p->tabFla
f940: 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
f950: 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 44  ement ){.      D
f960: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
f970: 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 73  b[iDb];.      as
f980: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
f990: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
f9a0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
f9b0: 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
f9c0: 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29  ma->pSeqTab==0 )
f9d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f9e0: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
f9f0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
fa00: 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e  CREATE TABLE %Q.
fa10: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28  sqlite_sequence(
fa20: 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20  name,seq)",.    
fa30: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
fa40: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
fa50: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
fa60: 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65  ..    /* Reparse
fa70: 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75   everything to u
fa80: 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e  pdate our intern
fa90: 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72  al data structur
faa0: 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  es */.    sqlite
fab0: 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68  3VdbeAddParseSch
fac0: 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20  emaOp(v, iDb,.  
fad0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
fae0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c  MPrintf(db, "tbl
faf0: 5f 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74  _name='%q' AND t
fb00: 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c  ype!='trigger'",
fb10: 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d   p->zName));.  }
fb20: 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  ...  /* Add the 
fb30: 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d  table to the in-
fb40: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
fb50: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
fb60: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
fb70: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
fb80: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f  ){.    Table *pO
fb90: 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a  ld;.    Schema *
fba0: 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63  pSchema = p->pSc
fbb0: 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74  hema;.    assert
fbc0: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
fbd0: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
fbe0: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64  , 0) );.    pOld
fbf0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
fc00: 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74  sert(&pSchema->t
fc10: 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65  blHash, p->zName
fc20: 2c 20 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  , p);.    if( pO
fc30: 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ld ){.      asse
fc40: 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20  rt( p==pOld );  
fc50: 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
fc60: 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64  ave failed insid
fc70: 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a  e HashInsert() *
fc80: 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  /.      db->mall
fc90: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
fca0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
fcb0: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e  }.    pParse->pN
fcc0: 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  ewTable = 0;.   
fcd0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
fce0: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
fcf0: 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  es;..#ifndef SQL
fd00: 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
fd10: 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  BLE.    if( !p->
fd20: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
fd30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
fd40: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
fd50: 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65   *)pParse->sName
fd60: 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69  Token.z;.      i
fd70: 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20  nt nName;.      
fd80: 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74  assert( !pSelect
fd90: 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e   && pCons && pEn
fda0: 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  d );.      if( p
fdb0: 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  Cons->z==0 ){.  
fdc0: 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45        pCons = pE
fdd0: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
fde0: 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28    nName = (int)(
fdf0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43  (const char *)pC
fe00: 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b  ons->z - zName);
fe10: 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c  .      p->addCol
fe20: 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71  Offset = 13 + sq
fe30: 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e  lite3Utf8CharLen
fe40: 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a  (zName, nName);.
fe50: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
fe60: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
fe70: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a  TE_OMIT_VIEW./*.
fe80: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
fe90: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
fea0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65   in order to cre
feb0: 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a  ate a new VIEW.*
fec0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
fed0: 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73  eateView(.  Pars
fee0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
fef0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
ff00: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
ff10: 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a   *pBegin,     /*
ff20: 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
ff30: 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
ff40: 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  e statement */. 
ff50: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
ff60: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
ff70: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
ff80: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
ff90: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
ffa0: 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me2,     /* The 
ffb0: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
ffc0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
ffd0: 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63   view */.  Selec
ffe0: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a  t *pSelect,   /*
fff0: 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   A SELECT statem
10000 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ent that will be
10010 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65  come the new vie
10020 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
10030 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55  p,        /* TRU
10040 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52  E for a TEMPORAR
10050 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  Y view */.  int 
10060 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20 2f  noErr          /
10070 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f 72  * Suppress error
10080 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49 45   messages if VIE
10090 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  W already exists
100a0 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
100b0 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f  p;.  int n;.  co
100c0 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54  nst char *z;.  T
100d0 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46  oken sEnd;.  DbF
100e0 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b  ixer sFix;.  Tok
100f0 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20  en *pName = 0;. 
10100 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69   int iDb;.  sqli
10110 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
10120 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61  ->db;..  if( pPa
10130 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20  rse->nVar>0 ){. 
10140 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
10150 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72 61  sg(pParse, "para
10160 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61  meters are not a
10170 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22  llowed in views"
10180 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
10190 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
101a0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
101b0 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
101c0 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61  e3StartTable(pPa
101d0 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
101e0 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20  me2, isTemp, 1, 
101f0 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d  0, noErr);.  p =
10200 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
10210 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
10220 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  | pParse->nErr )
10230 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
10240 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
10250 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75  elect);.    retu
10260 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
10270 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
10280 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
10290 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
102a0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
102b0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
102c0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71  ->pSchema);.  sq
102d0 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
102e0 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
102f0 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b   "view", pName);
10300 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69  .  if( sqlite3Fi
10310 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70  xSelect(&sFix, p
10320 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 73  Select) ){.    s
10330 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
10340 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  te(db, pSelect);
10350 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
10360 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f  ..  /* Make a co
10370 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  py of the entire
10380 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
10390 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
103a0 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68  he view..  ** Th
103b0 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c  is will force al
103c0 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e  l the Expr.token
103d0 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20  .z values to be 
103e0 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a  dynamically.  **
103f0 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65   allocated rathe
10400 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20  r than point to 
10410 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67  the input string
10420 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74   - which means t
10430 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69  hat.  ** they wi
10440 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72  ll persist after
10450 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c   the current sql
10460 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c  ite3_exec() call
10470 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20   returns..  */. 
10480 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71   p->pSelect = sq
10490 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
104a0 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52  b, pSelect, EXPR
104b0 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 73  DUP_REDUCE);.  s
104c0 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
104d0 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  te(db, pSelect);
104e0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
104f0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
10500 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
10510 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
10520 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 69  ){.    sqlite3Vi
10530 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
10540 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d  (pParse, p);.  }
10550 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
10560 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
10570 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
10580 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70  nt.  Make sEnd p
10590 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65  oint to.  ** the
105a0 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e   end..  */.  sEn
105b0 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  d = pParse->sLas
105c0 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 41 4c  tToken;.  if( AL
105d0 57 41 59 53 28 73 45 6e 64 2e 7a 5b 30 5d 21 3d  WAYS(sEnd.z[0]!=
105e0 30 29 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21  0) && sEnd.z[0]!
105f0 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64  =';' ){.    sEnd
10600 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20  .z += sEnd.n;.  
10610 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a  }.  sEnd.n = 0;.
10620 20 20 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e 64    n = (int)(sEnd
10630 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b  .z - pBegin->z);
10640 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a  .  z = pBegin->z
10650 3b 0a 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59  ;.  while( ALWAY
10660 53 28 6e 3e 30 29 20 26 26 20 73 71 6c 69 74 65  S(n>0) && sqlite
10670 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29  3Isspace(z[n-1])
10680 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e   ){ n--; }.  sEn
10690 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20  d.z = &z[n-1];. 
106a0 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20   sEnd.n = 1;..  
106b0 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e  /* Use sqlite3En
106c0 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20  dTable() to add 
106d0 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20  the view to the 
106e0 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
106f0 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
10700 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
10710 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30 29   0, &sEnd, 0, 0)
10720 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
10730 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
10740 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66  MIT_VIEW */..#if
10750 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
10760 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
10770 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
10780 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
10790 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  )./*.** The Tabl
107a0 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62  e structure pTab
107b0 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56  le is really a V
107c0 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68  IEW.  Fill in th
107d0 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  e names of.** th
107e0 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
107f0 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61   view in the pTa
10800 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ble structure.  
10810 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
10820 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20  r.** of errors. 
10830 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
10840 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72  seen leave an er
10850 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
10860 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
10870 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69  */.int sqlite3Vi
10880 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
10890 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
108a0 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
108b0 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
108c0 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61  ;   /* A fake ta
108d0 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77  ble from which w
108e0 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c 74  e get the result
108f0 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74   set */.  Select
10900 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43   *pSel;     /* C
10910 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
10920 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  T that implement
10930 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  s the view */.  
10940 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20  int nErr = 0;   
10950 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
10960 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
10970 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
10980 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
10990 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68  orarily holds th
109a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  e number of curs
109b0 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a  ors assigned */.
109c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
109d0 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
109e0 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
109f0 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65  ion for malloc e
10a00 72 72 6f 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  rrors */.  sqlit
10a10 65 33 5f 78 61 75 74 68 20 78 41 75 74 68 3b 20  e3_xauth xAuth; 
10a20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 78        /* Saved x
10a30 41 75 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  Auth pointer */.
10a40 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
10a50 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  e );..#ifndef SQ
10a60 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
10a70 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 73 71 6c  LTABLE.  if( sql
10a80 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e  ite3VtabCallConn
10a90 65 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ect(pParse, pTab
10aa0 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  le) ){.    retur
10ab0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
10ac0 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74    }.  if( IsVirt
10ad0 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65  ual(pTable) ) re
10ae0 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  turn 0;.#endif..
10af0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10b00 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20  MIT_VIEW.  /* A 
10b10 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65  positive nCol me
10b20 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  ans the columns 
10b30 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76  names for this v
10b40 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72  iew are.  ** alr
10b50 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f  eady known..  */
10b60 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
10b70 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30  Col>0 ) return 0
10b80 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69  ;..  /* A negati
10b90 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65  ve nCol is a spe
10ba0 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e  cial marker mean
10bb0 69 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20  ing that we are 
10bc0 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74  currently.  ** t
10bd0 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65  rying to compute
10be0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
10bf0 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20  s.  If we enter 
10c00 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
10c10 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76  h.  ** a negativ
10c20 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73  e nCol, it means
10c30 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65   two or more vie
10c40 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20  ws form a loop, 
10c50 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a  like this:.  **.
10c60 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
10c70 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45  VIEW one AS SELE
10c80 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20  CT * FROM two;. 
10c90 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
10ca0 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43  IEW two AS SELEC
10cb0 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20  T * FROM one;.  
10cc0 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  **.  ** Actually
10cd0 2c 20 74 68 65 20 65 72 72 6f 72 20 61 62 6f 76  , the error abov
10ce0 65 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20  e is now caught 
10cf0 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e  prior to reachin
10d00 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20  g this point..  
10d10 2a 2a 20 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f  ** But the follo
10d20 77 69 6e 67 20 74 65 73 74 20 69 73 20 73 74 69  wing test is sti
10d30 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 20  ll important as 
10d40 69 74 20 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a  it does come up.
10d50 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c    ** in the foll
10d60 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a  owing:.  ** .  *
10d70 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
10d80 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a  LE main.ex1(a);.
10d90 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
10da0 54 45 4d 50 20 56 49 45 57 20 65 78 31 20 41 53  TEMP VIEW ex1 AS
10db0 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65   SELECT a FROM e
10dc0 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c  x1;.  **     SEL
10dd0 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e  ECT * FROM temp.
10de0 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ex1;.  */.  if( 
10df0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29  pTable->nCol<0 )
10e00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
10e10 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
10e20 69 65 77 20 25 73 20 69 73 20 63 69 72 63 75 6c  iew %s is circul
10e30 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70  arly defined", p
10e40 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
10e50 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
10e60 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
10e70 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20  e->nCol>=0 );.. 
10e80 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
10e90 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
10ea0 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70   we need to comp
10eb0 75 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ute the table na
10ec0 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74  mes..  ** Note t
10ed0 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hat the call to 
10ee0 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
10ef0 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20  OfSelect() will 
10f00 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20  expand any.  ** 
10f10 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  "*" elements in 
10f20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65 74 20  the results set 
10f30 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e 64 20  of the view and 
10f40 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73  will assign curs
10f50 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ors.  ** to the 
10f60 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
10f70 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75  FROM clause.  Bu
10f80 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74  t we do not want
10f90 20 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20   these changes. 
10fa0 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e   ** to be perman
10fb0 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d  ent.  So the com
10fc0 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65  putation is done
10fd0 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68   on a copy of th
10fe0 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74  e SELECT.  ** st
10ff0 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
11000 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
11010 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54   */.  assert( pT
11020 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b  able->pSelect );
11030 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65  .  pSel = sqlite
11040 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
11050 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20  Table->pSelect, 
11060 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29  0);.  if( pSel )
11070 7b 0a 20 20 20 20 75 38 20 65 6e 61 62 6c 65 4c  {.    u8 enableL
11080 6f 6f 6b 61 73 69 64 65 20 3d 20 64 62 2d 3e 6c  ookaside = db->l
11090 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
110a0 64 3b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73  d;.    n = pPars
110b0 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c  e->nTab;.    sql
110c0 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
110d0 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
110e0 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20   pSel->pSrc);.  
110f0 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
11100 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f   -1;.    db->loo
11110 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20  kaside.bEnabled 
11120 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
11130 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
11140 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68  ZATION.    xAuth
11150 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20   = db->xAuth;.  
11160 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b    db->xAuth = 0;
11170 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73  .    pSelTab = s
11180 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
11190 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
111a0 70 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78  pSel);.    db->x
111b0 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65  Auth = xAuth;.#e
111c0 6c 73 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20  lse.    pSelTab 
111d0 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  = sqlite3ResultS
111e0 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73  etOfSelect(pPars
111f0 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66  e, pSel);.#endif
11200 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
11210 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 65 6e  de.bEnabled = en
11220 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 3b 0a 20  ableLookaside;. 
11230 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
11240 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 53 65  = n;.    if( pSe
11250 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20 61 73  lTab ){.      as
11260 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43  sert( pTable->aC
11270 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ol==0 );.      p
11280 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53  Table->nCol = pS
11290 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
112a0 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20     pTable->aCol 
112b0 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
112c0 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  .      pSelTab->
112d0 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
112e0 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
112f0 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
11300 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
11310 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20  pSelTab);.      
11320 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
11330 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
11340 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d 3e 70 53  b, 0, pTable->pS
11350 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20  chema) );.      
11360 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
11370 3e 73 63 68 65 6d 61 46 6c 61 67 73 20 7c 3d 20  >schemaFlags |= 
11380 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b  DB_UnresetViews;
11390 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
113a0 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
113b0 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b   0;.      nErr++
113c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
113d0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
113e0 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 7d 20 65  db, pSel);.  } e
113f0 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b  lse {.    nErr++
11400 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
11410 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
11420 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72   */.  return nEr
11430 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  r;  .}.#endif /*
11440 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
11450 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
11460 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
11470 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
11480 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
11490 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
114a0 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
114b0 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
114c0 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64   every VIEW in d
114d0 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a  atabase idx..*/.
114e0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
114f0 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73  teViewResetAll(s
11500 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
11510 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  idx){.  HashElem
11520 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73   *i;.  assert( s
11530 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
11540 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c 20 30  xHeld(db, idx, 0
11550 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62 48 61  ) );.  if( !DbHa
11560 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  sProperty(db, id
11570 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
11580 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ws) ) return;.  
11590 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
115a0 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69  First(&db->aDb[i
115b0 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  dx].pSchema->tbl
115c0 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74  Hash); i;i=sqlit
115d0 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
115e0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
115f0 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
11600 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  i);.    if( pTab
11610 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
11620 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 43     sqliteDeleteC
11630 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70  olumnNames(db, p
11640 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Tab);.      pTab
11650 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
11660 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30    pTab->nCol = 0
11670 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62  ;.    }.  }.  Db
11680 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62  ClearProperty(db
11690 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
116a0 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65  tViews);.}.#else
116b0 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65  .# define sqlite
116c0 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42  ViewResetAll(A,B
116d0 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
116e0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
116f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11700 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
11710 79 20 74 68 65 20 56 44 42 45 20 74 6f 20 61 64  y the VDBE to ad
11720 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61  just the interna
11730 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64  l schema.** used
11740 20 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20   by SQLite when 
11750 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20  the btree layer 
11760 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f  moves a table ro
11770 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20  ot page. The.** 
11780 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74  root-page of a t
11790 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e  able or index in
117a0 20 64 61 74 61 62 61 73 65 20 69 44 62 20 68 61   database iDb ha
117b0 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69  s changed from i
117c0 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a  From.** to iTo..
117d0 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37  **.** Ticket #17
117e0 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20  28:  The symbol 
117f0 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c  table might stil
11800 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d  l contain inform
11810 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c  ation.** on tabl
11820 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65  es and/or indice
11830 73 20 74 68 61 74 20 61 72 65 20 74 68 65 20 70  s that are the p
11840 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
11850 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79  deleted..** If y
11860 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20  ou are unlucky, 
11870 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c  one of those del
11880 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20  eted indices or 
11890 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20  tables might.** 
118a0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f  have the same ro
118b0 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73  otpage number as
118c0 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20   the real table 
118d0 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  or index that is
118e0 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e  .** being moved.
118f0 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73    So we cannot s
11900 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20 61 66  top searching af
11910 74 65 72 20 74 68 65 20 66 69 72 73 74 20 6d 61  ter the first ma
11920 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20  tch .** because 
11930 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20  the first match 
11940 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65  might be for one
11950 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64 20   of the deleted 
11960 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61  indices.** or ta
11970 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65  bles and not the
11980 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61   table/index tha
11990 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65  t is actually be
119a0 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65  ing moved..** We
119b0 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c   must continue l
119c0 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c  ooping until all
119d0 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69   tables and indi
119e0 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74  ces with.** root
119f0 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65  page==iFrom have
11a00 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20   been converted 
11a10 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61  to have a rootpa
11a20 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20  ge of iTo.** in 
11a30 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65 72 74  order to be cert
11a40 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20  ain that we got 
11a50 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a  the right one..*
11a60 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
11a70 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
11a80 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f  .void sqlite3Roo
11a90 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c 69 74  tPageMoved(sqlit
11aa0 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
11ab0 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20   int iFrom, int 
11ac0 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  iTo){.  HashElem
11ad0 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20   *pElem;.  Hash 
11ae0 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a 70 44  *pHash;.  Db *pD
11af0 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  b;..  assert( sq
11b00 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
11b10 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
11b20 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   );.  pDb = &db-
11b30 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 48 61  >aDb[iDb];.  pHa
11b40 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65  sh = &pDb->pSche
11b50 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66  ma->tblHash;.  f
11b60 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
11b70 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b  ashFirst(pHash);
11b80 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
11b90 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
11ba0 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  em)){.    Table 
11bb0 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
11bc0 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
11bd0 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75     if( pTab->tnu
11be0 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  m==iFrom ){.    
11bf0 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69    pTab->tnum = i
11c00 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  To;.    }.  }.  
11c10 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53  pHash = &pDb->pS
11c20 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a  chema->idxHash;.
11c30 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
11c40 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73  teHashFirst(pHas
11c50 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
11c60 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
11c70 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
11c80 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74  ex *pIdx = sqlit
11c90 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
11ca0 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
11cb0 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
11cc0 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20       pIdx->tnum 
11cd0 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  = iTo;.    }.  }
11ce0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
11cf0 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65   Write code to e
11d00 72 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 77  rase the table w
11d10 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54  ith root-page iT
11d20 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61  able from databa
11d30 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20  se iDb..** Also 
11d40 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  write code to mo
11d50 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f  dify the sqlite_
11d60 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
11d70 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
11d80 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61  .** if a root-pa
11d90 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61  ge of another ta
11da0 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
11db0 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20  the btree-layer 
11dc0 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e  whilst.** erasin
11dd0 67 20 69 54 61 62 6c 65 20 28 74 68 69 73 20 63  g iTable (this c
11de0 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
11df0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
11e00 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61  tabase)..*/ .sta
11e10 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
11e20 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a  RootPage(Parse *
11e30 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62  pParse, int iTab
11e40 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  le, int iDb){.  
11e50 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
11e60 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
11e70 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c  ;.  int r1 = sql
11e80 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
11e90 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
11ea0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
11eb0 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c  P_Destroy, iTabl
11ec0 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73  e, r1, iDb);.  s
11ed0 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
11ee0 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20  Parse);.#ifndef 
11ef0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
11f00 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44  VACUUM.  /* OP_D
11f10 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e  estroy stores an
11f20 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20   in integer r1. 
11f30 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a  If this integer.
11f40 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f    ** is non-zero
11f50 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
11f60 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
11f70 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76  r of a table mov
11f80 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74  ed to.  ** locat
11f90 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20  ion iTable. The 
11fa0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d  following code m
11fb0 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c 69  odifies the sqli
11fc0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
11fd0 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20  to.  ** reflect 
11fe0 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  this..  **.  ** 
11ff0 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68  The "#NNN" in th
12000 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69  e SQL is a speci
12010 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74  al constant that
12020 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20   means whatever 
12030 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e  value.  ** is in
12040 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20   register NNN.  
12050 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65  See grammar rule
12060 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
12070 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45  h the TK_REGISTE
12080 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72  R.  ** token for
12090 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
120a0 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  rmation..  */.  
120b0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
120c0 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
120d0 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53   "UPDATE %Q.%s S
120e0 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57  ET rootpage=%d W
120f0 48 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f  HERE #%d AND roo
12100 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20  tpage=#%d",.    
12110 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
12120 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
12130 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
12140 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b  iTable, r1, r1);
12150 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
12160 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
12170 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a  pParse, r1);.}..
12180 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45  /*.** Write VDBE
12190 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
121a0 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c  able pTab and al
121b0 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64  l associated ind
121c0 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a  ices on disk..**
121d0 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20   Code to update 
121e0 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
121f0 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74  r tables and int
12200 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66  ernal schema def
12210 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63  initions.** in c
12220 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20  ase a root-page 
12230 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f  belonging to ano
12240 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f  ther table is mo
12250 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65  ved by the btree
12260 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73   layer.** is als
12270 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61  o added (this ca
12280 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e  n happen with an
12290 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
122a0 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  abase)..*/.stati
122b0 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61  c void destroyTa
122c0 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
122d0 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  e, Table *pTab){
122e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
122f0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
12300 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
12310 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
12320 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
12330 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
12340 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73  >pSchema);.  des
12350 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
12360 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  rse, pTab->tnum,
12370 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64   iDb);.  for(pId
12380 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
12390 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
123a0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73  >pNext){.    des
123b0 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
123c0 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c  rse, pIdx->tnum,
123d0 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65   iDb);.  }.#else
123e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
123f0 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74  abase may be aut
12400 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65  o-vacuum capable
12410 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54   (if SQLITE_OMIT
12420 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a  _AUTOVACUUM.  **
12430 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29   is not defined)
12440 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70  , then it is imp
12450 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f  ortant to call O
12460 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65  P_Destroy on the
12470 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20  .  ** table and 
12480 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73  index root-pages
12490 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74   in order, start
124a0 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d  ing with the num
124b0 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c  erically .  ** l
124c0 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
124d0 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75   number. This gu
124e0 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f  arantees that no
124f0 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70  ne of the root-p
12500 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  ages.  ** to be 
12510 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c  destroyed is rel
12520 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72  ocated by an ear
12530 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e  lier OP_Destroy.
12540 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a   i.e. if the.  *
12550 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65  * following were
12560 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a   coded:.  **.  *
12570 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30  * OP_Destroy 4 0
12580 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f  .  ** ....  ** O
12590 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20  P_Destroy 5 0.  
125a0 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74  **.  ** and root
125b0 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64   page 5 happened
125c0 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65   to be the large
125d0 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  st root-page num
125e0 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ber in the.  ** 
125f0 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72  database, then r
12600 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64  oot page 5 would
12610 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67   be moved to pag
12620 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a  e 4 by the .  **
12630 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30   "OP_Destroy 4 0
12640 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75  " opcode. The su
12650 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73  bsequent "OP_Des
12660 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20  troy 5 0" would 
12670 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d  hit.  ** a free-
12680 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  list page..  */.
12690 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61    int iTab = pTa
126a0 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69  b->tnum;.  int i
126b0 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a  Destroyed = 0;..
126c0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
126d0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
126e0 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20     int iLargest 
126f0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44  = 0;..    if( iD
12700 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69  estroyed==0 || i
12710 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29  Tab<iDestroyed )
12720 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74  {.      iLargest
12730 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20   = iTab;.    }. 
12740 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
12750 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
12760 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
12770 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64  ){.      int iId
12780 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a  x = pIdx->tnum;.
12790 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
127a0 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  dx->pSchema==pTa
127b0 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  b->pSchema );.  
127c0 20 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f      if( (iDestro
127d0 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c  yed==0 || (iIdx<
127e0 69 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20  iDestroyed)) && 
127f0 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b  iIdx>iLargest ){
12800 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73  .        iLarges
12810 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20  t = iIdx;.      
12820 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
12830 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20  iLargest==0 ){. 
12840 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
12850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
12860 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
12870 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
12880 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
12890 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61  Schema);.      a
128a0 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
128b0 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d   iDb<pParse->db-
128c0 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65  >nDb );.      de
128d0 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
128e0 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20  arse, iLargest, 
128f0 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73  iDb);.      iDes
12900 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73  troyed = iLarges
12910 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  t;.    }.  }.#en
12920 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  dif.}../*.** Rem
12930 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
12940 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74   the sqlite_stat
12950 4e 20 74 61 62 6c 65 73 20 28 66 6f 72 20 4e 20  N tables (for N 
12960 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61  in (1,2,3)).** a
12970 66 74 65 72 20 61 20 44 52 4f 50 20 49 4e 44 45  fter a DROP INDE
12980 58 20 6f 72 20 44 52 4f 50 20 54 41 42 4c 45 20  X or DROP TABLE 
12990 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  command..*/.stat
129a0 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43  ic void sqlite3C
129b0 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 0a  learStatTables(.
129c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
129d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
129e0 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
129f0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20  */.  int iDb,   
12a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
12a10 68 65 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  he database numb
12a20 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  er */.  const ch
12a30 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f  ar *zType,     /
12a40 2a 20 22 69 64 78 22 20 6f 72 20 22 74 62 6c 22  * "idx" or "tbl"
12a50 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
12a60 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20   *zName      /* 
12a70 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f 72  Name of index or
12a80 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69   table */.){.  i
12a90 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
12aa0 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50  ar *zDbName = pP
12ab0 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
12ac0 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 66 6f 72 28  b].zName;.  for(
12ad0 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b  i=1; i<=4; i++){
12ae0 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62 5b 32  .    char zTab[2
12af0 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  4];.    sqlite3_
12b00 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
12b10 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69  zTab),zTab,"sqli
12b20 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a 20  te_stat%d",i);. 
12b30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
12b40 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  ndTable(pParse->
12b50 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d  db, zTab, zDbNam
12b60 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
12b70 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
12b80 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
12b90 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
12ba0 73 20 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a  s WHERE %s=%Q",.
12bb0 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c          zDbName,
12bc0 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e   zTab, zType, zN
12bd0 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ame.      );.   
12be0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
12bf0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
12c00 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a   drop a table..*
12c10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
12c20 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  deDropTable(Pars
12c30 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
12c40 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44 62 2c   *pTab, int iDb,
12c50 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20   int isView){.  
12c60 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
12c70 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
12c80 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72 20 2a  >db;.  Trigger *
12c90 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62 20 2a  pTrigger;.  Db *
12ca0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
12cb0 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69  Db];..  v = sqli
12cc0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
12cd0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21  e);.  assert( v!
12ce0 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  =0 );.  sqlite3B
12cf0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
12d00 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
12d10 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
12d20 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
12d30 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
12d40 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
12d50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12d60 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp0(v, OP_VBegi
12d70 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  n);.  }.#endif..
12d80 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72    /* Drop all tr
12d90 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65  iggers associate
12da0 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
12db0 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
12dc0 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e  Code.  ** is gen
12dd0 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65  erated to remove
12de0 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71   entries from sq
12df0 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f  lite_master and/
12e00 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74  or.  ** sqlite_t
12e10 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65  emp_master if re
12e20 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  quired..  */.  p
12e30 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65  Trigger = sqlite
12e40 33 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61  3TriggerList(pPa
12e50 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 77 68  rse, pTab);.  wh
12e60 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b  ile( pTrigger ){
12e70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72  .    assert( pTr
12e80 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
12e90 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c  pTab->pSchema ||
12ea0 20 0a 20 20 20 20 20 20 20 20 70 54 72 69 67 67   .        pTrigg
12eb0 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  er->pSchema==db-
12ec0 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
12ed0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 72  );.    sqlite3Dr
12ee0 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61  opTriggerPtr(pPa
12ef0 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a  rse, pTrigger);.
12f00 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20 70      pTrigger = p
12f10 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a  Trigger->pNext;.
12f20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
12f30 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
12f40 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f  REMENT.  /* Remo
12f50 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f  ve any entries o
12f60 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  f the sqlite_seq
12f70 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f  uence table asso
12f80 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 2a 2a  ciated with.  **
12f90 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
12fa0 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69   dropped. This i
12fb0 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68  s done before th
12fc0 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70  e table is dropp
12fd0 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 62  ed.  ** at the b
12fe0 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63  tree level, in c
12ff0 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73  ase the sqlite_s
13000 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65  equence table ne
13010 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65  eds to.  ** move
13020 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
13030 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61  the drop (can ha
13040 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63  ppen in auto-vac
13050 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a  uum mode)..  */.
13060 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46    if( pTab->tabF
13070 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
13080 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73  crement ){.    s
13090 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
130a0 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
130b0 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
130c0 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
130d0 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
130e0 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
130f0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20  , pTab->zName.  
13100 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a    );.  }.#endif.
13110 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53  .  /* Drop all S
13120 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
13130 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  le and index ent
13140 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72 20  ries that refer 
13150 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c  to the.  ** tabl
13160 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e  e. The program n
13170 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67  ame loops throug
13180 68 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  h the master tab
13190 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20  le and deletes. 
131a0 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68   ** every row th
131b0 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  at refers to a t
131c0 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65  able of the same
131d0 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65   name as the one
131e0 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70   being.  ** drop
131f0 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72  ped. Triggers ar
13200 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61  e handled separa
13210 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74  tely because a t
13220 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20  rigger can be.  
13230 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  ** created in th
13240 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  e temp database 
13250 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
13260 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65   table in anothe
13270 72 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  r.  ** database.
13280 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e  .  */.  sqlite3N
13290 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
132a0 65 2c 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54  e, .      "DELET
132b0 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
132c0 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61  RE tbl_name=%Q a
132d0 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67 67 65  nd type!='trigge
132e0 72 27 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e  r'",.      pDb->
132f0 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
13300 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e  BLE(iDb), pTab->
13310 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69  zName);.  if( !i
13320 73 56 69 65 77 20 26 26 20 21 49 73 56 69 72 74  sView && !IsVirt
13330 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
13340 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50   destroyTable(pP
13350 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d  arse, pTab);.  }
13360 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68  ..  /* Remove th
13370 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72  e table entry fr
13380 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65  om SQLite's inte
13390 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20  rnal schema and 
133a0 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20  modify.  ** the 
133b0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20  schema cookie.. 
133c0 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74   */.  if( IsVirt
133d0 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
133e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
133f0 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f  p4(v, OP_VDestro
13400 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  y, iDb, 0, 0, pT
13410 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
13420 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
13430 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f  AddOp4(v, OP_Dro
13440 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20  pTable, iDb, 0, 
13450 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  0, pTab->zName, 
13460 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 68 61  0);.  sqlite3Cha
13470 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
13480 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
13490 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c  ViewResetAll(db,
134a0 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iDb);.}../*.** 
134b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
134c0 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65  called to do the
134d0 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20   work of a DROP 
134e0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
134f0 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65  .** pName is the
13500 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
13510 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64  le to be dropped
13520 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13530 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65  3DropTable(Parse
13540 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
13550 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73  t *pName, int is
13560 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29  View, int noErr)
13570 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
13580 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
13590 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
135a0 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
135b0 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  b;..  if( db->ma
135c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
135d0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
135e0 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73  _table;.  }.  as
135f0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
13600 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  rr==0 );.  asser
13610 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
13620 31 20 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72  1 );.  if( noErr
13630 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45   ) db->suppressE
13640 72 72 2b 2b 3b 0a 20 20 70 54 61 62 20 3d 20 73  rr++;.  pTab = s
13650 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
13660 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73  eItem(pParse, is
13670 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b  View, &pName->a[
13680 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72  0]);.  if( noErr
13690 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45   ) db->suppressE
136a0 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61  rr--;..  if( pTa
136b0 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  b==0 ){.    if( 
136c0 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65 33 43  noErr ) sqlite3C
136d0 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
136e0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61  hema(pParse, pNa
136f0 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
13700 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  se);.    goto ex
13710 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
13720 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
13730 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
13740 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
13750 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  a);.  assert( iD
13760 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
13770 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nDb );..  /* If 
13780 70 54 61 62 20 69 73 20 61 20 76 69 72 74 75 61  pTab is a virtua
13790 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69  l table, call Vi
137a0 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
137b0 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a  () to ensure.  *
137c0 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69  * it is initiali
137d0 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
137e0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
137f0 26 26 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  && sqlite3ViewGe
13800 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
13810 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20  rse, pTab) ){.  
13820 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
13830 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e  _table;.  }.#ifn
13840 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13850 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
13860 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
13870 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
13880 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
13890 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f  BLE(iDb);.    co
138a0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
138b0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
138c0 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
138d0 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20  ar *zArg2 = 0;. 
138e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
138f0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
13900 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
13910 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Tab, 0, zDb)){. 
13920 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
13930 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
13940 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
13950 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  ){.      if( !OM
13960 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
13970 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
13980 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
13990 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  P_TEMP_VIEW;.   
139a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
139b0 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
139c0 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  DROP_VIEW;.     
139d0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
139e0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
139f0 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
13a00 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
13a10 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20  ) ){.      code 
13a20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  = SQLITE_DROP_VT
13a30 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67  ABLE;.      zArg
13a40 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  2 = sqlite3GetVT
13a50 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 2d 3e  able(db, pTab)->
13a60 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e  pMod->zName;.#en
13a70 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
13a80 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
13a90 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
13aa0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
13ab0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
13ac0 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
13ad0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
13ae0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
13af0 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
13b00 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
13b10 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
13b20 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
13b30 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32  ab->zName, zArg2
13b40 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
13b50 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
13b60 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
13b70 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
13b80 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
13b90 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62  ITE_DELETE, pTab
13ba0 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
13bb0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
13bc0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
13bd0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
13be0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
13bf0 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
13c00 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
13c10 29 3d 3d 30 20 0a 20 20 20 20 26 26 20 73 71 6c  )==0 .    && sql
13c20 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
13c30 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
13c40 65 5f 73 74 61 74 22 2c 20 31 31 29 21 3d 30 20  e_stat", 11)!=0 
13c50 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13c60 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13c70 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
13c80 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54   be dropped", pT
13c90 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
13ca0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
13cb0 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  able;.  }..#ifnd
13cc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
13cd0 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  IEW.  /* Ensure 
13ce0 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f  DROP TABLE is no
13cf0 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77  t used on a view
13d00 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20  , and DROP VIEW 
13d10 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a  is not used.  **
13d20 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a   on a table..  *
13d30 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26  /.  if( isView &
13d40 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  & pTab->pSelect=
13d50 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
13d60 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13d70 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c  , "use DROP TABL
13d80 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c  E to delete tabl
13d90 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  e %s", pTab->zNa
13da0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
13db0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
13dc0 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77   }.  if( !isView
13dd0 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
13de0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
13df0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13e00 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20   "use DROP VIEW 
13e10 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25  to delete view %
13e20 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
13e30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
13e40 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
13e50 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
13e60 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
13e70 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66  move the table f
13e80 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
13e90 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73  able.  ** on dis
13ea0 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  k..  */.  v = sq
13eb0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
13ec0 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
13ed0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
13ee0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
13ef0 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
13f00 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61  .    sqlite3Clea
13f10 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61 72  rStatTables(pPar
13f20 73 65 2c 20 69 44 62 2c 20 22 74 62 6c 22 2c 20  se, iDb, "tbl", 
13f30 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
13f40 20 20 73 71 6c 69 74 65 33 46 6b 44 72 6f 70 54    sqlite3FkDropT
13f50 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61  able(pParse, pNa
13f60 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 73  me, pTab);.    s
13f70 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61  qlite3CodeDropTa
13f80 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
13f90 2c 20 69 44 62 2c 20 69 73 56 69 65 77 29 3b 0a  , iDb, isView);.
13fa0 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74    }..exit_drop_t
13fb0 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53  able:.  sqlite3S
13fc0 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
13fd0 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pName);.}../*.*
13fe0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
13ff0 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
14000 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e  te a new foreign
14010 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c   key on the tabl
14020 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  e.** currently u
14030 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
14040 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74  n.  pFromCol det
14050 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f  ermines which co
14060 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
14070 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f  current table po
14080 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69  int to the forei
14090 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f  gn key.  If pFro
140a0 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  mCol==0 then.** 
140b0 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20  connect the key 
140c0 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  to the last colu
140d0 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54  mn inserted.  pT
140e0 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
140f0 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65  .** the table re
14100 66 65 72 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61  ferred to (a.k.a
14110 20 74 68 65 20 22 70 61 72 65 6e 74 22 20 74 61   the "parent" ta
14120 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73  ble).  pToCol is
14130 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61   a list.** of ta
14140 62 6c 65 73 20 69 6e 20 74 68 65 20 70 61 72 65  bles in the pare
14150 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e 20 20 66  nt pTo table.  f
14160 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c  lags contains al
14170 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
14180 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c   about the confl
14190 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
141a0 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66  lgorithms specif
141b0 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  ied.** in the ON
141c0 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41   DELETE, ON UPDA
141d0 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54  TE and ON INSERT
141e0 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
141f0 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72  An FKey structur
14200 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  e is created and
14210 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
14220 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  ble currently.**
14230 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
14240 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73  ion in the pPars
14250 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65  e->pNewTable fie
14260 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ld..**.** The fo
14270 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74  reign key is set
14280 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70   for IMMEDIATE p
14290 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75  rocessing.  A su
142a0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
142b0 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72   to sqlite3Defer
142c0 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67  ForeignKey() mig
142d0 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74  ht change this t
142e0 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76  o DEFERRED..*/.v
142f0 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
14300 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50  eForeignKey(.  P
14310 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
14320 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
14330 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
14340 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20  List *pFromCol, 
14350 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
14360 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70  his table that p
14370 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61  oint to other ta
14380 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
14390 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pTo,          /*
143a0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68   Name of the oth
143b0 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  er table */.  Ex
143c0 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20  prList *pToCol, 
143d0 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e     /* Columns in
143e0 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
143f0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
14400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
14410 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
14420 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f  n algorithms. */
14430 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
14440 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
14450 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14460 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
14470 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20    FKey *pFKey = 
14480 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 74  0;.  FKey *pNext
14490 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d  To;.  Table *p =
144a0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
144b0 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  le;.  int nByte;
144c0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
144d0 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nCol;.  char *z;
144e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21  ..  assert( pTo!
144f0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
14500 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56   || IN_DECLARE_V
14510 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  TAB ) goto fk_en
14520 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  d;.  if( pFromCo
14530 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  l==0 ){.    int 
14540 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  iCol = p->nCol-1
14550 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
14560 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66  iCol<0) ) goto f
14570 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  k_end;.    if( p
14580 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
14590 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
145a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
145b0 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65  sg(pParse, "fore
145c0 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20  ign key on %s". 
145d0 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64          " should
145e0 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
145f0 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  one column of ta
14600 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20  ble %T",.       
14610 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e    p->aCol[iCol].
14620 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20  zName, pTo);.   
14630 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
14640 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d      }.    nCol =
14650 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
14660 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
14670 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f  ->nExpr!=pFromCo
14680 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  l->nExpr ){.    
14690 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
146a0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
146b0 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  "number of colum
146c0 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
146d0 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
146e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22   the number of "
146f0 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e  .        "column
14700 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
14710 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20  ced table");.   
14720 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
14730 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20  }else{.    nCol 
14740 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  = pFromCol->nExp
14750 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  r;.  }.  nByte =
14760 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20   sizeof(*pFKey) 
14770 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f  + (nCol-1)*sizeo
14780 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d  f(pFKey->aCol[0]
14790 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a  ) + pTo->n + 1;.
147a0 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
147b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
147c0 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b  ToCol->nExpr; i+
147d0 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20  +){.      nByte 
147e0 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
147f0 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  30(pToCol->a[i].
14800 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  zName) + 1;.    
14810 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20  }.  }.  pFKey = 
14820 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
14830 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b  ero(db, nByte );
14840 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20  .  if( pFKey==0 
14850 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  ){.    goto fk_e
14860 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d  nd;.  }.  pFKey-
14870 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46  >pFrom = p;.  pF
14880 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d  Key->pNextFrom =
14890 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d   p->pFKey;.  z =
148a0 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e   (char*)&pFKey->
148b0 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46  aCol[nCol];.  pF
148c0 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20  Key->zTo = z;.  
148d0 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a  memcpy(z, pTo->z
148e0 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70  , pTo->n);.  z[p
148f0 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71  To->n] = 0;.  sq
14900 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b  lite3Dequote(z);
14910 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31  .  z += pTo->n+1
14920 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20  ;.  pFKey->nCol 
14930 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46  = nCol;.  if( pF
14940 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
14950 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e   pFKey->aCol[0].
14960 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  iFrom = p->nCol-
14970 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
14980 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
14990 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
149a0 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
149b0 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b  0; j<p->nCol; j+
149c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
149d0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
149e0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
149f0 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
14a00 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
14a10 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43         pFKey->aC
14a20 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b  ol[i].iFrom = j;
14a30 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
14a40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14a50 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
14a60 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  =p->nCol ){.    
14a70 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14a80 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
14a90 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20         "unknown 
14aa0 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e  column \"%s\" in
14ab0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
14ac0 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20  inition", .     
14ad0 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61       pFromCol->a
14ae0 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
14af0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
14b00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14b10 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
14b20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
14b30 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
14b40 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
14b50 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43  te3Strlen30(pToC
14b60 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
14b70 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  .      pFKey->aC
14b80 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a  ol[i].zCol = z;.
14b90 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20        memcpy(z, 
14ba0 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
14bb0 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b  me, n);.      z[
14bc0 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20  n] = 0;.      z 
14bd0 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  += n+1;.    }.  
14be0 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  }.  pFKey->isDef
14bf0 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b  erred = 0;.  pFK
14c00 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d  ey->aAction[0] =
14c10 20 28 75 38 29 28 66 6c 61 67 73 20 26 20 30 78   (u8)(flags & 0x
14c20 66 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ff);            
14c30 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61 63 74  /* ON DELETE act
14c40 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e  ion */.  pFKey->
14c50 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38  aAction[1] = (u8
14c60 29 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20  )((flags >> 8 ) 
14c70 26 20 30 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f  & 0xff);    /* O
14c80 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20  N UPDATE action 
14c90 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
14ca0 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
14cb0 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70  Held(db, 0, p->p
14cc0 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65  Schema) );.  pNe
14cd0 78 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73  xtTo = (FKey *)s
14ce0 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
14cf0 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b  (&p->pSchema->fk
14d00 65 79 48 61 73 68 2c 20 0a 20 20 20 20 20 20 70  eyHash, .      p
14d10 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64  FKey->zTo, (void
14d20 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20   *)pFKey.  );.  
14d30 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b  if( pNextTo==pFK
14d40 65 79 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  ey ){.    db->ma
14d50 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
14d60 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
14d70 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 78 74  .  }.  if( pNext
14d80 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  To ){.    assert
14d90 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76  ( pNextTo->pPrev
14da0 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b  To==0 );.    pFK
14db0 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e  ey->pNextTo = pN
14dc0 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74  extTo;.    pNext
14dd0 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70 46  To->pPrevTo = pF
14de0 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  Key;.  }..  /* L
14df0 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20  ink the foreign 
14e00 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65  key to the table
14e10 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65   as the last ste
14e20 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b  p..  */.  p->pFK
14e30 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46  ey = pFKey;.  pF
14e40 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64  Key = 0;..fk_end
14e50 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
14e60 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65  e(db, pFKey);.#e
14e70 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
14e80 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52  (SQLITE_OMIT_FOR
14e90 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73  EIGN_KEY) */.  s
14ea0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
14eb0 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f  lete(db, pFromCo
14ec0 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
14ed0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
14ee0 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pToCol);.}../*.*
14ef0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
14f00 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
14f10 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
14f20 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c  IATE or INITIALL
14f30 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c  Y DEFERRED.** cl
14f40 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20  ause is seen as 
14f50 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67  part of a foreig
14f60 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
14f70 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65  .  The isDeferre
14f80 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
14f90 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  s 1 for INITIALL
14fa0 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30  Y DEFERRED and 0
14fb0 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49   for INITIALLY I
14fc0 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65  MMEDIATE..** The
14fd0 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
14fe0 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
14ff0 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b  reated foreign k
15000 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ey is adjusted.*
15010 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  * accordingly..*
15020 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
15030 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61  ferForeignKey(Pa
15040 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
15050 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69   isDeferred){.#i
15060 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15070 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
15080 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46  Table *pTab;.  F
15090 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66  Key *pFKey;.  if
150a0 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65  ( (pTab = pParse
150b0 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
150c0 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62  || (pFKey = pTab
150d0 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65  ->pFKey)==0 ) re
150e0 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
150f0 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c  isDeferred==0 ||
15100 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29   isDeferred==1 )
15110 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32 33  ; /* EV: R-30323
15120 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65  -21917 */.  pFKe
15130 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
15140 28 75 38 29 69 73 44 65 66 65 72 72 65 64 3b 0a  (u8)isDeferred;.
15150 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
15160 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
15170 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e  at will erase an
15180 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a  d refill index *
15190 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a  pIdx.  This is.*
151a0 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61  * used to initia
151b0 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65  lize a newly cre
151c0 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f  ated index or to
151d0 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a   recompute the.*
151e0 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  * content of an 
151f0 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73  index in respons
15200 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63  e to a REINDEX c
15210 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66  ommand..**.** if
15220 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
15230 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74  not negative, it
15240 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
15250 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a  index is newly.*
15260 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  * created.  The 
15270 72 65 67 69 73 74 65 72 20 73 70 65 63 69 66 69  register specifi
15280 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67  ed by memRootPag
15290 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a  e contains the.*
152a0 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  * root page numb
152b0 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  er of the index.
152c0 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65    If memRootPage
152d0 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
152e0 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  en.** the index 
152f0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
15300 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72  nd must be clear
15310 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
15320 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20  refilled and.** 
15330 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
15340 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
15350 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  x is taken from 
15360 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f  pIndex->tnum..*/
15370 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
15380 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
15390 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
153a0 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e  ndex *pIndex, in
153b0 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a  t memRootPage){.
153c0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
153d0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20  pIndex->pTable; 
153e0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68   /* The table th
153f0 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f  at is indexed */
15400 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
15410 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
15420 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
15430 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20  r used for pTab 
15440 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  */.  int iIdx = 
15450 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
15460 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
15470 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e  sor used for pIn
15480 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f  dex */.  int iSo
15490 72 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  rter;           
154a0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
154b0 72 20 6f 70 65 6e 65 64 20 62 79 20 4f 70 65 6e  r opened by Open
154c0 53 6f 72 74 65 72 20 28 69 66 20 69 6e 20 75 73  Sorter (if in us
154d0 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  e) */.  int addr
154e0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
154f0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
15500 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70  s of top of loop
15510 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 32 3b   */.  int addr2;
15520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15530 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
15540 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e  to jump to for n
15550 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ext iteration */
15560 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20  .  int tnum;    
15570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15580 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
15590 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
155a0 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 3b 20   iPartIdxLabel; 
155b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
155c0 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61 62 65  ump to this labe
155d0 6c 20 74 6f 20 73 6b 69 70 20 61 20 72 6f 77 20  l to skip a row 
155e0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
155f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15600 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
15610 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76  code into this v
15620 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a  irtual machine *
15630 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
15640 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
15650 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f     /* KeyInfo fo
15660 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  r index */.  int
15670 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20   regRecord;     
15680 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
15690 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
156a0 61 73 73 65 6d 62 6c 65 64 20 69 6e 64 65 78 20  assembled index 
156b0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
156c0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
156d0 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68  ->db;      /* Th
156e0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
156f0 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
15700 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
15710 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49  maToIndex(db, pI
15720 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
15730 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15740 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
15750 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ON.  if( sqlite3
15760 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
15770 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  , SQLITE_REINDEX
15780 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
15790 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   0,.      db->aD
157a0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29  b[iDb].zName ) )
157b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
157c0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
157d0 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  equire a write-l
157e0 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
157f0 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73   to perform this
15800 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
15810 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
15820 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
15830 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61  ab->tnum, 1, pTa
15840 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20  b->zName);..  v 
15850 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
15860 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
15870 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
15880 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
15890 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20  >=0 ){.    tnum 
158a0 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20  = memRootPage;. 
158b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d   }else{.    tnum
158c0 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b   = pIndex->tnum;
158d0 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71  .  }.  pKey = sq
158e0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e  lite3KeyInfoOfIn
158f0 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
15900 65 78 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ex);..  /* Open 
15910 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f  the sorter curso
15920 72 20 69 66 20 77 65 20 61 72 65 20 74 6f 20 75  r if we are to u
15930 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f  se one. */.  iSo
15940 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rter = pParse->n
15950 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  Tab++;.  sqlite3
15960 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
15970 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53 6f  _SorterOpen, iSo
15980 72 74 65 72 2c 20 30 2c 20 70 49 6e 64 65 78 2d  rter, 0, pIndex-
15990 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63 68 61 72 2a  >nKeyCol, (char*
159a0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
159b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79        sqlite3Key
159c0 49 6e 66 6f 52 65 66 28 70 4b 65 79 29 2c 20 50  InfoRef(pKey), P
159d0 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f  4_KEYINFO);..  /
159e0 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 62 6c 65  * Open the table
159f0 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  . Loop through a
15a00 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74  ll rows of the t
15a10 61 62 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67 20  able, inserting 
15a20 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72  index.  ** recor
15a30 64 73 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ds into the sort
15a40 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  er. */.  sqlite3
15a50 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
15a60 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61  , iTab, iDb, pTa
15a70 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
15a80 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
15a90 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
15aa0 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
15ab0 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   0); VdbeCoverag
15ac0 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  e(v);.  regRecor
15ad0 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
15ae0 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a  mpReg(pParse);..
15af0 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74    sqlite3Generat
15b00 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65  eIndexKey(pParse
15b10 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c 72 65 67  ,pIndex,iTab,reg
15b20 52 65 63 6f 72 64 2c 30 2c 26 69 50 61 72 74 49  Record,0,&iPartI
15b30 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a 20 20  dxLabel,0,0);.  
15b40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15b50 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e  2(v, OP_SorterIn
15b60 73 65 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 72  sert, iSorter, r
15b70 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
15b80 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49  ite3ResolvePartI
15b90 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20  dxLabel(pParse, 
15ba0 69 50 61 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a  iPartIdxLabel);.
15bb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15bc0 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
15bd0 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 20  iTab, addr1+1); 
15be0 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15bf0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
15c00 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
15c10 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50  ;.  if( memRootP
15c20 61 67 65 3c 30 20 29 20 73 71 6c 69 74 65 33 56  age<0 ) sqlite3V
15c30 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15c40 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62  Clear, tnum, iDb
15c50 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15c60 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
15c70 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e  nWrite, iIdx, tn
15c80 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20  um, iDb, .      
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
15ca0 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b  har *)pKey, P4_K
15cb0 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74  EYINFO);.  sqlit
15cc0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
15cd0 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52  , OPFLAG_BULKCSR
15ce0 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  |((memRootPage>=
15cf0 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52 45  0)?OPFLAG_P2ISRE
15d00 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64 72 31 20  G:0));..  addr1 
15d10 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
15d20 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
15d30 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 30  Sort, iSorter, 0
15d40 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15d50 76 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  v);.  assert( pK
15d60 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  ey!=0 || db->mal
15d70 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
15d80 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 69  rse->nErr );.  i
15d90 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  f( IsUniqueIndex
15da0 28 70 49 6e 64 65 78 29 20 26 26 20 70 4b 65 79  (pIndex) && pKey
15db0 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  !=0 ){.    int j
15dc0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
15dd0 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
15de0 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  3;.    sqlite3Vd
15df0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
15e00 6f 74 6f 2c 20 30 2c 20 6a 32 29 3b 0a 20 20 20  oto, 0, j2);.   
15e10 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
15e20 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
15e30 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
15e40 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
15e50 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65  OP_SorterCompare
15e60 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72  , iSorter, j2, r
15e70 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20  egRecord,.      
15e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e90 20 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43     pIndex->nKeyC
15ea0 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  ol); VdbeCoverag
15eb0 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(v);.    sqlite
15ec0 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e  3UniqueConstrain
15ed0 74 28 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f  t(pParse, OE_Abo
15ee0 72 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  rt, pIndex);.  }
15ef0 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72 32 20  else{.    addr2 
15f00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
15f10 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d  rentAddr(v);.  }
15f20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15f30 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
15f40 72 44 61 74 61 2c 20 69 53 6f 72 74 65 72 2c 20  rData, iSorter, 
15f50 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
15f60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
15f70 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c  v, OP_IdxInsert,
15f80 20 69 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64   iIdx, regRecord
15f90 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  , 1);.  sqlite3V
15fa0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
15fb0 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53  PFLAG_USESEEKRES
15fc0 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  ULT);.  sqlite3R
15fd0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
15fe0 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29  arse, regRecord)
15ff0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16000 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
16010 65 72 4e 65 78 74 2c 20 69 53 6f 72 74 65 72 2c  erNext, iSorter,
16020 20 61 64 64 72 32 29 3b 20 56 64 62 65 43 6f 76   addr2); VdbeCov
16030 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c 69  erage(v);.  sqli
16040 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
16050 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 73 71  v, addr1);..  sq
16060 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16070 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61  v, OP_Close, iTa
16080 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
16090 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
160a0 6f 73 65 2c 20 69 49 64 78 29 3b 0a 20 20 73 71  ose, iIdx);.  sq
160b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
160c0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f  v, OP_Close, iSo
160d0 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rter);.}../*.** 
160e0 41 6c 6c 6f 63 61 74 65 20 68 65 61 70 20 73 70  Allocate heap sp
160f0 61 63 65 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49  ace to hold an I
16100 6e 64 65 78 20 6f 62 6a 65 63 74 20 77 69 74 68  ndex object with
16110 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a   nCol columns..*
16120 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65 20 74 68  *.** Increase th
16130 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a  e allocation siz
16140 65 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20  e to provide an 
16150 65 78 74 72 61 20 6e 45 78 74 72 61 20 62 79 74  extra nExtra byt
16160 65 73 0a 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20  es.** of 8-byte 
16170 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 66  aligned space af
16180 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62  ter the Index ob
16190 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ject and return 
161a0 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
161b0 74 68 69 73 20 65 78 74 72 61 20 73 70 61 63 65  this extra space
161c0 20 69 6e 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f   in *ppExtra..*/
161d0 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 41  .Index *sqlite3A
161e0 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65  llocateIndexObje
161f0 63 74 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ct(.  sqlite3 *d
16200 62 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  b,         /* Da
16210 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
16220 6e 20 2a 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c  n */.  i16 nCol,
16230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16240 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63  otal number of c
16250 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e  olumns in the in
16260 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  dex */.  int nEx
16270 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  tra,          /*
16280 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
16290 20 6f 66 20 65 78 74 72 61 20 73 70 61 63 65 20   of extra space 
162a0 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68  to alloc */.  ch
162b0 61 72 20 2a 2a 70 70 45 78 74 72 61 20 20 20 20  ar **ppExtra    
162c0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
162d0 20 74 68 65 20 22 65 78 74 72 61 22 20 73 70 61   the "extra" spa
162e0 63 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  ce */.){.  Index
162f0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
16300 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64  /* Allocated ind
16310 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  ex object */.  i
16320 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
16330 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
16340 73 70 61 63 65 20 66 6f 72 20 49 6e 64 65 78 20  space for Index 
16350 6f 62 6a 65 63 74 20 2b 20 61 72 72 61 79 73 20  object + arrays 
16360 2a 2f 0a 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f  */..  nByte = RO
16370 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65  UND8(sizeof(Inde
16380 78 29 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  x)) +           
16390 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75     /* Index stru
163a0 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20  cture  */.      
163b0 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f      ROUND8(sizeo
163c0 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b  f(char*)*nCol) +
163d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
163e0 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a  x.azColl     */.
163f0 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38            ROUND8
16400 28 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a  (sizeof(LogEst)*
16410 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 2f  (nCol+1) +     /
16420 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 4c 6f 67  * Index.aiRowLog
16430 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  Est   */.       
16440 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
16450 28 69 31 36 29 2a 6e 43 6f 6c 20 2b 20 20 20 20  (i16)*nCol +    
16460 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
16470 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20  .aiColumn   */. 
16480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16490 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 29  sizeof(u8)*nCol)
164a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
164b0 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65   Index.aSortOrde
164c0 72 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74  r */.  p = sqlit
164d0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
164e0 62 2c 20 6e 42 79 74 65 20 2b 20 6e 45 78 74 72  b, nByte + nExtr
164f0 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  a);.  if( p ){. 
16500 20 20 20 63 68 61 72 20 2a 70 45 78 74 72 61 20     char *pExtra 
16510 3d 20 28 28 63 68 61 72 2a 29 70 29 2b 52 4f 55  = ((char*)p)+ROU
16520 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78  ND8(sizeof(Index
16530 29 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c  ));.    p->azCol
16540 6c 20 3d 20 28 63 68 61 72 2a 2a 29 70 45 78 74  l = (char**)pExt
16550 72 61 3b 20 20 20 20 20 20 20 70 45 78 74 72 61  ra;       pExtra
16560 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f   += ROUND8(sizeo
16570 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a  f(char*)*nCol);.
16580 20 20 20 20 70 2d 3e 61 69 52 6f 77 4c 6f 67 45      p->aiRowLogE
16590 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a 29 70 45  st = (LogEst*)pE
165a0 78 74 72 61 3b 20 70 45 78 74 72 61 20 2b 3d 20  xtra; pExtra += 
165b0 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28  sizeof(LogEst)*(
165c0 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e  nCol+1);.    p->
165d0 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a  aiColumn = (i16*
165e0 29 70 45 78 74 72 61 3b 20 20 20 20 20 20 20 70  )pExtra;       p
165f0 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
16600 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70  i16)*nCol;.    p
16610 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
16620 75 38 2a 29 70 45 78 74 72 61 3b 0a 20 20 20 20  u8*)pExtra;.    
16630 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f  p->nColumn = nCo
16640 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f  l;.    p->nKeyCo
16650 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  l = nCol - 1;.  
16660 20 20 2a 70 70 45 78 74 72 61 20 3d 20 28 28 63    *ppExtra = ((c
16670 68 61 72 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b  har*)p) + nByte;
16680 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
16690 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
166a0 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72   a new index for
166b0 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20   an SQL table.  
166c0 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73  pName1.pName2 is
166d0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
166e0 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70   index .** and p
166f0 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e  TblList is the n
16700 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
16710 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
16720 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69  ndexed.  Both wi
16730 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66  ll .** be NULL f
16740 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  or a primary key
16750 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61   or an index tha
16760 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20  t is created to 
16770 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49  satisfy a.** UNI
16780 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
16790 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70   If pTable and p
167a0 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20  Index are NULL, 
167b0 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  use pParse->pNew
167c0 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20  Table.** as the 
167d0 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
167e0 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e  xed.  pParse->pN
167f0 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62  ewTable is a tab
16800 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75  le that is.** cu
16810 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
16820 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43  nstructed by a C
16830 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
16840 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69  ement..**.** pLi
16850 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
16860 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
16870 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69  dexed.  pList wi
16880 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
16890 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61  is.** is a prima
168a0 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65  ry key or unique
168b0 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74  -constraint on t
168c0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
168d0 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74  olumn added.** t
168e0 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
168f0 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
16900 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  truction.  .**.*
16910 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 69  * If the index i
16920 73 20 63 72 65 61 74 65 64 20 73 75 63 63 65 73  s created succes
16930 73 66 75 6c 6c 79 2c 20 72 65 74 75 72 6e 20 61  sfully, return a
16940 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
16950 6e 65 77 20 49 6e 64 65 78 0a 2a 2a 20 73 74 72  new Index.** str
16960 75 63 74 75 72 65 2e 20 54 68 69 73 20 69 73 20  ucture. This is 
16970 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 41  used by sqlite3A
16980 64 64 50 72 69 6d 61 72 79 4b 65 79 28 29 20 74  ddPrimaryKey() t
16990 6f 20 6d 61 72 6b 20 74 68 65 20 69 6e 64 65 78  o mark the index
169a0 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
169b0 73 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 49  s primary key (I
169c0 6e 64 65 78 2e 69 64 78 54 79 70 65 3d 3d 53 51  ndex.idxType==SQ
169d0 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49  LITE_IDXTYPE_PRI
169e0 4d 41 52 59 4b 45 59 29 0a 2a 2f 0a 49 6e 64 65  MARYKEY).*/.Inde
169f0 78 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74 65  x *sqlite3Create
16a00 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
16a10 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41  pParse,     /* A
16a20 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ll information a
16a30 62 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20  bout this parse 
16a40 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
16a50 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74  e1,     /* First
16a60 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e   part of index n
16a70 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ame. May be NULL
16a80 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
16a90 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f  me2,     /* Seco
16aa0 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  nd part of index
16ab0 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
16ac0 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  LL */.  SrcList 
16ad0 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61  *pTblName, /* Ta
16ae0 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73  ble to index. Us
16af0 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
16b00 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78  ble if 0 */.  Ex
16b10 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
16b20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f   /* A list of co
16b30 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65  lumns to be inde
16b40 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
16b50 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f  rror,       /* O
16b60 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f  E_Abort, OE_Igno
16b70 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20  re, OE_Replace, 
16b80 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20  or OE_None */.  
16b90 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20  Token *pStart,  
16ba0 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
16bb0 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
16bc0 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ns this statemen
16bd0 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 49  t */.  Expr *pPI
16be0 57 68 65 72 65 2c 20 20 20 20 2f 2a 20 57 48 45  Where,    /* WHE
16bf0 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20 70 61  RE clause for pa
16c00 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f  rtial indices */
16c10 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
16c20 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72  ,     /* Sort or
16c30 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b  der of primary k
16c40 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e  ey when pList==N
16c50 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e  ULL */.  int ifN
16c60 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f  otExist     /* O
16c70 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64  mit error if ind
16c80 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
16c90 73 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20  s */.){.  Index 
16ca0 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 2f  *pRet = 0;     /
16cb0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 65 74  * Pointer to ret
16cc0 75 72 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  urn */.  Table *
16cd0 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a  pTab = 0;     /*
16ce0 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   Table to be ind
16cf0 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  exed */.  Index 
16d00 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f  *pIndex = 0;   /
16d10 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62  * The index to b
16d20 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63  e created */.  c
16d30 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20  har *zName = 0; 
16d40 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
16d50 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  he index */.  in
16d60 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
16d70 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16d80 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e  characters in zN
16d90 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ame */.  int i, 
16da0 6a 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  j;.  DbFixer sFi
16db0 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  x;        /* For
16dc0 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62   assigning datab
16dd0 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61  ase names to pTa
16de0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ble */.  int sor
16df0 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a  tOrderMask;   /*
16e00 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43   1 to honor DESC
16e10 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f   in index.  0 to
16e20 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71   ignore. */.  sq
16e30 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
16e40 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44  se->db;.  Db *pD
16e50 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
16e60 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20 74  * The specific t
16e70 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
16e80 74 68 65 20 69 6e 64 65 78 65 64 20 64 61 74 61  the indexed data
16e90 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  base */.  int iD
16ea0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
16eb0 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64  * Index of the d
16ec0 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
16ed0 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
16ee0 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  .  Token *pName 
16ef0 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  = 0;    /* Unqua
16f00 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
16f10 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61  he index to crea
16f20 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45  te */.  struct E
16f30 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  xprList_item *pL
16f40 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20  istItem; /* For 
16f50 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69  looping over pLi
16f60 73 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 43 6f  st */.  const Co
16f70 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 20 20  lumn *pTabCol;  
16f80 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
16f90 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
16fa0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  e */.  int nExtr
16fb0 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  a = 0;          
16fc0 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
16fd0 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a   allocated for z
16fe0 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  Extra[] */.  int
16ff0 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20 20 20   nExtraCol;     
17000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17010 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
17020 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20   columns needed 
17030 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72  */.  char *zExtr
17040 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  a = 0;          
17050 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73        /* Extra s
17060 70 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49  pace after the I
17070 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndex object */. 
17080 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b   Index *pPk = 0;
17090 20 20 20 20 20 20 2f 2a 20 50 52 49 4d 41 52 59        /* PRIMARY
170a0 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72 20 57   KEY index for W
170b0 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
170c0 6c 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  les */..  assert
170d0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
170e0 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 65 76  0 );      /* Nev
170f0 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  er called with p
17100 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20  rior errors */. 
17110 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
17120 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c  ailed || IN_DECL
17130 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  ARE_VTAB ){.    
17140 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
17150 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
17160 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
17170 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
17180 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
17190 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
171a0 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ndex;.  }..  /*.
171b0 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61    ** Find the ta
171c0 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
171d0 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75  e indexed.  Retu
171e0 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20  rn early if not 
171f0 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  found..  */.  if
17200 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
17210 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
17220 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20   two-part index 
17230 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  name to determin
17240 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  e the database .
17250 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68      ** to search
17260 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
17270 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20  'Fix' the table 
17280 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a  name to this db.
17290 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f      ** before lo
172a0 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62  oking up the tab
172b0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  le..    */.    a
172c0 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26  ssert( pName1 &&
172d0 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69   pName2 );.    i
172e0 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
172f0 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
17300 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
17310 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  &pName);.    if(
17320 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78   iDb<0 ) goto ex
17330 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
17340 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
17350 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29  me && pName->z )
17360 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
17370 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20  E_OMIT_TEMPDB.  
17380 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65    /* If the inde
17390 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61  x name was unqua
173a0 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66  lified, check if
173b0 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
173c0 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c  * is a temp tabl
173d0 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68  e. If so, set th
173e0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e  e database to 1.
173f0 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a   Do not do this.
17400 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61      ** if initia
17410 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62 61 73  lising a databas
17420 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f  e schema..    */
17430 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
17440 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
17450 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53   pTab = sqlite3S
17460 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61  rcListLookup(pPa
17470 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  rse, pTblName);.
17480 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32        if( pName2
17490 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26  ->n==0 && pTab &
174a0 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d  & pTab->pSchema=
174b0 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  =db->aDb[1].pSch
174c0 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ema ){.        i
174d0 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  Db = 1;.      }.
174e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
174f0 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74    sqlite3FixInit
17500 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
17510 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e  iDb, "index", pN
17520 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71  ame);.    if( sq
17530 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
17540 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
17550 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63   ){.      /* Bec
17560 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20  ause the parser 
17570 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e  constructs pTblN
17580 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ame from a singl
17590 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20  e identifier,.  
175a0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69      ** sqlite3Fi
175b0 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76  xSrcList can nev
175c0 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20  er fail. */.    
175d0 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20    assert(0);.   
175e0 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71   }.    pTab = sq
175f0 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
17600 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20  Item(pParse, 0, 
17610 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29  &pTblName->a[0])
17620 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
17630 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
17640 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a  0 || pTab==0 );.
17650 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
17660 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
17670 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
17680 28 20 69 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e  ( iDb==1 && db->
17690 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
176a0 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  !=pTab->pSchema 
176b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
176c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
176d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 22 63 61   .           "ca
176e0 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20 54 45  nnot create a TE
176f0 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d  MP index on non-
17700 54 45 4d 50 20 74 61 62 6c 65 20 5c 22 25 73 5c  TEMP table \"%s\
17710 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  "",.           p
17720 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
17730 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
17740 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
17750 0a 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77  .    if( !HasRow
17760 69 64 28 70 54 61 62 29 20 29 20 70 50 6b 20 3d  id(pTab) ) pPk =
17770 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b   sqlite3PrimaryK
17780 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20  eyIndex(pTab);. 
17790 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
177a0 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a  rt( pName==0 );.
177b0 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61      assert( pSta
177c0 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61  rt==0 );.    pTa
177d0 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
177e0 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21  Table;.    if( !
177f0 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74  pTab ) goto exit
17800 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
17810 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
17820 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
17830 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
17840 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64  ;.  }.  pDb = &d
17850 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
17860 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
17870 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
17880 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a  rse->nErr==0 );.
17890 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
178a0 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d  NICmp(pTab->zNam
178b0 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
178c0 3d 3d 30 20 0a 23 69 66 20 53 51 4c 49 54 45 5f  ==0 .#if SQLITE_
178d0 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
178e0 49 4f 4e 0a 20 20 20 20 20 20 20 26 26 20 73 71  ION.       && sq
178f0 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61 62  lite3UserAuthTab
17900 6c 65 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d  le(pTab->zName)=
17910 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  =0.#endif.      
17920 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
17930 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65  Cmp(&pTab->zName
17940 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c  [7],"altertab_",
17950 39 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  9)!=0 ){.    sql
17960 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17970 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
17980 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
17990 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
179a0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
179b0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
179c0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
179d0 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28  _OMIT_VIEW.  if(
179e0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
179f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
17a00 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
17a10 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  iews may not be 
17a20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
17a30 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
17a40 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
17a50 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
17a60 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
17a70 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
17a80 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
17a90 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
17aa0 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c  pParse, "virtual
17ab0 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20   tables may not 
17ac0 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
17ad0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
17ae0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
17af0 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
17b00 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
17b10 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
17b20 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
17b30 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
17b40 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
17b50 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
17b60 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
17b70 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
17b80 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
17b90 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
17ba0 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
17bb0 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
17bc0 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
17bd0 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
17be0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
17bf0 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
17c00 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
17c10 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
17c20 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
17c30 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
17c40 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
17c50 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
17c60 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
17c70 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
17c80 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
17c90 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
17ca0 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
17cb0 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
17cc0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
17cd0 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
17ce0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
17cf0 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
17d00 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
17d10 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
17d20 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
17d30 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
17d40 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
17d50 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  Name);.    if( z
17d60 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
17d70 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
17d80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
17d90 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  ame->z!=0 );.   
17da0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
17db0 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
17dc0 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
17dd0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67  Name) ){.      g
17de0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
17df0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
17e00 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
17e10 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  usy ){.      if(
17e20 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
17e30 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21  e(db, zName, 0)!
17e40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
17e50 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
17e60 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
17e70 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20  already a table 
17e80 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
17e90 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
17ea0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
17eb0 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
17ec0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
17ed0 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
17ee0 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29  ame, pDb->zName)
17ef0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
17f00 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a   !ifNotExist ){.
17f10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17f20 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
17f30 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64  "index %s alread
17f40 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65  y exists", zName
17f50 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
17f60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17f70 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
17f80 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17f90 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
17fa0 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
17fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
17fc0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
17fd0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ndex;.    }.  }e
17fe0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  lse{.    int n;.
17ff0 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70      Index *pLoop
18000 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ;.    for(pLoop=
18010 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d  pTab->pIndex, n=
18020 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  1; pLoop; pLoop=
18030 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b  pLoop->pNext, n+
18040 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  +){}.    zName =
18050 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
18060 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f  db, "sqlite_auto
18070 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54  index_%s_%d", pT
18080 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  ab->zName, n);. 
18090 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
180a0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
180b0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
180c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
180d0 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f   Check for autho
180e0 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61  rization to crea
180f0 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a  te an index..  *
18100 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
18110 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
18120 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73  ION.  {.    cons
18130 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44  t char *zDb = pD
18140 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b->zName;.    if
18150 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
18160 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
18170 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
18180 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20  _TABLE(iDb), 0, 
18190 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
181a0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
181b0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
181c0 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
181d0 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  E_INDEX;.    if(
181e0 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
181f0 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51   iDb==1 ) i = SQ
18200 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
18210 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
18220 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
18230 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d  (pParse, i, zNam
18240 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
18250 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
18260 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18270 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
18280 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
18290 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61  pList==0, it mea
182a0 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ns this routine 
182b0 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61  was called to ma
182c0 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a  ke a primary.  *
182d0 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65  * key out of the
182e0 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
182f0 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
18300 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
18310 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61  on..  ** So crea
18320 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74  te a fake list t
18330 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e  o simulate this.
18340 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73  .  */.  if( pLis
18350 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
18360 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
18370 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
18380 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
18390 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
183a0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
183b0 65 78 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  ex;.    pList->a
183c0 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [0].zName = sqli
183d0 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72  te3DbStrDup(pPar
183e0 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->db,.        
183f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18410 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
18420 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b  >nCol-1].zName);
18430 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  .    pList->a[0]
18440 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  .sortOrder = (u8
18450 29 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  )sortOrder;.  }.
18460 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
18470 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20   how many bytes 
18480 6f 66 20 73 70 61 63 65 20 61 72 65 20 72 65 71  of space are req
18490 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65  uired to store e
184a0 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73  xplicitly.  ** s
184b0 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69  pecified collati
184c0 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
184d0 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
184e0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
184f0 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
18500 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74  r *pExpr = pList
18510 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
18520 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
18530 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
18540 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pr->op==TK_COLLA
18550 54 45 20 29 3b 0a 20 20 20 20 20 20 6e 45 78 74  TE );.      nExt
18560 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74  ra += (1 + sqlit
18570 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72  e3Strlen30(pExpr
18580 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20  ->u.zToken));.  
18590 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20    }.  }..  /* . 
185a0 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   ** Allocate the
185b0 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
185c0 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20  . .  */.  nName 
185d0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
185e0 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74  0(zName);.  nExt
185f0 72 61 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50  raCol = pPk ? pP
18600 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a  k->nKeyCol : 1;.
18610 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
18620 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f  e3AllocateIndexO
18630 62 6a 65 63 74 28 64 62 2c 20 70 4c 69 73 74 2d  bject(db, pList-
18640 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74 72 61 43  >nExpr + nExtraC
18650 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
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 6e 4e 61 6d 65 20            nName 
18680 2b 20 6e 45 78 74 72 61 20 2b 20 31 2c 20 26 7a  + nExtra + 1, &z
18690 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 64 62  Extra);.  if( db
186a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
186b0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
186c0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
186d0 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  }.  assert( EIGH
186e0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
186f0 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f  (pIndex->aiRowLo
18700 67 45 73 74 29 20 29 3b 0a 20 20 61 73 73 65 72  gEst) );.  asser
18710 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
18720 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e  IGNMENT(pIndex->
18730 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e  azColl) );.  pIn
18740 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78  dex->zName = zEx
18750 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d  tra;.  zExtra +=
18760 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65   nName + 1;.  me
18770 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  mcpy(pIndex->zNa
18780 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  me, zName, nName
18790 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70  +1);.  pIndex->p
187a0 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20  Table = pTab;.  
187b0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
187c0 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20  = (u8)onError;. 
187d0 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74   pIndex->uniqNot
187e0 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d  Null = onError!=
187f0 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65  OE_None;.  pInde
18800 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 70 4e 61  x->idxType = pNa
18810 6d 65 20 3f 20 53 51 4c 49 54 45 5f 49 44 58 54  me ? SQLITE_IDXT
18820 59 50 45 5f 41 50 50 44 45 46 20 3a 20 53 51 4c  YPE_APPDEF : SQL
18830 49 54 45 5f 49 44 58 54 59 50 45 5f 55 4e 49 51  ITE_IDXTYPE_UNIQ
18840 55 45 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53  UE;.  pIndex->pS
18850 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
18860 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
18870 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20  pIndex->nKeyCol 
18880 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
18890 20 20 69 66 28 20 70 50 49 57 68 65 72 65 20 29    if( pPIWhere )
188a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
188b0 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
188c0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
188d0 4e 43 5f 50 61 72 74 49 64 78 2c 20 70 50 49 57  NC_PartIdx, pPIW
188e0 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 70 49  here, 0);.    pI
188f0 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68  ndex->pPartIdxWh
18900 65 72 65 20 3d 20 70 50 49 57 68 65 72 65 3b 0a  ere = pPIWhere;.
18910 20 20 20 20 70 50 49 57 68 65 72 65 20 3d 20 30      pPIWhere = 0
18920 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
18930 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
18940 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
18950 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  0) );..  /* Chec
18960 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73  k to see if we s
18970 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43  hould honor DESC
18980 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64   requests on ind
18990 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ex columns.  */.
189a0 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
189b0 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  ma->file_format>
189c0 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72  =4 ){.    sortOr
189d0 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20  derMask = -1;   
189e0 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f  /* Honor DESC */
189f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f  .  }else{.    so
18a00 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b  rtOrderMask = 0;
18a10 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45      /* Ignore DE
18a20 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  SC */.  }..  /* 
18a30 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  Scan the names o
18a40 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
18a50 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
18a60 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a   indexed and.  *
18a70 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d  * load the colum
18a80 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74  n indices into t
18a90 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  he Index structu
18aa0 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  re.  Report an e
18ab0 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79  rror.  ** if any
18ac0 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66   column is not f
18ad0 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ound..  **.  ** 
18ae0 54 4f 44 4f 3a 20 20 41 64 64 20 61 20 74 65 73  TODO:  Add a tes
18af0 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  t to make sure t
18b00 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  hat the same col
18b10 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64  umn is not named
18b20 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  .  ** more than 
18b30 6f 6e 63 65 20 77 69 74 68 69 6e 20 74 68 65 20  once within the 
18b40 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c  same index.  Onl
18b50 79 20 74 68 65 20 66 69 72 73 74 20 69 6e 73 74  y the first inst
18b60 61 6e 63 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65  ance of.  ** the
18b70 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65   column will eve
18b80 72 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65  r be used by the
18b90 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74   optimizer.  Not
18ba0 65 20 74 68 61 74 20 75 73 69 6e 67 20 74 68 65  e that using the
18bb0 0a 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d  .  ** same colum
18bc0 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  n more than once
18bd0 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72   cannot be an er
18be0 72 6f 72 20 62 65 63 61 75 73 65 20 74 68 61 74  ror because that
18bf0 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65   would .  ** bre
18c00 61 6b 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  ak backwards com
18c10 70 61 74 69 62 69 6c 69 74 79 20 2d 20 69 74 20  patibility - it 
18c20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 20 77 61  needs to be a wa
18c30 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rning..  */.  fo
18c40 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d  r(i=0, pListItem
18c50 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69  =pList->a; i<pLi
18c60 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
18c70 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20  pListItem++){.  
18c80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
18c90 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49 74  olName = pListIt
18ca0 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  em->zName;.    i
18cb0 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74  nt requestedSort
18cc0 4f 72 64 65 72 3b 0a 20 20 20 20 63 68 61 72 20  Order;.    char 
18cd0 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
18ce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
18cf0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
18d00 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72  name */..    for
18d10 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54  (j=0, pTabCol=pT
18d20 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62  ab->aCol; j<pTab
18d30 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61  ->nCol; j++, pTa
18d40 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69  bCol++){.      i
18d50 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
18d60 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62  p(zColName, pTab
18d70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29  Col->zName)==0 )
18d80 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
18d90 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e    if( j>=pTab->n
18da0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
18db0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18dc0 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68  rse, "table %s h
18dd0 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  as no column nam
18de0 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  ed %s",.        
18df0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pTab->zName, zCo
18e00 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 50  lName);.      pP
18e10 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
18e20 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  a = 1;.      got
18e30 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18e40 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  dex;.    }.    a
18e50 73 73 65 72 74 28 20 6a 3c 3d 30 78 37 66 66 66  ssert( j<=0x7fff
18e60 20 29 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e   );.    pIndex->
18e70 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69  aiColumn[i] = (i
18e80 31 36 29 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c  16)j;.    if( pL
18e90 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 29  istItem->pExpr )
18ea0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c  {.      int nCol
18eb0 6c 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  l;.      assert(
18ec0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
18ed0 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
18ee0 45 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  E );.      zColl
18ef0 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45   = pListItem->pE
18f00 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
18f10 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c       nColl = sql
18f20 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f  ite3Strlen30(zCo
18f30 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61  ll) + 1;.      a
18f40 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e  ssert( nExtra>=n
18f50 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65  Coll );.      me
18f60 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f  mcpy(zExtra, zCo
18f70 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20  ll, nColl);.    
18f80 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61    zColl = zExtra
18f90 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b  ;.      zExtra +
18fa0 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e  = nColl;.      n
18fb0 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a  Extra -= nColl;.
18fc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18fd0 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61   zColl = pTab->a
18fe0 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
18ff0 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
19000 20 7a 43 6f 6c 6c 20 3d 20 22 42 49 4e 41 52 59   zColl = "BINARY
19010 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ";.    }.    if(
19020 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
19030 26 26 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74  && !sqlite3Locat
19040 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
19050 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
19060 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19070 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
19080 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c     pIndex->azCol
19090 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  l[i] = zColl;.  
190a0 20 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f    requestedSortO
190b0 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d  rder = pListItem
190c0 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f  ->sortOrder & so
190d0 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20  rtOrderMask;.   
190e0 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
190f0 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71  der[i] = (u8)req
19100 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
19110 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61  .    if( pTab->a
19120 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d  Col[j].notNull==
19130 30 20 29 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71  0 ) pIndex->uniq
19140 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 7d  NotNull = 0;.  }
19150 0a 20 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20  .  if( pPk ){.  
19160 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b    for(j=0; j<pPk
19170 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b  ->nKeyCol; j++){
19180 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70  .      int x = p
19190 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  Pk->aiColumn[j];
191a0 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 43 6f  .      if( hasCo
191b0 6c 75 6d 6e 28 70 49 6e 64 65 78 2d 3e 61 69 43  lumn(pIndex->aiC
191c0 6f 6c 75 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e  olumn, pIndex->n
191d0 4b 65 79 43 6f 6c 2c 20 78 29 20 29 7b 0a 20 20  KeyCol, x) ){.  
191e0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 43        pIndex->nC
191f0 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20 20  olumn--; .      
19200 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
19210 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
19220 69 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  i] = x;.        
19230 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
19240 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b  ] = pPk->azColl[
19250 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64  j];.        pInd
19260 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
19270 5d 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72  ] = pPk->aSortOr
19280 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  der[j];.        
19290 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i++;.      }.   
192a0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69   }.    assert( i
192b0 3d 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  ==pIndex->nColum
192c0 6e 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n );.  }else{.  
192d0 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
192e0 6d 6e 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20  mn[i] = -1;.    
192f0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
19300 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  ] = "BINARY";.  
19310 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61 75  }.  sqlite3Defau
19320 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29  ltRowEst(pIndex)
19330 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
19340 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 20 65  pNewTable==0 ) e
19350 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74  stimateIndexWidt
19360 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66  h(pIndex);..  if
19370 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e  ( pTab==pParse->
19380 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
19390 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
193a0 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
193b0 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75   to create an au
193c0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73  tomatic index as
193d0 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74   a.    ** result
193e0 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45   of a PRIMARY KE
193f0 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
19400 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64  se on a column d
19410 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20  efinition, or.  
19420 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b    ** a PRIMARY K
19430 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
19440 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  use following th
19450 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  e column definit
19460 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65  ions..    ** i.e
19470 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a  . one of:.    **
19480 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
19490 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59  ABLE t(x PRIMARY
194a0 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a   KEY, y);.    **
194b0 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
194c0 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20  x, y, UNIQUE(x, 
194d0 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  y));.    **.    
194e0 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  ** Either way, c
194f0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
19500 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
19510 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64   has such an ind
19520 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f  ex. If.    ** so
19530 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63  , don't bother c
19540 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65  reating this one
19550 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c  . This only appl
19560 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75  ies to.    ** au
19570 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61  tomatically crea
19580 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65  ted indices. Use
19590 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65  rs can do as the
195a0 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20  y wish with.    
195b0 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69  ** explicit indi
195c0 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ces..    **.    
195d0 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72  ** Two UNIQUE or
195e0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
195f0 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e  straints are con
19600 73 69 64 65 72 65 64 20 65 71 75 69 76 61 6c 65  sidered equivale
19610 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74  nt.    ** (and t
19620 68 75 73 20 73 75 70 70 72 65 73 73 69 6e 67 20  hus suppressing 
19630 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20  the second one) 
19640 65 76 65 6e 20 69 66 20 74 68 65 79 20 68 61 76  even if they hav
19650 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20  e different.    
19660 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a  ** sort orders..
19670 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
19680 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65   there are diffe
19690 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  rent collating s
196a0 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74  equences or if t
196b0 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  he columns of.  
196c0 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61    ** the constra
196d0 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66  int occur in dif
196e0 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74  ferent orders, t
196f0 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69  hen the constrai
19700 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63  nts are.    ** c
19710 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74 69 6e  onsidered distin
19720 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75  ct and both resu
19730 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65 20 69  lt in separate i
19740 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  ndices..    */. 
19750 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
19760 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
19770 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
19780 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
19790 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b  t){.      int k;
197a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49  .      assert( I
197b0 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
197c0 78 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  x) );.      asse
197d0 72 74 28 20 70 49 64 78 2d 3e 69 64 78 54 79 70  rt( pIdx->idxTyp
197e0 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e!=SQLITE_IDXTYP
197f0 45 5f 41 50 50 44 45 46 20 29 3b 0a 20 20 20 20  E_APPDEF );.    
19800 20 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71    assert( IsUniq
19810 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20  ueIndex(pIndex) 
19820 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49  );..      if( pI
19830 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e  dx->nKeyCol!=pIn
19840 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63  dex->nKeyCol ) c
19850 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
19860 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e  or(k=0; k<pIdx->
19870 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20  nKeyCol; k++){. 
19880 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
19890 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20 63  r *z1;.        c
198a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20  onst char *z2;. 
198b0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
198c0 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49  >aiColumn[k]!=pI
198d0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  ndex->aiColumn[k
198e0 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
198f0 20 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a     z1 = pIdx->az
19900 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  Coll[k];.       
19910 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a   z2 = pIndex->az
19920 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  Coll[k];.       
19930 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26 20 73   if( z1!=z2 && s
19940 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
19950 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20  , z2) ) break;. 
19960 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19970 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   k==pIdx->nKeyCo
19980 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  l ){.        if(
19990 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
199a0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
199b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
199c0 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  This constraint 
199d0 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65  creates the same
199e0 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76   index as a prev
199f0 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
19a00 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65  * constraint spe
19a10 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65  cified somewhere
19a20 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
19a30 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
19a40 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77            ** How
19a50 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46  ever the ON CONF
19a60 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65  LICT clauses are
19a70 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62   different. If b
19a80 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20  oth this .      
19a90 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
19aa0 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f  t and the previo
19ab0 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  us equivalent co
19ac0 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78  nstraint have ex
19ad0 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20  plicit.         
19ae0 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   ** ON CONFLICT 
19af0 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20  clauses this is 
19b00 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77  an error. Otherw
19b10 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20  ise, use the.   
19b20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63         ** explic
19b30 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62  itly specified b
19b40 65 68 61 76 69 6f 72 20 66 6f 72 20 74 68 65 20  ehavior for the 
19b50 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20  index..         
19b60 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
19b70 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  ( !(pIdx->onErro
19b80 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c  r==OE_Default ||
19b90 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
19ba0 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b  ==OE_Default) ){
19bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
19bc0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
19bd0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
19be0 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69        "conflicti
19bf0 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63  ng ON CONFLICT c
19c00 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65 64  lauses specified
19c10 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  ", 0);.         
19c20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
19c30 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d   pIdx->onError==
19c40 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  OE_Default ){.  
19c50 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
19c60 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78  onError = pIndex
19c70 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20  ->onError;.     
19c80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
19c90 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
19ca0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19cc0 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68   }..  /* Link th
19cd0 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75  e new Index stru
19ce0 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 62  cture to its tab
19cf0 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74  le and to the ot
19d00 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f  her.  ** in-memo
19d10 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72 75  ry database stru
19d20 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20  ctures. .  */.  
19d30 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
19d40 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  y ){.    Index *
19d50 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  p;.    assert( s
19d60 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
19d70 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e  xHeld(db, 0, pIn
19d80 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  dex->pSchema) );
19d90 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
19da0 48 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64  HashInsert(&pInd
19db0 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  ex->pSchema->idx
19dc0 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20  Hash, .         
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19de0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
19df0 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  pIndex);.    if(
19e00 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65   p ){.      asse
19e10 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b  rt( p==pIndex );
19e20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
19e30 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
19e40 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
19e50 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
19e60 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19e70 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
19e80 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
19e90 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
19ea0 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70  anges;.    if( p
19eb0 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  TblName!=0 ){.  
19ec0 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
19ed0 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
19ee0 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  num;.    }.  }..
19ef0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
19f00 74 68 65 20 69 6e 69 74 69 61 6c 20 43 52 45 41  the initial CREA
19f10 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
19f20 6e 74 20 28 6f 72 20 43 52 45 41 54 45 20 54 41  nt (or CREATE TA
19f30 42 4c 45 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  BLE if the.  ** 
19f40 69 6e 64 65 78 20 69 73 20 61 6e 20 69 6d 70 6c  index is an impl
19f50 69 65 64 20 69 6e 64 65 78 20 66 6f 72 20 61 20  ied index for a 
19f60 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52  UNIQUE or PRIMAR
19f70 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
19f80 29 20 74 68 65 6e 0a 20 20 2a 2a 20 65 6d 69 74  ) then.  ** emit
19f90 20 63 6f 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74   code to allocat
19fa0 65 20 74 68 65 20 69 6e 64 65 78 20 72 6f 6f 74  e the index root
19fb0 70 61 67 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64  page on disk and
19fc0 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66   make an entry f
19fd0 6f 72 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  or.  ** the inde
19fe0 78 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  x in the sqlite_
19ff0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
1a000 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 69 6e   populate the in
1a010 64 65 78 20 77 69 74 68 0a 20 20 2a 2a 20 63 6f  dex with.  ** co
1a020 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20  ntent.  But, do 
1a030 6e 6f 74 20 64 6f 20 74 68 69 73 20 69 66 20 77  not do this if w
1a040 65 20 61 72 65 20 73 69 6d 70 6c 79 20 72 65 61  e are simply rea
1a050 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
1a060 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c  master.  ** tabl
1a070 65 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 73  e to parse the s
1a080 63 68 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69  chema, or if thi
1a090 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 50  s index is the P
1a0a0 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
1a0b0 0a 20 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f  .  ** of a WITHO
1a0c0 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a  UT ROWID table..
1a0d0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62    **.  ** If pTb
1a0e0 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  lName==0 it mean
1a0f0 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  s this index is 
1a100 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 6e 20  generated as an 
1a110 69 6d 70 6c 69 65 64 20 50 52 49 4d 41 52 59 20  implied PRIMARY 
1a120 4b 45 59 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51  KEY.  ** or UNIQ
1a130 55 45 20 69 6e 64 65 78 20 69 6e 20 61 20 43 52  UE index in a CR
1a140 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
1a150 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
1a160 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
1a170 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
1a180 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
1a190 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
1a1a0 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
1a1b0 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
1a1c0 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
1a1d0 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 50  */.  else if( pP
1a1e0 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26  arse->nErr==0 &&
1a1f0 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   (HasRowid(pTab)
1a200 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30 29   || pTblName!=0)
1a210 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   ){.    Vdbe *v;
1a220 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  .    char *zStmt
1a230 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d  ;.    int iMem =
1a240 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
1a250 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
1a260 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1a270 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
1a280 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
1a290 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f  e_index;...    /
1a2a0 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f  * Create the roo
1a2b0 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e  tpage for the in
1a2c0 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  dex.    */.    s
1a2d0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1a2e0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
1a2f0 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
1a300 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1a310 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  (v, OP_CreateInd
1a320 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a  ex, iDb, iMem);.
1a330 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74  .    /* Gather t
1a340 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
1a350 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49   of the CREATE I
1a360 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69  NDEX statement i
1a370 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a  nto.    ** the z
1a380 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20  Stmt variable.  
1a390 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
1a3a0 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  art ){.      int
1a3b0 20 6e 20 3d 20 28 69 6e 74 29 28 70 50 61 72 73   n = (int)(pPars
1a3c0 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20  e->sLastToken.z 
1a3d0 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50  - pName->z) + pP
1a3e0 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
1a3f0 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  .n;.      if( pN
1a400 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27  ame->z[n-1]==';'
1a410 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a   ) n--;.      /*
1a420 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77   A named index w
1a430 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20  ith an explicit 
1a440 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
1a450 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  tement */.      
1a460 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
1a470 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41  Printf(db, "CREA
1a480 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22  TE%s INDEX %.*s"
1a490 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f  ,.        onErro
1a4a0 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20  r==OE_None ? "" 
1a4b0 3a 20 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20  : " UNIQUE", n, 
1a4c0 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d  pName->z);.    }
1a4d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
1a4e0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
1a4f0 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50  x created by a P
1a500 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
1a510 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
1a520 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d  */.      /* zStm
1a530 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
1a540 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20  tf(""); */.     
1a550 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   zStmt = 0;.    
1a560 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e  }..    /* Add an
1a570 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65   entry in sqlite
1a580 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73  _master for this
1a590 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20   index.    */.  
1a5a0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
1a5b0 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
1a5c0 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
1a5d0 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28  TO %Q.%s VALUES(
1a5e0 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25  'index',%Q,%Q,#%
1a5f0 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20  d,%Q);",.       
1a600 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
1a610 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
1a620 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20  E(iDb),.        
1a630 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20  pIndex->zName,. 
1a640 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
1a650 6d 65 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d  me,.        iMem
1a660 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a  ,.        zStmt.
1a670 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
1a680 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74  e3DbFree(db, zSt
1a690 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c  mt);..    /* Fil
1a6a0 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  l the index with
1a6b0 20 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73   data and repars
1a6c0 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f  e the schema. Co
1a6d0 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a  de an OP_Expire.
1a6e0 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69      ** to invali
1a6f0 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d  date all pre-com
1a700 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
1a710 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1a720 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20   pTblName ){.   
1a730 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
1a740 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
1a750 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  ndex, iMem);.   
1a760 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
1a770 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
1a780 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
1a790 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63  e3VdbeAddParseSc
1a7a0 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20  hemaOp(v, iDb,. 
1a7b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
1a7c0 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65  Printf(db, "name
1a7d0 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27  ='%q' AND type='
1a7e0 69 6e 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d  index'", pIndex-
1a7f0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
1a800 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a810 31 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20  1(v, OP_Expire, 
1a820 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
1a830 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20   /* When adding 
1a840 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  an index to the 
1a850 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20  list of indices 
1a860 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b  for a table, mak
1a870 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20  e.  ** sure all 
1a880 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20  indices labeled 
1a890 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20  OE_Replace come 
1a8a0 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20  after all those 
1a8b0 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f  labeled.  ** OE_
1a8c0 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73  Ignore.  This is
1a8d0 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74   necessary for t
1a8e0 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74  he correct const
1a8f0 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a  raint check.  **
1a900 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20   processing (in 
1a910 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43  sqlite3GenerateC
1a920 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28  onstraintChecks(
1a930 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20  )) as part of.  
1a940 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e  ** UPDATE and IN
1a950 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  SERT statements.
1a960 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62    .  */.  if( db
1a970 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70  ->init.busy || p
1a980 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TblName==0 ){.  
1a990 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f    if( onError!=O
1a9a0 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61  E_Replace || pTa
1a9b0 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  b->pIndex==0.   
1a9c0 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70        || pTab->p
1a9d0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
1a9e0 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20  OE_Replace){.   
1a9f0 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
1aa00 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
1aa10 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e  .      pTab->pIn
1aa20 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
1aa30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
1aa40 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
1aa50 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
1aa60 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72     while( pOther
1aa70 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65  ->pNext && pOthe
1aa80 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f  r->pNext->onErro
1aa90 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r!=OE_Replace ){
1aaa0 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20  .        pOther 
1aab0 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
1aac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1aad0 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
1aae0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
1aaf0 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78      pOther->pNex
1ab00 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  t = pIndex;.    
1ab10 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 70 49 6e  }.    pRet = pIn
1ab20 64 65 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20  dex;.    pIndex 
1ab30 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
1ab40 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65  lean up before e
1ab50 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63  xiting */.exit_c
1ab60 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69  reate_index:.  i
1ab70 66 28 20 70 49 6e 64 65 78 20 29 20 66 72 65 65  f( pIndex ) free
1ab80 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
1ab90 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1aba0 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68  Delete(db, pPIWh
1abb0 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ere);.  sqlite3E
1abc0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
1abd0 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  , pList);.  sqli
1abe0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1abf0 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  (db, pTblName);.
1ac00 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1ac10 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  db, zName);.  re
1ac20 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
1ac30 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64  .** Fill the Ind
1ac40 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72  ex.aiRowEst[] ar
1ac50 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74  ray with default
1ac60 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69   information - i
1ac70 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f  nformation.** to
1ac80 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65   be used when we
1ac90 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68   have not run th
1aca0 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e  e ANALYZE comman
1acb0 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73  d..**.** aiRowEs
1acc0 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 64  t[0] is supposed
1acd0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1ace0 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  number of elemen
1acf0 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e  ts in the index.
1ad00 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20  .** Since we do 
1ad10 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20  not know, guess 
1ad20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f  1 million.  aiRo
1ad30 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73  wEst[1] is an es
1ad40 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a  timate of the.**
1ad50 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1ad60 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  in the table tha
1ad70 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
1ad80 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20  icular value of 
1ad90 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c  the.** first col
1ada0 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
1adb0 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69  .  aiRowEst[2] i
1adc0 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
1add0 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
1ade0 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63  f rows that matc
1adf0 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
1ae00 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
1ae10 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75  the first 2 colu
1ae20 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e  mns.** of the in
1ae30 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  dex.  And so for
1ae40 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77  th.  It must alw
1ae50 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20  ays be the case 
1ae60 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20  that.*.**       
1ae70 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c      aiRowEst[N]<
1ae80 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a  =aiRowEst[N-1].*
1ae90 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
1aea0 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a  wEst[N]>=1.**.**
1aeb0 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74   Apart from that
1aec0 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65  , we have little
1aed0 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65   to go on beside
1aee0 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74  s intuition as t
1aef0 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73  o.** how aiRowEs
1af00 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  t[] should be in
1af10 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20  itialized.  The 
1af20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65  numbers generate
1af30 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61  d here.** are ba
1af40 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76  sed on typical v
1af50 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61  alues found in a
1af60 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a  ctual indices..*
1af70 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
1af80 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65  faultRowEst(Inde
1af90 78 20 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20  x *pIdx){.  /*  
1afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 30                10
1afb0 2c 20 20 39 2c 20 20 38 2c 20 20 37 2c 20 20 36  ,  9,  8,  7,  6
1afc0 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56 61   */.  LogEst aVa
1afd0 6c 5b 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20  l[] = { 33, 32, 
1afe0 33 30 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20  30, 28, 26 };.  
1aff0 4c 6f 67 45 73 74 20 2a 61 20 3d 20 70 49 64 78  LogEst *a = pIdx
1b000 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20  ->aiRowLogEst;. 
1b010 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e   int nCopy = MIN
1b020 28 41 72 72 61 79 53 69 7a 65 28 61 56 61 6c 29  (ArraySize(aVal)
1b030 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29  , pIdx->nKeyCol)
1b040 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
1b050 20 53 65 74 20 74 68 65 20 66 69 72 73 74 20 65   Set the first e
1b060 6e 74 72 79 20 28 6e 75 6d 62 65 72 20 6f 66 20  ntry (number of 
1b070 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64 65  rows in the inde
1b080 78 29 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  x) to the estima
1b090 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  ted .  ** number
1b0a0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1b0b0 74 61 62 6c 65 2e 20 4f 72 20 31 30 2c 20 69 66  table. Or 10, if
1b0c0 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e   the estimated n
1b0d0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 20  umber of rows . 
1b0e0 20 2a 2a 20 69 6e 20 74 68 65 20 74 61 62 6c 65   ** in the table
1b0f0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68   is less than th
1b100 61 74 2e 20 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d  at.  */.  a[0] =
1b110 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e   pIdx->pTable->n
1b120 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28  RowLogEst;.  if(
1b130 20 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20   a[0]<33 ) a[0] 
1b140 3d 20 33 33 3b 20 20 20 20 20 20 20 20 61 73 73  = 33;        ass
1b150 65 72 74 28 20 33 33 3d 3d 73 71 6c 69 74 65 33  ert( 33==sqlite3
1b160 4c 6f 67 45 73 74 28 31 30 29 20 29 3b 0a 0a 20  LogEst(10) );.. 
1b170 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 61   /* Estimate tha
1b180 74 20 61 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b  t a[1] is 10, a[
1b190 32 5d 20 69 73 20 39 2c 20 61 5b 33 5d 20 69 73  2] is 9, a[3] is
1b1a0 20 38 2c 20 61 5b 34 5d 20 69 73 20 37 2c 20 61   8, a[4] is 7, a
1b1b0 5b 35 5d 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e  [5] is.  ** 6 an
1b1c0 64 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  d each subsequen
1b1d0 74 20 76 61 6c 75 65 20 28 69 66 20 61 6e 79 29  t value (if any)
1b1e0 20 69 73 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d   is 5.  */.  mem
1b1f0 63 70 79 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c  cpy(&a[1], aVal,
1b200 20 6e 43 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f   nCopy*sizeof(Lo
1b210 67 45 73 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d  gEst));.  for(i=
1b220 6e 43 6f 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78  nCopy+1; i<=pIdx
1b230 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nKeyCol; i++){
1b240 0a 20 20 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20  .    a[i] = 23; 
1b250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b260 20 20 20 61 73 73 65 72 74 28 20 32 33 3d 3d 73     assert( 23==s
1b270 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 35 29 20  qlite3LogEst(5) 
1b280 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
1b290 28 20 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45  ( 0==sqlite3LogE
1b2a0 73 74 28 31 29 20 29 3b 0a 20 20 69 66 28 20 49  st(1) );.  if( I
1b2b0 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
1b2c0 78 29 20 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65  x) ) a[pIdx->nKe
1b2d0 79 43 6f 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  yCol] = 0;.}../*
1b2e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1b2f0 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78   will drop an ex
1b300 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64  isting named ind
1b310 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ex.  This routin
1b320 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20  e.** implements 
1b330 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73  the DROP INDEX s
1b340 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
1b350 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64  d sqlite3DropInd
1b360 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
1b370 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
1b380 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b  , int ifExists){
1b390 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1b3a0 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
1b3b0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1b3c0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
1b3d0 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Db;..  assert( p
1b3e0 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
1b3f0 3b 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c  ;   /* Never cal
1b400 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72 20 65  led with prior e
1b410 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20 64  rrors */.  if( d
1b420 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1b430 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
1b440 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
1b450 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
1b460 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69  ->nSrc==1 );.  i
1b470 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
1b480 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
1b490 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67  pParse) ){.    g
1b4a0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1b4b0 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65  dex;.  }.  pInde
1b4c0 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  x = sqlite3FindI
1b4d0 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e  ndex(db, pName->
1b4e0 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  a[0].zName, pNam
1b4f0 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
1b500 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  e);.  if( pIndex
1b510 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ==0 ){.    if( !
1b520 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20  ifExists ){.    
1b530 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1b540 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
1b550 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70  ch index: %S", p
1b560 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65  Name, 0);.    }e
1b570 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
1b580 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
1b590 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  dSchema(pParse, 
1b5a0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
1b5b0 61 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  abase);.    }.  
1b5c0 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
1b5d0 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67  chema = 1;.    g
1b5e0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1b5f0 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  dex;.  }.  if( p
1b600 49 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 21 3d  Index->idxType!=
1b610 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41  SQLITE_IDXTYPE_A
1b620 50 50 44 45 46 20 29 7b 0a 20 20 20 20 73 71 6c  PPDEF ){.    sql
1b630 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1b640 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f  rse, "index asso
1b650 63 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51  ciated with UNIQ
1b660 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50  UE ".      "or P
1b670 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
1b680 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  raint cannot be 
1b690 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20  dropped", 0);.  
1b6a0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1b6b0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44  _index;.  }.  iD
1b6c0 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
1b6d0 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
1b6e0 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23  dex->pSchema);.#
1b6f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b700 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
1b710 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
1b720 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
1b730 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65  INDEX;.    Table
1b740 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
1b750 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e  >pTable;.    con
1b760 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64  st char *zDb = d
1b770 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
1b780 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
1b790 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
1b7a0 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
1b7b0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1b7c0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1b7d0 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
1b7e0 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  b, 0, zDb) ){.  
1b7f0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1b800 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
1b810 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
1b820 4d 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f  MPDB && iDb ) co
1b830 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
1b840 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _TEMP_INDEX;.   
1b850 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1b860 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
1b870 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  de, pIndex->zNam
1b880 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
1b890 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
1b8a0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1b8b0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
1b8c0 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ndif..  /* Gener
1b8d0 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f  ate code to remo
1b8e0 76 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  ve the index and
1b8f0 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
1b900 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20   table */.  v = 
1b910 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1b920 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
1b930 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
1b940 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1b950 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
1b960 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  );.    sqlite3Ne
1b970 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
1b980 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  ,.       "DELETE
1b990 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52   FROM %Q.%s WHER
1b9a0 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79  E name=%Q AND ty
1b9b0 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20  pe='index'",.   
1b9c0 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
1b9d0 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
1b9e0 41 42 4c 45 28 69 44 62 29 2c 20 70 49 6e 64 65  ABLE(iDb), pInde
1b9f0 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  x->zName.    );.
1ba00 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72      sqlite3Clear
1ba10 53 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73  StatTables(pPars
1ba20 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c 20 70  e, iDb, "idx", p
1ba30 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Index->zName);. 
1ba40 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
1ba50 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
1ba60 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79  Db);.    destroy
1ba70 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
1ba80 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69   pIndex->tnum, i
1ba90 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
1baa0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1bab0 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c  _DropIndex, iDb,
1bac0 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a   0, 0, pIndex->z
1bad0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65  Name, 0);.  }..e
1bae0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a  xit_drop_index:.
1baf0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1bb00 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65  Delete(db, pName
1bb10 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72  );.}../*.** pArr
1bb20 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ay is a pointer 
1bb30 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f  to an array of o
1bb40 62 6a 65 63 74 73 2e 20 45 61 63 68 20 6f 62 6a  bjects. Each obj
1bb50 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72  ect in the.** ar
1bb60 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62  ray is szEntry b
1bb70 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68  ytes in size. Th
1bb80 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65 73 20  is routine uses 
1bb90 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1bba0 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20  ().** to extend 
1bbb0 74 68 65 20 61 72 72 61 79 20 73 6f 20 74 68 61  the array so tha
1bbc0 74 20 74 68 65 72 65 20 69 73 20 73 70 61 63 65  t there is space
1bbd0 20 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65 63   for a new objec
1bbe0 74 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a  t at the end..**
1bbf0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
1bc00 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1bc10 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61  , *pnEntry conta
1bc20 69 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  ins the current 
1bc30 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61  size of.** the a
1bc40 72 72 61 79 20 28 69 6e 20 65 6e 74 72 69 65 73  rray (in entries
1bc50 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61   - so the alloca
1bc60 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74  tion is ((*pnEnt
1bc70 72 79 29 20 2a 20 73 7a 45 6e 74 72 79 29 20 62  ry) * szEntry) b
1bc80 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c  ytes.** in total
1bc90 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
1bca0 72 65 61 6c 6c 6f 63 28 29 20 69 73 20 73 75 63  realloc() is suc
1bcb0 63 65 73 73 66 75 6c 20 28 69 2e 65 2e 20 69 66  cessful (i.e. if
1bcc0 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f   no OOM conditio
1bcd0 6e 20 6f 63 63 75 72 73 29 2c 20 74 68 65 0a 2a  n occurs), the.*
1bce0 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * space allocate
1bcf0 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6f 62  d for the new ob
1bd00 6a 65 63 74 20 69 73 20 7a 65 72 6f 65 64 2c 20  ject is zeroed, 
1bd10 2a 70 6e 45 6e 74 72 79 20 75 70 64 61 74 65 64  *pnEntry updated
1bd20 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74   to.** reflect t
1bd30 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74  he new size of t
1bd40 68 65 20 61 72 72 61 79 20 61 6e 64 20 61 20 70  he array and a p
1bd50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
1bd60 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20  w allocation.** 
1bd70 72 65 74 75 72 6e 65 64 2e 20 2a 70 49 64 78 20  returned. *pIdx 
1bd80 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  is set to the in
1bd90 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 61  dex of the new a
1bda0 72 72 61 79 20 65 6e 74 72 79 20 69 6e 20 74 68  rray entry in th
1bdb0 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f  is case..**.** O
1bdc0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1bdd0 20 72 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73   realloc() fails
1bde0 2c 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74  , *pIdx is set t
1bdf0 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72  o -1, *pnEntry r
1be00 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e  emains.** unchan
1be10 67 65 64 20 61 6e 64 20 61 20 63 6f 70 79 20 6f  ged and a copy o
1be20 66 20 70 41 72 72 61 79 20 72 65 74 75 72 6e 65  f pArray returne
1be30 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  d..*/.void *sqli
1be40 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
1be50 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1be60 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
1be70 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
1be80 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73   malloc failures
1be90 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72   */.  void *pArr
1bea0 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79  ay,     /* Array
1beb0 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69   of objects.  Mi
1bec0 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74  ght be reallocat
1bed0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e  ed */.  int szEn
1bee0 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a  try,      /* Siz
1bef0 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74  e of each object
1bf00 20 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f   in the array */
1bf10 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c  .  int *pnEntry,
1bf20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1bf30 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e  f objects curren
1bf40 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20  tly in use */.  
1bf50 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20  int *pIdx       
1bf60 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69    /* Write the i
1bf70 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c  ndex of a new sl
1bf80 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ot here */.){.  
1bf90 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e  char *z;.  int n
1bfa0 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69   = *pnEntry;.  i
1bfb0 66 28 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d  f( (n & (n-1))==
1bfc0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20  0 ){.    int sz 
1bfd0 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32  = (n==0) ? 1 : 2
1bfe0 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e  *n;.    void *pN
1bff0 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
1c000 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79  alloc(db, pArray
1c010 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20  , sz*szEntry);. 
1c020 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1c030 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20  {.      *pIdx = 
1c040 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
1c050 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20   pArray;.    }. 
1c060 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77     pArray = pNew
1c070 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61  ;.  }.  z = (cha
1c080 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d  r*)pArray;.  mem
1c090 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74  set(&z[n * szEnt
1c0a0 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29  ry], 0, szEntry)
1c0b0 3b 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20  ;.  *pIdx = n;. 
1c0c0 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72   ++*pnEntry;.  r
1c0d0 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a  eturn pArray;.}.
1c0e0 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
1c0f0 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
1c100 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e  he given IdList.
1c110 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49    Create a new I
1c120 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  dList if.** need
1c130 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77   be..**.** A new
1c140 20 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72   IdList is retur
1c150 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
1c160 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
1c170 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  */.IdList *sqlit
1c180 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73  e3IdListAppend(s
1c190 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69  qlite3 *db, IdLi
1c1a0 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e  st *pList, Token
1c1b0 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74   *pToken){.  int
1c1c0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1c1d0 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
1c1e0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1c1f0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
1c200 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  (IdList) );.    
1c210 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1c220 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1c230 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65  List->a = sqlite
1c240 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
1c250 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20        db,.      
1c260 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20  pList->a,.      
1c270 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
1c280 30 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c 69 73  0]),.      &pLis
1c290 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 69  t->nId,.      &i
1c2a0 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20  .  );.  if( i<0 
1c2b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  ){.    sqlite3Id
1c2c0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1c2d0 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72  List);.    retur
1c2e0 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
1c2f0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73  ->a[i].zName = s
1c300 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1c310 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
1c320 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
1c330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
1c340 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76   an IdList..*/.v
1c350 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73  oid sqlite3IdLis
1c360 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
1c370 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69  *db, IdList *pLi
1c380 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
1c390 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1c3a0 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
1c3b0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20  ; i<pList->nId; 
1c3c0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1c3d0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1c3e0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
1c3f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
1c400 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
1c410 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1c420 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  ee(db, pList);.}
1c430 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1c440 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73  he index in pLis
1c450 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66  t of the identif
1c460 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20  ier named zId.  
1c470 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20  Return -1.** if 
1c480 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e  not found..*/.in
1c490 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49  t sqlite3IdListI
1c4a0 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69  ndex(IdList *pLi
1c4b0 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
1c4c0 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  zName){.  int i;
1c4d0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1c4e0 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66  ) return -1;.  f
1c4f0 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1c500 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
1c510 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1c520 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
1c530 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  Name, zName)==0 
1c540 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a  ) return i;.  }.
1c550 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
1c560 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65  /*.** Expand the
1c570 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
1c580 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53   for the given S
1c590 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79  rcList object by
1c5a0 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78  .** creating nEx
1c5b0 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65  tra new slots be
1c5c0 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72  ginning at iStar
1c5d0 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65  t.  iStart is ze
1c5e0 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77  ro based..** New
1c5f0 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65   slots are zeroe
1c600 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  d..**.** For exa
1c610 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20  mple, suppose a 
1c620 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c  SrcList initiall
1c630 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65  y contains two e
1c640 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20  ntries: A,B..** 
1c650 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20  To append 3 new 
1c660 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65  entries onto the
1c670 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a   end, do this:.*
1c680 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53  *.**    sqlite3S
1c690 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
1c6a0 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32  , pSrclist, 3, 2
1c6b0 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  );.**.** After t
1c6c0 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74  he call above it
1c6d0 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20   would contain: 
1c6e0 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c   A, B, nil, nil,
1c6f0 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20   nil..** If the 
1c700 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20  iStart argument 
1c710 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65  had been 1 inste
1c720 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68  ad of 2, then th
1c730 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c  e result.** woul
1c740 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c  d have been:  A,
1c750 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20   nil, nil, nil, 
1c760 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74  B.  To prepend t
1c770 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a  he new slots,.**
1c780 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75   the iStart valu
1c790 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54  e would be 0.  T
1c7a0 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77  he result then w
1c7b0 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c  ould.** be: nil,
1c7c0 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e   nil, nil, A, B.
1c7d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
1c7e0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
1c7f0 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20  ils the SrcList 
1c800 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54  is unchanged.  T
1c810 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63  he.** db->malloc
1c820 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c  Failed flag will
1c830 20 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e   be set to true.
1c840 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  .*/.SrcList *sql
1c850 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
1c860 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ge(.  sqlite3 *d
1c870 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
1c880 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1c890 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d  to notify of OOM
1c8a0 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63   errors */.  Src
1c8b0 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20  List *pSrc,     
1c8c0 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74  /* The SrcList t
1c8d0 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f  o be enlarged */
1c8e0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20  .  int nExtra,  
1c8f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c900 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20  of new slots to 
1c910 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d  add to pSrc->a[]
1c920 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74   */.  int iStart
1c930 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1c940 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f  x in pSrc->a[] o
1c950 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74  f first new slot
1c960 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
1c970 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
1c980 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67  cking on calling
1c990 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
1c9a0 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e   assert( iStart>
1c9b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1c9c0 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61  nExtra>=1 );.  a
1c9d0 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29  ssert( pSrc!=0 )
1c9e0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
1c9f0 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29  rt<=pSrc->nSrc )
1ca00 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
1ca10 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63   additional spac
1ca20 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  e if needed */. 
1ca30 20 69 66 28 20 28 75 33 32 29 70 53 72 63 2d 3e   if( (u32)pSrc->
1ca40 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63  nSrc+nExtra>pSrc
1ca50 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
1ca60 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
1ca70 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
1ca80 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72  pSrc->nSrc+nExtr
1ca90 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b  a;.    int nGot;
1caa0 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
1cab0 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
1cac0 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20   pSrc,.         
1cad0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53        sizeof(*pS
1cae0 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29  rc) + (nAlloc-1)
1caf0 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  *sizeof(pSrc->a[
1cb00 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  0]) );.    if( p
1cb10 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1cb20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
1cb30 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1cb40 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20    return pSrc;. 
1cb50 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20     }.    pSrc = 
1cb60 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d  pNew;.    nGot =
1cb70 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f   (sqlite3DbMallo
1cb80 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20  cSize(db, pNew) 
1cb90 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29  - sizeof(*pSrc))
1cba0 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b  /sizeof(pSrc->a[
1cbb0 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d  0])+1;.    pSrc-
1cbc0 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a  >nAlloc = nGot;.
1cbd0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65    }..  /* Move e
1cbe0 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68  xisting slots th
1cbf0 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68  at come after th
1cc00 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64  e newly inserted
1cc10 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20   slots.  ** out 
1cc20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20  of the way */.  
1cc30 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63  for(i=pSrc->nSrc
1cc40 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69  -1; i>=iStart; i
1cc50 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61  --){.    pSrc->a
1cc60 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72  [i+nExtra] = pSr
1cc70 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70  c->a[i];.  }.  p
1cc80 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78  Src->nSrc += nEx
1cc90 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20  tra;..  /* Zero 
1cca0 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61  the newly alloca
1ccb0 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d  ted slots */.  m
1ccc0 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69  emset(&pSrc->a[i
1ccd0 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f  Start], 0, sizeo
1cce0 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45  f(pSrc->a[0])*nE
1ccf0 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69  xtra);.  for(i=i
1cd00 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b  Start; i<iStart+
1cd10 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20  nExtra; i++){.  
1cd20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75    pSrc->a[i].iCu
1cd30 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  rsor = -1;.  }..
1cd40 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f    /* Return a po
1cd50 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c  inter to the enl
1cd60 61 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f  arged SrcList */
1cd70 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a  .  return pSrc;.
1cd80 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  }.../*.** Append
1cd90 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
1cda0 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
1cdb0 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
1cdc0 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
1cdd0 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
1cde0 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
1cdf0 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
1ce00 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 61 62  ist even if pTab
1ce10 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  le is NULL..**.*
1ce20 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73 20 72  * A SrcList is r
1ce30 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
1ce40 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
1ce50 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20  OOM error.  The 
1ce60 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c  returned.** SrcL
1ce70 69 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ist might be the
1ce80 20 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63   same as the Src
1ce90 4c 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e  List that was in
1cea0 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20  put or it might 
1ceb0 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e  be.** a new one.
1cec0 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f    If an OOM erro
1ced0 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74  r does occurs, t
1cee0 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61  hen the prior va
1cef0 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20  lue of pList.** 
1cf00 74 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f  that is input to
1cf10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1cf20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66   automatically f
1cf30 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  reed..**.** If p
1cf40 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  Database is not 
1cf50 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  null, it means t
1cf60 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61  hat the table ha
1cf70 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a  s an optional.**
1cf80 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70   database name p
1cf90 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69  refix.  Like thi
1cfa0 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61  s:  "database.ta
1cfb0 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61  ble".  The pData
1cfc0 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  base.** points t
1cfd0 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  o the table name
1cfe0 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20   and the pTable 
1cff0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61  points to the da
1d000 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20  tabase name..** 
1d010 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  The SrcList.a[].
1d020 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66  zName field is f
1d030 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  illed with the t
1d040 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20  able name which 
1d050 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72  might.** come fr
1d060 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44  om pTable (if pD
1d070 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29  atabase is NULL)
1d080 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61   or from pDataba
1d090 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74  se.  .** SrcList
1d0a0 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69  .a[].zDatabase i
1d0b0 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
1d0c0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
1d0d0 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20  from pTable,.** 
1d0e0 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20  or with NULL if 
1d0f0 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73  no database is s
1d100 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
1d110 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1d120 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69  if call like thi
1d130 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1d140 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1d150 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a  ppend(D,A,B,0);.
1d160 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
1d170 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
1d180 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1d190 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
1d1a0 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
1d1b0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1d1c0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
1d1d0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
1d1e0 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54  ,A,B,C);.**.** T
1d1f0 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62  hen C is the tab
1d200 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73  le name and B is
1d210 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1d220 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64 65 66  me.  If C is def
1d230 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20  ined.** then so 
1d240 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65 72 20  is B.  In other 
1d250 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65 72 20  words, we never 
1d260 68 61 76 65 20 61 20 63 61 73 65 20 77 68 65 72  have a case wher
1d270 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
1d280 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1d290 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a  ppend(D,A,0,C);.
1d2a0 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c  **.** Both pTabl
1d2b0 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 20  e and pDatabase 
1d2c0 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f 20 62  are assumed to b
1d2d0 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65 79 20  e quoted.  They 
1d2e0 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20  are dequoted.** 
1d2f0 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61 64 64  before being add
1d300 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73  ed to the SrcLis
1d310 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  t..*/.SrcList *s
1d320 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1d330 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  end(.  sqlite3 *
1d340 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  db,        /* Co
1d350 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
1d360 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69  fy of malloc fai
1d370 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69  lures */.  SrcLi
1d380 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
1d390 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73  * Append to this
1d3a0 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63   SrcList. NULL c
1d3b0 72 65 61 74 65 73 20 61 20 6e 65 77 20 53 72 63  reates a new Src
1d3c0 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  List */.  Token 
1d3d0 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a  *pTable,      /*
1d3e0 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e 64   Table to append
1d3f0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
1d400 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61 74  tabase    /* Dat
1d410 61 62 61 73 65 20 6f 66 20 74 68 65 20 74 61 62  abase of the tab
1d420 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  le */.){.  struc
1d430 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1d440 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28  pItem;.  assert(
1d450 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c   pDatabase==0 ||
1d460 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f   pTable!=0 );  /
1d470 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20 43 20  * Cannot have C 
1d480 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20 20 69  without B */.  i
1d490 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
1d4a0 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
1d4b0 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
1d4c0 62 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73  b, sizeof(SrcLis
1d4d0 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
1d4e0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
1d4f0 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41  0;.    pList->nA
1d500 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  lloc = 1;.  }.  
1d510 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 53  pList = sqlite3S
1d520 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62  rcListEnlarge(db
1d530 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73  , pList, 1, pLis
1d540 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 69 66 28 20  t->nSrc);.  if( 
1d550 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1d560 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
1d570 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
1d580 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74   pList);.    ret
1d590 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 49 74  urn 0;.  }.  pIt
1d5a0 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
1d5b0 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  List->nSrc-1];. 
1d5c0 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26   if( pDatabase &
1d5d0 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d  & pDatabase->z==
1d5e0 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61  0 ){.    pDataba
1d5f0 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  se = 0;.  }.  if
1d600 28 20 70 44 61 74 61 62 61 73 65 20 29 7b 0a 20  ( pDatabase ){. 
1d610 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20     Token *pTemp 
1d620 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20 20  = pDatabase;.   
1d630 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54 61   pDatabase = pTa
1d640 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65 20  ble;.    pTable 
1d650 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70  = pTemp;.  }.  p
1d660 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
1d670 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1d680 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  en(db, pTable);.
1d690 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61    pItem->zDataba
1d6a0 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  se = sqlite3Name
1d6b0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44  FromToken(db, pD
1d6c0 61 74 61 62 61 73 65 29 3b 0a 20 20 72 65 74 75  atabase);.  retu
1d6d0 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
1d6e0 2a 2a 20 41 73 73 69 67 6e 20 56 64 62 65 43 75  ** Assign VdbeCu
1d6f0 72 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62 65  rsor index numbe
1d700 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73  rs to all tables
1d710 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f   in a SrcList.*/
1d720 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1d730 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
1d740 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
1d750 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
1d760 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
1d770 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1d780 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72   *pItem;.  asser
1d790 74 28 70 4c 69 73 74 20 7c 7c 20 70 50 61 72 73  t(pList || pPars
1d7a0 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
1d7b0 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c 69  led );.  if( pLi
1d7c0 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
1d7d0 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  0, pItem=pList->
1d7e0 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  a; i<pList->nSrc
1d7f0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1d800 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
1d810 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20 62  ->iCursor>=0 ) b
1d820 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74 65  reak;.      pIte
1d830 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50 61  m->iCursor = pPa
1d840 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
1d850 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
1d860 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
1d870 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1d880 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
1d890 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  rse, pItem->pSel
1d8a0 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20  ect->pSrc);.    
1d8b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
1d8c0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
1d8d0 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74 20   entire SrcList 
1d8e0 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74  including all it
1d8f0 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e 0a  s substructure..
1d900 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1d910 72 63 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c  rcListDelete(sql
1d920 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73  ite3 *db, SrcLis
1d930 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
1d940 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
1d950 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1d960 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1d970 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1d980 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
1d990 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
1d9a0 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
1d9b0 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
1d9c0 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
1d9d0 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  >zDatabase);.   
1d9e0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1d9f0 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  b, pItem->zName)
1da00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1da10 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
1da20 41 6c 69 61 73 29 3b 0a 20 20 20 20 73 71 6c 69  Alias);.    sqli
1da30 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1da40 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20  tem->zIndex);.  
1da50 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
1da60 61 62 6c 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  able(db, pItem->
1da70 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
1da80 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
1da90 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  b, pItem->pSelec
1daa0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
1dab0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
1dac0 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73  tem->pOn);.    s
1dad0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1dae0 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55  te(db, pItem->pU
1daf0 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sing);.  }.  sql
1db00 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1db10 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
1db20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1db30 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
1db40 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65  rser to add a ne
1db50 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a  w term to the.**
1db60 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e   end of a growin
1db70 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  g FROM clause.  
1db80 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  The "p" paramete
1db90 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f 66  r is the part of
1dba0 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
1dbb0 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  use that has alr
1dbc0 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72  eady been constr
1dbd0 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e  ucted.  "p" is N
1dbe0 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69  ULL.** if this i
1dbf0 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
1dc00 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1dc10 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64  use.  pTable and
1dc20 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72   pDatabase.** ar
1dc30 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
1dc40 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61  e table and data
1dc50 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  base named in th
1dc60 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
1dc70 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  rm..** pDatabase
1dc80 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
1dc90 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75  database name qu
1dca0 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73 69  alifier is missi
1dcb0 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61  ng - the.** usua
1dcc0 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65 20  l case.  If the 
1dcd0 74 65 72 6d 20 68 61 73 20 61 6e 20 61 6c 69 61  term has an alia
1dce0 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70  s, then pAlias p
1dcf0 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
1dd00 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66  alias token.  If
1dd10 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73   the term is a s
1dd20 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53  ubquery, then pS
1dd30 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a  ubquery is the.*
1dd40 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
1dd50 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62 71  nt that the subq
1dd60 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54  uery encodes.  T
1dd70 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a  he pTable and.**
1dd80 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61 6d   pDatabase param
1dd90 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66  eters are NULL f
1dda0 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20 20  or subqueries.  
1ddb0 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69  The pOn and pUsi
1ddc0 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  ng.** parameters
1ddd0 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74   are the content
1dde0 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55   of the ON and U
1ddf0 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SING clauses..**
1de00 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77  .** Return a new
1de10 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20 65   SrcList which e
1de20 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46 52  ncodes is the FR
1de30 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a  OM with the new.
1de40 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a  ** term added..*
1de50 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
1de60 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
1de70 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65  romTerm(.  Parse
1de80 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1de90 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
1dea0 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
1deb0 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  st *p,          
1dec0 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70     /* The left p
1ded0 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  art of the FROM 
1dee0 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 73  clause already s
1def0 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  een */.  Token *
1df00 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  pTable,         
1df10 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1df20 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20  table to add to 
1df30 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1df40 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
1df50 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  abase,       /* 
1df60 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
1df70 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
1df80 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65  pTable */.  Toke
1df90 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20  n *pAlias,      
1dfa0 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
1dfb0 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
1dfc0 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73 69  e AS subexpressi
1dfd0 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
1dfe0 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20 20  pSubquery,      
1dff0 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75 73  /* A subquery us
1e000 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
1e010 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   table name */. 
1e020 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20   Expr *pOn,     
1e030 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e040 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  ON clause of a j
1e050 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  oin */.  IdList 
1e060 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20 20  *pUsing         
1e070 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c   /* The USING cl
1e080 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a  ause of a join *
1e090 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
1e0a0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1e0b0 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
1e0c0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1e0d0 20 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e 20   if( !p && (pOn 
1e0e0 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20 20  || pUsing) ){.  
1e0f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1e100 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f 49  g(pParse, "a JOI
1e110 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75  N clause is requ
1e120 69 72 65 64 20 62 65 66 6f 72 65 20 25 73 22 2c  ired before %s",
1e130 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20 22   .      (pOn ? "
1e140 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a 20  ON" : "USING"). 
1e150 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61     );.    goto a
1e160 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1e170 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
1e180 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1e190 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20  (db, p, pTable, 
1e1a0 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  pDatabase);.  if
1e1b0 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28  ( p==0 || NEVER(
1e1c0 70 2d 3e 6e 53 72 63 3d 3d 30 29 20 29 7b 0a 20  p->nSrc==0) ){. 
1e1d0 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66     goto append_f
1e1e0 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  rom_error;.  }. 
1e1f0 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70   pItem = &p->a[p
1e200 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73  ->nSrc-1];.  ass
1e210 65 72 74 28 20 70 41 6c 69 61 73 21 3d 30 20 29  ert( pAlias!=0 )
1e220 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73 2d 3e  ;.  if( pAlias->
1e230 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  n ){.    pItem->
1e240 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
1e250 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
1e260 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20  , pAlias);.  }. 
1e270 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
1e280 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70  = pSubquery;.  p
1e290 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b  Item->pOn = pOn;
1e2a0 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  .  pItem->pUsing
1e2b0 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74   = pUsing;.  ret
1e2c0 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e 64 5f  urn p;.. append_
1e2d0 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 61 73  from_error:.  as
1e2e0 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20  sert( p==0 );.  
1e2f0 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1e300 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 73 71  e(db, pOn);.  sq
1e310 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
1e320 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20  e(db, pUsing);. 
1e330 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1e340 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71 75 65  lete(db, pSubque
1e350 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ry);.  return 0;
1e360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1e370 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e   INDEXED BY or N
1e380 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
1e390 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65  e to the most re
1e3a0 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a  cently added .**
1e3b0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
1e3c0 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73 73  source-list pass
1e3d0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1e3e0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f   argument..*/.vo
1e3f0 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1e400 74 49 6e 64 65 78 65 64 42 79 28 50 61 72 73 65  tIndexedBy(Parse
1e410 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
1e420 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e  t *p, Token *pIn
1e430 64 65 78 65 64 42 79 29 7b 0a 20 20 61 73 73 65  dexedBy){.  asse
1e440 72 74 28 20 70 49 6e 64 65 78 65 64 42 79 21 3d  rt( pIndexedBy!=
1e450 30 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20  0 );.  if( p && 
1e460 41 4c 57 41 59 53 28 70 2d 3e 6e 53 72 63 3e 30  ALWAYS(p->nSrc>0
1e470 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ) ){.    struct 
1e480 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1e490 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
1e4a0 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65  Src-1];.    asse
1e4b0 72 74 28 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e  rt( pItem->notIn
1e4c0 64 65 78 65 64 3d 3d 30 20 26 26 20 70 49 74 65  dexed==0 && pIte
1e4d0 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30 20 29 3b 0a  m->zIndex==0 );.
1e4e0 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65 64      if( pIndexed
1e4f0 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e  By->n==1 && !pIn
1e500 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20  dexedBy->z ){.  
1e510 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e      /* A "NOT IN
1e520 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77 61  DEXED" clause wa
1e530 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65 20  s supplied. See 
1e540 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20 2a  parse.y .      *
1e550 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e 64  * construct "ind
1e560 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64 65  exed_opt" for de
1e570 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tails. */.      
1e580 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65  pItem->notIndexe
1e590 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 1;.    }else
1e5a0 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a  {.      pItem->z
1e5b0 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 4e  Index = sqlite3N
1e5c0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
1e5d0 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65  rse->db, pIndexe
1e5e0 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  dBy);.    }.  }.
1e5f0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75  }../*.** When bu
1e600 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d  ilding up a FROM
1e610 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70   clause in the p
1e620 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20  arser, the join 
1e630 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69  operator.** is i
1e640 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65  nitially attache
1e650 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70  d to the left op
1e660 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20  erand.  But the 
1e670 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a  code generator.*
1e680 2a 20 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f  * expects the jo
1e690 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62  in operator to b
1e6a0 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f  e on the right o
1e6b0 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f  perand.  This ro
1e6c0 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20  utine.** Shifts 
1e6d0 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  all join operato
1e6e0 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  rs from left to 
1e6f0 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74  right for an ent
1e700 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75  ire FROM.** clau
1e710 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c  se..**.** Exampl
1e720 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a  e: Suppose the j
1e730 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73  oin is like this
1e740 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1e750 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73    A natural cros
1e760 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54  s join B.**.** T
1e770 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22  he operator is "
1e780 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f  natural cross jo
1e790 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20  in".  The A and 
1e7a0 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73  B operands are s
1e7b0 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61  tored.** in p->a
1e7c0 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c  [0] and p->a[1],
1e7d0 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20   respectively.  
1e7e0 54 68 65 20 70 61 72 73 65 72 20 69 6e 69 74 69  The parser initi
1e7f0 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a  ally stores the.
1e800 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  ** operator with
1e810 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   A.  This routin
1e820 65 20 73 68 69 66 74 73 20 74 68 61 74 20 6f 70  e shifts that op
1e830 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42  erator over to B
1e840 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1e850 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69  3SrcListShiftJoi
1e860 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70  nType(SrcList *p
1e870 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
1e880 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73    int i;.    ass
1e890 65 72 74 28 20 70 2d 3e 61 20 7c 7c 20 70 2d 3e  ert( p->a || p->
1e8a0 6e 53 72 63 3d 3d 30 20 29 3b 0a 20 20 20 20 66  nSrc==0 );.    f
1e8b0 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20  or(i=p->nSrc-1; 
1e8c0 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  i>0; i--){.     
1e8d0 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70   p->a[i].jointyp
1e8e0 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f  e = p->a[i-1].jo
1e8f0 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20  intype;.    }.  
1e900 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79    p->a[0].jointy
1e910 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pe = 0;.  }.}../
1e920 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61  *.** Begin a tra
1e930 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
1e940 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61   sqlite3BeginTra
1e950 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
1e960 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65  pParse, int type
1e970 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1e980 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
1e990 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28  nt i;..  assert(
1e9a0 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20   pParse!=0 );.  
1e9b0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1e9c0 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
1e9d0 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64 62 2d 3e   );./*  if( db->
1e9e0 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
1e9f0 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20 69 66 28  return; */.  if(
1ea00 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1ea10 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1ea20 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42  _TRANSACTION, "B
1ea30 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a  EGIN", 0, 0) ){.
1ea40 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1ea50 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1ea60 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1ea70 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e 3b  if( !v ) return;
1ea80 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b 5f  .  if( type!=TK_
1ea90 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20 20  DEFERRED ){.    
1eaa0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
1eab0 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
1eac0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ead0 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74  2(v, OP_Transact
1eae0 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54  ion, i, (type==T
1eaf0 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29 3b  K_EXCLUSIVE)+1);
1eb00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1eb10 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
1eb20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
1eb30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1eb40 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
1eb50 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  t, 0, 0);.}../*.
1eb60 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e  ** Commit a tran
1eb70 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
1eb80 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61  sqlite3CommitTra
1eb90 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
1eba0 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
1ebb0 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *v;..  assert( p
1ebc0 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73  Parse!=0 );.  as
1ebd0 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
1ebe0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  !=0 );.  if( sql
1ebf0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1ec00 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
1ec10 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49  NSACTION, "COMMI
1ec20 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  T", 0, 0) ){.   
1ec30 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76   return;.  }.  v
1ec40 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1ec50 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1ec60 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
1ec70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ec80 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c  P_AutoCommit, 1,
1ec90 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
1eca0 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61  * Rollback a tra
1ecb0 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
1ecc0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
1ecd0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
1ece0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64  e *pParse){.  Vd
1ecf0 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74  be *v;..  assert
1ed00 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
1ed10 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1ed20 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  >db!=0 );.  if( 
1ed30 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1ed40 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1ed50 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f  TRANSACTION, "RO
1ed60 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29  LLBACK", 0, 0) )
1ed70 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
1ed80 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  }.  v = sqlite3G
1ed90 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1eda0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
1edb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1edc0 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
1edd0 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a  t, 1, 1);.  }.}.
1ede0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1edf0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
1ee00 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 65  y the parser whe
1ee10 6e 20 69 74 20 70 61 72 73 65 73 20 61 20 63 6f  n it parses a co
1ee20 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74 65 2c  mmand to create,
1ee30 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72 20 72  .** release or r
1ee40 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20 73  ollback an SQL s
1ee50 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f  avepoint. .*/.vo
1ee60 69 64 20 73 71 6c 69 74 65 33 53 61 76 65 70 6f  id sqlite3Savepo
1ee70 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  int(Parse *pPars
1ee80 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e  e, int op, Token
1ee90 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72   *pName){.  char
1eea0 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65   *zName = sqlite
1eeb0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
1eec0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
1eed0 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  );.  if( zName )
1eee0 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
1eef0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1ef00 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20  Parse);.#ifndef 
1ef10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
1ef20 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74  ORIZATION.    st
1ef30 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1ef40 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b  * const az[] = {
1ef50 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c 45 41   "BEGIN", "RELEA
1ef60 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20  SE", "ROLLBACK" 
1ef70 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  };.    assert( !
1ef80 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20  SAVEPOINT_BEGIN 
1ef90 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  && SAVEPOINT_REL
1efa0 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56 45 50  EASE==1 && SAVEP
1efb0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32  OINT_ROLLBACK==2
1efc0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69   );.#endif.    i
1efd0 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74 65 33  f( !v || sqlite3
1efe0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1eff0 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49  , SQLITE_SAVEPOI
1f000 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d  NT, az[op], zNam
1f010 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73  e, 0) ){.      s
1f020 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
1f030 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b  rse->db, zName);
1f040 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
1f050 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1f060 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1f070 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20  _Savepoint, op, 
1f080 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f  0, 0, zName, P4_
1f090 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
1f0a0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1f0b0 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1f0c0 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61  se is open and a
1f0d0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
1f0e0 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
1f0f0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
1f100 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72  s.  Leave any er
1f110 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20  ror messages in 
1f120 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
1f130 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
1f140 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61  ite3OpenTempData
1f150 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  base(Parse *pPar
1f160 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
1f170 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1f180 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31  .  if( db->aDb[1
1f190 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61  ].pBt==0 && !pPa
1f1a0 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
1f1b0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1f1c0 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20 20  Btree *pBt;.    
1f1d0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74  static const int
1f1e0 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20   flags = .      
1f1f0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1f200 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20  READWRITE |.    
1f210 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1f220 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
1f230 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1f240 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20  _EXCLUSIVE |.   
1f250 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1f260 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
1f270 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
1f280 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
1f290 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
1f2a0 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d  te3BtreeOpen(db-
1f2b0 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20 26 70  >pVfs, 0, db, &p
1f2c0 42 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20  Bt, 0, flags);. 
1f2d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f2e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1f2f0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1f300 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
1f310 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
1f320 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20  y database ".   
1f330 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73       "file for s
1f340 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  toring temporary
1f350 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
1f360 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63   pParse->rc = rc
1f370 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
1f380 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e  ;.    }.    db->
1f390 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74  aDb[1].pBt = pBt
1f3a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
1f3b0 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
1f3c0 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   );.    if( SQLI
1f3d0 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65  TE_NOMEM==sqlite
1f3e0 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
1f3f0 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50  e(pBt, db->nextP
1f400 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20  agesize, -1, 0) 
1f410 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  ){.      db->mal
1f420 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
1f430 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1f440 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1f450 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
1f460 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
1f470 61 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  at the schema co
1f480 6f 6b 69 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  okie will need t
1f490 6f 20 62 65 20 76 65 72 69 66 69 65 64 0a 2a 2a  o be verified.**
1f4a0 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 69 44   for database iD
1f4b0 62 2e 20 20 54 68 65 20 63 6f 64 65 20 74 6f 20  b.  The code to 
1f4c0 61 63 74 75 61 6c 6c 79 20 76 65 72 69 66 79 20  actually verify 
1f4d0 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
1f4e0 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63 63 75 72 20  e.** will occur 
1f4f0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
1f500 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56 44 42 45  e top-level VDBE
1f510 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 67 65 6e   and will be gen
1f520 65 72 61 74 65 64 0a 2a 2a 20 6c 61 74 65 72 2c  erated.** later,
1f530 20 62 79 20 73 71 6c 69 74 65 33 46 69 6e 69 73   by sqlite3Finis
1f540 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f  hCoding()..*/.vo
1f550 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  id sqlite3CodeVe
1f560 72 69 66 79 53 63 68 65 6d 61 28 50 61 72 73 65  rifySchema(Parse
1f570 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44   *pParse, int iD
1f580 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  b){.  Parse *pTo
1f590 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
1f5a0 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
1f5b0 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
1f5c0 20 2a 64 62 20 3d 20 70 54 6f 70 6c 65 76 65 6c   *db = pToplevel
1f5d0 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  ->db;..  assert(
1f5e0 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
1f5f0 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65  b->nDb );.  asse
1f600 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  rt( db->aDb[iDb]
1f610 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d  .pBt!=0 || iDb==
1f620 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  1 );.  assert( i
1f630 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  Db<SQLITE_MAX_AT
1f640 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 61 73  TACHED+2 );.  as
1f650 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
1f660 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
1f670 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 69 66   iDb, 0) );.  if
1f680 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 54 6f  ( DbMaskTest(pTo
1f690 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61  plevel->cookieMa
1f6a0 73 6b 2c 20 69 44 62 29 3d 3d 30 20 29 7b 0a 20  sk, iDb)==0 ){. 
1f6b0 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f     DbMaskSet(pTo
1f6c0 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61  plevel->cookieMa
1f6d0 73 6b 2c 20 69 44 62 29 3b 0a 20 20 20 20 70 54  sk, iDb);.    pT
1f6e0 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56  oplevel->cookieV
1f6f0 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e  alue[iDb] = db->
1f700 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
1f710 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b  ->schema_cookie;
1f720 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54  .    if( !OMIT_T
1f730 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
1f740 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1f750 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
1f760 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20  (pToplevel);.   
1f770 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1f780 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 44 62 20  If argument zDb 
1f790 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61  is NULL, then ca
1f7a0 6c 6c 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  ll sqlite3CodeVe
1f7b0 72 69 66 79 53 63 68 65 6d 61 28 29 20 66 6f 72  rifySchema() for
1f7c0 20 65 61 63 68 20 0a 2a 2a 20 61 74 74 61 63 68   each .** attach
1f7d0 65 64 20 64 61 74 61 62 61 73 65 2e 20 4f 74 68  ed database. Oth
1f7e0 65 72 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69  erwise, invoke i
1f7f0 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  t for the databa
1f800 73 65 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c  se named zDb onl
1f810 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
1f820 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
1f830 64 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70  dSchema(Parse *p
1f840 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
1f850 72 20 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74  r *zDb){.  sqlit
1f860 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1f870 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  >db;.  int i;.  
1f880 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
1f890 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  Db; i++){.    Db
1f8a0 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
1f8b0 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
1f8c0 2d 3e 70 42 74 20 26 26 20 28 21 7a 44 62 20 7c  ->pBt && (!zDb |
1f8d0 7c 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  | 0==sqlite3StrI
1f8e0 43 6d 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 4e  Cmp(zDb, pDb->zN
1f8f0 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20 73  ame)) ){.      s
1f900 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1f910 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
1f920 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
1f930 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56  /*.** Generate V
1f940 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 72  DBE code that pr
1f950 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67  epares for doing
1f960 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68   an operation th
1f970 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e  at.** might chan
1f980 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ge the database.
1f990 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1f9a0 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 77  ine starts a new
1f9b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
1f9c0 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61  we are not alrea
1f9d0 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74  dy within.** a t
1f9e0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
1f9f0 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 77  we are already w
1fa00 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
1fa10 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63  ion, then a chec
1fa20 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74  kpoint.** is set
1fa30 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74 65   if the setState
1fa40 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69  ment parameter i
1fa50 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b  s true.  A check
1fa60 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  point should.** 
1fa70 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61  be set for opera
1fa80 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74  tions that might
1fa90 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20   fail (due to a 
1faa0 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74  constraint) part
1fab0 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74   of.** the way t
1fac0 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68  hrough and which
1fad0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e   will need to un
1fae0 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77  do some writes w
1faf0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
1fb00 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  .** rollback the
1fb10 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69   whole transacti
1fb20 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69  on.  For operati
1fb30 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f  ons where all co
1fb40 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e  nstraints.** can
1fb50 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f   be checked befo
1fb60 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61  re any changes a
1fb70 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64  re made to the d
1fb80 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e  atabase, it is n
1fb90 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72  ever.** necessar
1fba0 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74  y to undo a writ
1fbb0 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70  e and the checkp
1fbc0 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20  oint should not 
1fbd0 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20  be set..*/.void 
1fbe0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1fbf0 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65  eOperation(Parse
1fc00 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65   *pParse, int se
1fc10 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20  tStatement, int 
1fc20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a 70  iDb){.  Parse *p
1fc30 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74  Toplevel = sqlit
1fc40 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28  e3ParseToplevel(
1fc50 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
1fc60 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
1fc70 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
1fc80 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54 6f  .  DbMaskSet(pTo
1fc90 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73  plevel->writeMas
1fca0 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c  k, iDb);.  pTopl
1fcb0 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69  evel->isMultiWri
1fcc0 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65  te |= setStateme
1fcd0 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64  nt;.}../*.** Ind
1fce0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 73  icate that the s
1fcf0 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74  tatement current
1fd00 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
1fd10 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 74  ction might writ
1fd20 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f  e.** more than o
1fd30 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70 6c  ne entry (exampl
1fd40 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20  e: deleting one 
1fd50 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74 69  row then inserti
1fd60 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69  ng another,.** i
1fd70 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c  nserting multipl
1fd80 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c  e rows in a tabl
1fd90 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  e, or inserting 
1fda0 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 20  a row and index 
1fdb0 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20  entries.).** If 
1fdc0 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73 20  an abort occurs 
1fdd0 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 68  after some of th
1fde0 65 73 65 20 77 72 69 74 65 73 20 68 61 76 65 20  ese writes have 
1fdf0 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e 20  completed, then 
1fe00 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65  it will.** be ne
1fe10 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
1fe20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 72  the completed wr
1fe30 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ites..*/.void sq
1fe40 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28  lite3MultiWrite(
1fe50 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1fe60 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
1fe70 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
1fe80 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
1fe90 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
1fea0 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 31  isMultiWrite = 1
1feb0 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20  ;.}../* .** The 
1fec0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63  code generator c
1fed0 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
1fee0 65 20 69 66 20 69 73 20 64 69 73 63 6f 76 65 72  e if is discover
1fef0 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20  s that it is.** 
1ff00 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f 72  possible to abor
1ff10 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70 72  t a statement pr
1ff20 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  ior to completio
1ff30 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  n.  In order to 
1ff40 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 73  .** perform this
1ff50 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20 63   abort without c
1ff60 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20 64 61  orrupting the da
1ff70 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64 20  tabase, we need 
1ff80 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20  to make.** sure 
1ff90 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
1ffa0 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65 64 20  nt is protected 
1ffb0 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  by a statement t
1ffc0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
1ffd0 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77  * Technically, w
1ffe0 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73  e only need to s
1fff0 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74 20  et the mayAbort 
20000 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 69  flag if the.** i
20010 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61 67  sMultiWrite flag
20020 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
20030 73 65 74 2e 20 20 54 68 65 72 65 20 69 73 20 61  set.  There is a
20040 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79   time dependency
20050 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74 68  .** such that th
20060 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 63  e abort must occ
20070 75 72 20 61 66 74 65 72 20 74 68 65 20 6d 75 6c  ur after the mul
20080 74 69 77 72 69 74 65 2e 20 20 54 68 69 73 20 6d  tiwrite.  This m
20090 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61  akes.** some sta
200a0 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e  tements involvin
200b0 67 20 74 68 65 20 52 45 50 4c 41 43 45 20 63 6f  g the REPLACE co
200c0 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
200d0 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67  n algorithm.** g
200e0 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65  o a little faste
200f0 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20 61  r.  But taking a
20100 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73  dvantage of this
20110 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79   time dependency
20120 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72  .** makes it mor
20130 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 70  e difficult to p
20140 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 63 6f  rove that the co
20150 64 65 20 69 73 20 63 6f 72 72 65 63 74 20 28 69  de is correct (i
20160 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72  n .** particular
20170 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20 75 73  , it prevents us
20180 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e   from writing an
20190 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d   effective.** im
201a0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
201b0 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79  sqlite3AssertMay
201c0 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f 20  Abort()) and so 
201d0 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a  we have chosen.*
201e0 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73 61  * to take the sa
201f0 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b 69  fe route and ski
20200 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  p the optimizati
20210 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
20220 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73  te3MayAbort(Pars
20230 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61  e *pParse){.  Pa
20240 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
20250 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
20260 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
20270 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41   pToplevel->mayA
20280 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  bort = 1;.}../*.
20290 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61  ** Code an OP_Ha
202a0 6c 74 20 74 68 61 74 20 63 61 75 73 65 73 20 74  lt that causes t
202b0 68 65 20 76 64 62 65 20 74 6f 20 72 65 74 75 72  he vdbe to retur
202c0 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n an SQLITE_CONS
202d0 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e  TRAINT.** error.
202e0 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72   The onError par
202f0 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65  ameter determine
20300 73 20 77 68 69 63 68 20 28 69 66 20 61 6e 79 29  s which (if any)
20310 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
20320 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72  t.** and/or curr
20330 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
20340 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
20350 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48  */.void sqlite3H
20360 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  altConstraint(. 
20370 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
20380 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
20390 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65  ntext */.  int e
203a0 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20  rrCode,      /* 
203b0 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63  extended error c
203c0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ode */.  int onE
203d0 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f  rror,      /* Co
203e0 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f  nstraint type */
203f0 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20 20 20  .  char *p4,    
20400 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65       /* Error me
20410 73 73 61 67 65 20 2a 2f 0a 20 20 69 38 20 70 34  ssage */.  i8 p4
20420 74 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  type,        /* 
20430 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50 34 5f  P4_STATIC or P4_
20440 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75  TRANSIENT */.  u
20450 38 20 70 35 45 72 72 6d 73 67 20 20 20 20 20 20  8 p5Errmsg      
20460 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20 74 79   /* P5_ErrMsg ty
20470 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  pe */.){.  Vdbe 
20480 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
20490 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
204a0 73 73 65 72 74 28 20 28 65 72 72 43 6f 64 65 26  ssert( (errCode&
204b0 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
204c0 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20 69 66  NSTRAINT );.  if
204d0 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62  ( onError==OE_Ab
204e0 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ort ){.    sqlit
204f0 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
20500 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
20510 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
20520 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c  P_Halt, errCode,
20530 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c   onError, 0, p4,
20540 20 70 34 74 79 70 65 29 3b 0a 20 20 69 66 28 20   p4type);.  if( 
20550 70 35 45 72 72 6d 73 67 20 29 20 73 71 6c 69 74  p5Errmsg ) sqlit
20560 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
20570 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a  , p5Errmsg);.}..
20580 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
20590 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49  _Halt due to UNI
205a0 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  QUE or PRIMARY K
205b0 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69  EY constraint vi
205c0 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  olation..*/.void
205d0 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f   sqlite3UniqueCo
205e0 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
205f0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
20600 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
20610 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
20620 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74  r,      /* Const
20630 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20  raint type */.  
20640 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
20650 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
20660 68 61 74 20 74 72 69 67 67 65 72 73 20 74 68 65  hat triggers the
20670 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29   constraint */.)
20680 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  {.  char *zErr;.
20690 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63    int j;.  StrAc
206a0 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61  cum errMsg;.  Ta
206b0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78  ble *pTab = pIdx
206c0 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c  ->pTable;..  sql
206d0 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
206e0 28 26 65 72 72 4d 73 67 2c 20 30 2c 20 30 2c 20  (&errMsg, 0, 0, 
206f0 32 30 30 29 3b 0a 20 20 65 72 72 4d 73 67 2e 64  200);.  errMsg.d
20700 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
20710 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
20720 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  x->nKeyCol; j++)
20730 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c  {.    char *zCol
20740 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49   = pTab->aCol[pI
20750 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  dx->aiColumn[j]]
20760 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
20770 6a 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63  j ) sqlite3StrAc
20780 63 75 6d 41 70 70 65 6e 64 28 26 65 72 72 4d 73  cumAppend(&errMs
20790 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20 20  g, ", ", 2);.   
207a0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
207b0 41 70 70 65 6e 64 41 6c 6c 28 26 65 72 72 4d 73  AppendAll(&errMs
207c0 67 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  g, pTab->zName);
207d0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41  .    sqlite3StrA
207e0 63 63 75 6d 41 70 70 65 6e 64 28 26 65 72 72 4d  ccumAppend(&errM
207f0 73 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20 20  sg, ".", 1);.   
20800 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
20810 41 70 70 65 6e 64 41 6c 6c 28 26 65 72 72 4d 73  AppendAll(&errMs
20820 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20  g, zCol);.  }.  
20830 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 53 74  zErr = sqlite3St
20840 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 65 72  rAccumFinish(&er
20850 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
20860 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70  HaltConstraint(p
20870 50 61 72 73 65 2c 20 0a 20 20 20 20 49 73 50 72  Parse, .    IsPr
20880 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
20890 64 78 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e  dx) ? SQLITE_CON
208a0 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
208b0 45 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY .            
208c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208d0 3a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  : SQLITE_CONSTRA
208e0 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20  INT_UNIQUE,.    
208f0 6f 6e 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50  onError, zErr, P
20900 34 5f 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f  4_DYNAMIC, P5_Co
20910 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b  nstraintUnique);
20920 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  .}.../*.** Code 
20930 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74  an OP_Halt due t
20940 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77  o non-unique row
20950 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  id..*/.void sqli
20960 74 65 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69  te3RowidConstrai
20970 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
20980 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
20990 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
209a0 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
209b0 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
209c0 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
209d0 68 6d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  hm */.  Table *p
209e0 54 61 62 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Tab       /* The
209f0 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
20a00 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64  non-unique rowid
20a10 20 2a 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a   */ .){.  char *
20a20 7a 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  zMsg;.  int rc;.
20a30 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
20a40 79 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67  y>=0 ){.    zMsg
20a50 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
20a60 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25  f(pParse->db, "%
20a70 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  s.%s", pTab->zNa
20a80 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
20a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
20aa0 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69  ab->aCol[pTab->i
20ab0 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  PKey].zName);.  
20ac0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
20ad0 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
20ae0 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KEY;.  }else{.  
20af0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
20b00 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
20b10 64 62 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c 20  db, "%s.rowid", 
20b20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
20b30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
20b40 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a  NSTRAINT_ROWID;.
20b50 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 6c    }.  sqlite3Hal
20b60 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
20b70 73 65 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c  se, rc, onError,
20b80 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49   zMsg, P4_DYNAMI
20b90 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  C,.             
20ba0 20 20 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f             P5_Co
20bb0 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b  nstraintUnique);
20bc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
20bd0 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65 78  to see if pIndex
20be0 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74   uses the collat
20bf0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
20c00 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  ll.  Return.** t
20c10 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 20 61  rue if it does a
20c20 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 64  nd false if it d
20c30 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e  oes not..*/.#ifn
20c40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20c50 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69  REINDEX.static i
20c60 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63  nt collationMatc
20c70 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  h(const char *zC
20c80 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  oll, Index *pInd
20c90 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ex){.  int i;.  
20ca0 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30  assert( zColl!=0
20cb0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
20cc0 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  <pIndex->nColumn
20cd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
20ce0 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64  t char *z = pInd
20cf0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  ex->azColl[i];. 
20d00 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20     assert( z!=0 
20d10 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  || pIndex->aiCol
20d20 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20  umn[i]<0 );.    
20d30 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  if( pIndex->aiCo
20d40 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d  lumn[i]>=0 && 0=
20d50 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
20d60 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  z, zColl) ){.   
20d70 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
20d80 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
20d90 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
20da0 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c  ** Recompute all
20db0 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
20dc0 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63 6f   that use the co
20dd0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
20de0 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43   pColl..** If pC
20df0 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
20e00 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
20e10 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69  s of pTab..*/.#i
20e20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20e30 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
20e40 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62   void reindexTab
20e50 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
20e60 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63  , Table *pTab, c
20e70 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
20e80 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
20e90 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
20ea0 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
20eb0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
20ec0 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64  b */..  for(pInd
20ed0 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  ex=pTab->pIndex;
20ee0 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d   pIndex; pIndex=
20ef0 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a  pIndex->pNext){.
20f00 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30      if( zColl==0
20f10 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74   || collationMat
20f20 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78  ch(zColl, pIndex
20f30 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
20f40 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
20f50 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
20f60 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
20f70 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ema);.      sqli
20f80 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
20f90 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
20fa0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
20fb0 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
20fc0 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
20fd0 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   -1);.    }.  }.
20fe0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
20ff0 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
21000 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62  dices of all tab
21010 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  les in all datab
21020 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a  ases where the.*
21030 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74 68  * indices use th
21040 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
21050 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20  ence pColl.  If 
21060 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
21070 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69  compute.** all i
21080 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65 72  ndices everywher
21090 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
210a0 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
210b0 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
210c0 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 50  indexDatabases(P
210d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68  arse *pParse, ch
210e0 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29  ar const *zColl)
210f0 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20  {.  Db *pDb;    
21100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21110 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61  /* A single data
21120 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  base */.  int iD
21130 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
21140 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
21150 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
21160 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
21170 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
21180 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
21190 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
211a0 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b  /.  HashElem *k;
211b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211c0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
211d0 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44  ver tables in pD
211e0 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  b */.  Table *pT
211f0 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
21200 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
21210 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
21220 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
21230 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
21240 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 20 20  Mutexes(db) );  
21250 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63  /* Needed for sc
21260 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20  hema access */. 
21270 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d   for(iDb=0, pDb=
21280 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d  db->aDb; iDb<db-
21290 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62  >nDb; iDb++, pDb
212a0 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
212b0 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66   pDb!=0 );.    f
212c0 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46  or(k=sqliteHashF
212d0 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65  irst(&pDb->pSche
212e0 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b  ma->tblHash);  k
212f0 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; k=sqliteHashNe
21300 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54  xt(k)){.      pT
21310 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c  ab = (Table*)sql
21320 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a  iteHashData(k);.
21330 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61 62        reindexTab
21340 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c  le(pParse, pTab,
21350 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20   zColl);.    }. 
21360 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
21370 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
21380 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58   for the REINDEX
21390 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
213a0 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
213b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213c0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a            -- 1.*
213d0 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
213e0 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20    <collation>   
213f0 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32              -- 2
21400 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
21410 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
21420 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d  ?<tablename>  --
21430 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   3.**        REI
21440 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
21450 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20  >.?<indexname>  
21460 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20  -- 4.**.** Form 
21470 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64  1 causes all ind
21480 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61  ices in all atta
21490 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74  ched databases t
214a0 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a  o be rebuilt..**
214b0 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73   Form 2 rebuilds
214c0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20   all indices in 
214d0 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74 68  all databases th
214e0 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64  at use the named
214f0 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  .** collating fu
21500 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33  nction.  Forms 3
21510 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74   and 4 rebuild t
21520 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f  he named index o
21530 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73  r all.** indices
21540 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21550 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65   the named table
21560 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
21570 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
21580 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69  .void sqlite3Rei
21590 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
215a0 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
215b0 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  1, Token *pName2
215c0 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
215d0 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
215e0 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
215f0 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69  quence to be rei
21600 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  ndexed, or NULL 
21610 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20  */.  char *z;   
21620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21630 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61   /* Name of a ta
21640 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a  ble or index */.
21650 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
21660 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b;            /*
21670 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
21680 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65  abase */.  Table
21690 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
216a0 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c         /* A tabl
216b0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
216c0 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
216d0 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
216e0 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
216f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
21700 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  Tab */.  int iDb
21710 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21720 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
21730 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65  base index numbe
21740 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  r */.  sqlite3 *
21750 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
21760 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
21770 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
21780 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61  .  Token *pObjNa
21790 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
217a0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
217b0 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20  ble or index to 
217c0 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a  be reindexed */.
217d0 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64  .  /* Read the d
217e0 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
217f0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
21800 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
21810 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20  or message.  ** 
21820 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72  and code in pPar
21830 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  se and return NU
21840 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  LL. */.  if( SQL
21850 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
21860 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
21870 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
21880 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d  .  }..  if( pNam
21890 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69  e1==0 ){.    rei
218a0 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
218b0 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65  arse, 0);.    re
218c0 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  turn;.  }else if
218d0 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d  ( NEVER(pName2==
218e0 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d  0) || pName2->z=
218f0 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
21900 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72  zColl;.    asser
21910 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a  t( pName1->z );.
21920 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69      zColl = sqli
21930 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
21940 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
21950 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  me1);.    if( !z
21960 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20  Coll ) return;. 
21970 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
21980 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
21990 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c  , ENC(db), zColl
219a0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43  , 0);.    if( pC
219b0 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69  oll ){.      rei
219c0 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50  ndexDatabases(pP
219d0 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  arse, zColl);.  
219e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
219f0 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
21a00 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
21a10 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
21a20 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
21a30 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
21a40 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
21a50 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
21a60 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65  Name2, &pObjName
21a70 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29  );.  if( iDb<0 )
21a80 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73   return;.  z = s
21a90 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
21aa0 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65  ken(db, pObjName
21ab0 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
21ac0 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20  return;.  zDb = 
21ad0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
21ae0 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c  me;.  pTab = sql
21af0 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
21b00 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28  , z, zDb);.  if(
21b10 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69   pTab ){.    rei
21b20 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
21b30 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , pTab, 0);.    
21b40 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
21b50 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , z);.    return
21b60 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
21b70 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
21b80 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20  x(db, z, zDb);. 
21b90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
21ba0 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e  b, z);.  if( pIn
21bb0 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
21bc0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
21bd0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
21be0 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
21bf0 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
21c00 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
21c10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
21c20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   }.  sqlite3Erro
21c30 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
21c40 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79  able to identify
21c50 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62   the object to b
21c60 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d  e reindexed");.}
21c70 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
21c80 65 74 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20  eturn a KeyInfo 
21c90 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69  structure that i
21ca0 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
21cb0 72 20 74 68 65 20 67 69 76 65 6e 20 49 6e 64 65  r the given Inde
21cc0 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4b 65 79  x..**.** The Key
21cd0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 66  Info structure f
21ce0 6f 72 20 61 6e 20 69 6e 64 65 78 20 69 73 20 63  or an index is c
21cf0 61 63 68 65 64 20 69 6e 20 74 68 65 20 49 6e 64  ached in the Ind
21d00 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 53 6f  ex object..** So
21d10 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   there might be 
21d20 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e  multiple referen
21d30 63 65 73 20 74 6f 20 74 68 65 20 72 65 74 75 72  ces to the retur
21d40 6e 65 64 20 70 6f 69 6e 74 65 72 2e 20 20 54 68  ned pointer.  Th
21d50 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75  e.** caller shou
21d60 6c 64 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 6f  ld not try to mo
21d70 64 69 66 79 20 74 68 65 20 4b 65 79 49 6e 66 6f  dify the KeyInfo
21d80 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
21d90 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
21da0 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b   invoke sqlite3K
21db0 65 79 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e  eyInfoUnref() on
21dc0 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62   the returned ob
21dd0 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20  ject.** when it 
21de0 68 61 73 20 66 69 6e 69 73 68 65 64 20 75 73 69  has finished usi
21df0 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  ng it..*/.KeyInf
21e00 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  o *sqlite3KeyInf
21e10 6f 4f 66 49 6e 64 65 78 28 50 61 72 73 65 20 2a  oOfIndex(Parse *
21e20 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
21e30 49 64 78 29 7b 0a 20 20 69 66 28 20 70 50 61 72  Idx){.  if( pPar
21e40 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
21e50 6e 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  n 0;.#ifndef SQL
21e60 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
21e70 43 41 43 48 45 0a 20 20 69 66 28 20 70 49 64 78  CACHE.  if( pIdx
21e80 2d 3e 70 4b 65 79 49 6e 66 6f 20 26 26 20 70 49  ->pKeyInfo && pI
21e90 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  dx->pKeyInfo->db
21ea0 21 3d 70 50 61 72 73 65 2d 3e 64 62 20 29 7b 0a  !=pParse->db ){.
21eb0 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e      sqlite3KeyIn
21ec0 66 6f 55 6e 72 65 66 28 70 49 64 78 2d 3e 70 4b  foUnref(pIdx->pK
21ed0 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 70 49 64  eyInfo);.    pId
21ee0 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b  x->pKeyInfo = 0;
21ef0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
21f00 28 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f  ( pIdx->pKeyInfo
21f10 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
21f20 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d  ;.    int nCol =
21f30 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a   pIdx->nColumn;.
21f40 20 20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70      int nKey = p
21f50 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20  Idx->nKeyCol;.  
21f60 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b    KeyInfo *pKey;
21f70 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 75  .    if( pIdx->u
21f80 6e 69 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20  niqNotNull ){.  
21f90 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74      pKey = sqlit
21fa0 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70  e3KeyInfoAlloc(p
21fb0 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c  Parse->db, nKey,
21fc0 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 20   nCol-nKey);.   
21fd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4b   }else{.      pK
21fe0 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  ey = sqlite3KeyI
21ff0 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  nfoAlloc(pParse-
22000 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20  >db, nCol, 0);. 
22010 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4b 65     }.    if( pKe
22020 79 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  y ){.      asser
22030 74 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  t( sqlite3KeyInf
22040 6f 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65  oIsWriteable(pKe
22050 79 29 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  y) );.      for(
22060 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
22070 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
22080 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
22090 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zColl[i];.      
220a0 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21    assert( zColl!
220b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  =0 );.        pK
220c0 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73  ey->aColl[i] = s
220d0 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e  trcmp(zColl,"BIN
220e0 41 52 59 22 29 3d 3d 30 20 3f 20 30 20 3a 0a 20  ARY")==0 ? 0 :. 
220f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22100 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22110 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
22120 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  arse, zColl);.  
22130 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72        pKey->aSor
22140 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78  tOrder[i] = pIdx
22150 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b  ->aSortOrder[i];
22160 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
22170 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
22180 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
22190 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
221a0 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Key);.      }els
221b0 65 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  e{.        pIdx-
221c0 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
221d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
221e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
221f0 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70  ite3KeyInfoRef(p
22200 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a  Idx->pKeyInfo);.
22210 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
22220 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a  E_OMIT_CTE./* .*
22230 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
22240 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70  s invoked once p
22250 65 72 20 43 54 45 20 62 79 20 74 68 65 20 70 61  er CTE by the pa
22260 72 73 65 72 20 77 68 69 6c 65 20 70 61 72 73 69  rser while parsi
22270 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c  ng a .** WITH cl
22280 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a  ause. .*/.With *
22290 73 71 6c 69 74 65 33 57 69 74 68 41 64 64 28 0a  sqlite3WithAdd(.
222a0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
222b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
222c0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
222d0 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20 20    With *pWith,  
222e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 69            /* Exi
222f0 73 74 69 6e 67 20 57 49 54 48 20 63 6c 61 75 73  sting WITH claus
22300 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  e, or NULL */.  
22310 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20  Token *pName,   
22320 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
22330 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61  of the common-ta
22340 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ble */.  ExprLis
22350 74 20 2a 70 41 72 67 6c 69 73 74 2c 20 20 20 20  t *pArglist,    
22360 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c   /* Optional col
22370 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f  umn name list fo
22380 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  r the table */. 
22390 20 53 65 6c 65 63 74 20 2a 70 51 75 65 72 79 20   Select *pQuery 
223a0 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65 72           /* Quer
223b0 79 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61  y used to initia
223c0 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20 2a  lize the table *
223d0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
223e0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
223f0 0a 20 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20  .  With *pNew;. 
22400 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20   char *zName;.. 
22410 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
22420 68 65 20 43 54 45 20 6e 61 6d 65 20 69 73 20 75  he CTE name is u
22430 6e 69 71 75 65 20 77 69 74 68 69 6e 20 74 68 69  nique within thi
22440 73 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 49  s WITH clause. I
22450 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72  f.  ** not, stor
22460 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74 68  e an error in th
22470 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75 72  e Parse structur
22480 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20  e. */.  zName = 
22490 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
224a0 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
224b0 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
224c0 4e 61 6d 65 20 26 26 20 70 57 69 74 68 20 29 7b  Name && pWith ){
224d0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
224e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68  for(i=0; i<pWith
224f0 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCte; i++){.  
22500 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
22510 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57  trICmp(zName, pW
22520 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ith->a[i].zName)
22530 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
22540 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
22550 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74  Parse, "duplicat
22560 65 20 57 49 54 48 20 74 61 62 6c 65 20 6e 61 6d  e WITH table nam
22570 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
22580 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22590 7d 0a 0a 20 20 69 66 28 20 70 57 69 74 68 20 29  }..  if( pWith )
225a0 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  {.    int nByte 
225b0 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29  = sizeof(*pWith)
225c0 20 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 74 68   + (sizeof(pWith
225d0 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d  ->a[1]) * pWith-
225e0 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e 65 77  >nCte);.    pNew
225f0 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
22600 6c 6f 63 28 64 62 2c 20 70 57 69 74 68 2c 20 6e  loc(db, pWith, n
22610 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
22620 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
22630 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
22640 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68  b, sizeof(*pWith
22650 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ));.  }.  assert
22660 28 20 7a 4e 61 6d 65 21 3d 30 20 7c 7c 20 70 4e  ( zName!=0 || pN
22670 65 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ew==0 );.  asser
22680 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
22690 6c 65 64 3d 3d 30 20 7c 7c 20 70 4e 65 77 3d 3d  led==0 || pNew==
226a0 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77  0 );..  if( pNew
226b0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
226c0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
226d0 28 64 62 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a  (db, pArglist);.
226e0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
226f0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 51 75 65  tDelete(db, pQue
22700 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
22710 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
22720 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70 57  );.    pNew = pW
22730 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ith;.  }else{.  
22740 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
22750 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20  nCte].pSelect = 
22760 70 51 75 65 72 79 3b 0a 20 20 20 20 70 4e 65 77  pQuery;.    pNew
22770 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e  ->a[pNew->nCte].
22780 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69 73 74  pCols = pArglist
22790 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e  ;.    pNew->a[pN
227a0 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20  ew->nCte].zName 
227b0 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65  = zName;.    pNe
227c0 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d  w->a[pNew->nCte]
227d0 2e 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 70  .zErr = 0;.    p
227e0 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b 0a 20 20 7d  New->nCte++;.  }
227f0 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ..  return pNew;
22800 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
22810 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
22820 68 65 20 57 69 74 68 20 6f 62 6a 65 63 74 20 70  he With object p
22830 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
22840 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
22850 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69 74  .void sqlite3Wit
22860 68 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  hDelete(sqlite3 
22870 2a 64 62 2c 20 57 69 74 68 20 2a 70 57 69 74 68  *db, With *pWith
22880 29 7b 0a 20 20 69 66 28 20 70 57 69 74 68 20 29  ){.  if( pWith )
22890 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
228a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74   for(i=0; i<pWit
228b0 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  h->nCte; i++){. 
228c0 20 20 20 20 20 73 74 72 75 63 74 20 43 74 65 20       struct Cte 
228d0 2a 70 43 74 65 20 3d 20 26 70 57 69 74 68 2d 3e  *pCte = &pWith->
228e0 61 5b 69 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[i];.      sqli
228f0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
22900 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 43 6f 6c  e(db, pCte->pCol
22910 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  s);.      sqlite
22920 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
22930 2c 20 70 43 74 65 2d 3e 70 53 65 6c 65 63 74 29  , pCte->pSelect)
22940 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
22950 62 46 72 65 65 28 64 62 2c 20 70 43 74 65 2d 3e  bFree(db, pCte->
22960 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
22970 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
22980 64 62 2c 20 70 57 69 74 68 29 3b 0a 20 20 7d 0a  db, pWith);.  }.
22990 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
229a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
229b0 5f 43 54 45 29 20 2a 2f 0a                       _CTE) */.