/ Hex Artifact Content
Login

Artifact a6b9ba918f9194e955d198402076fe3203ff2567:


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 54  .#endif../*.** T
0d90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0da0: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0db0: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0dc0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0dd0: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0de0: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0df0: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0e00: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e10: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e20: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0e30: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0e40: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0e50: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0e60: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0e70: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0e80: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0e90: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0ea0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0eb0: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0ec0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0ed0: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0ee0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0ef0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0f00: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0f10: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f20: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0f30: 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *v;..  assert( 
0f40: 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
0f50: 6c 3d 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  l==0 );.  db = p
0f60: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0f70: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0f80: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
0f90: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
0fa0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0fb0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
0fc0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65  return;..  /* Be
0fd0: 67 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e  gin by generatin
0fe0: 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69  g some terminati
0ff0: 6f 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65  on code at the e
1000: 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76  nd of the.  ** v
1010: 64 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f  dbe program.  */
1020: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1030: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1040: 20 61 73 73 65 72 74 28 20 21 70 50 61 72 73 65   assert( !pParse
1050: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a  ->isMultiWrite .
1060: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
1070: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
1080: 6f 72 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d  ort(v, pParse->m
1090: 61 79 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28  ayAbort));.  if(
10a0: 20 76 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28   v ){.    while(
10b0: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
10c0: 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 76 2c  tePriorOpcode(v,
10d0: 20 4f 50 5f 43 6c 6f 73 65 29 20 29 7b 7d 0a 20   OP_Close) ){}. 
10e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10f0: 64 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29  dOp0(v, OP_Halt)
1100: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
1110: 6f 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69  okie mask contai
1120: 6e 73 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 65  ns one bit for e
1130: 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
1140: 65 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28  e open..    ** (
1150: 42 69 74 20 30 20 69 73 20 66 6f 72 20 6d 61 69  Bit 0 is for mai
1160: 6e 2c 20 62 69 74 20 31 20 69 73 20 66 6f 72 20  n, bit 1 is for 
1170: 74 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72  temp, and so for
1180: 74 68 2e 29 20 20 42 69 74 73 20 61 72 65 0a 20  th.)  Bits are. 
1190: 20 20 20 2a 2a 20 73 65 74 20 66 6f 72 20 65 61     ** set for ea
11a0: 63 68 20 64 61 74 61 62 61 73 65 20 74 68 61 74  ch database that
11b0: 20 69 73 20 75 73 65 64 2e 20 20 47 65 6e 65 72   is used.  Gener
11c0: 61 74 65 20 63 6f 64 65 20 74 6f 20 73 74 61 72  ate code to star
11d0: 74 20 61 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  t a.    ** trans
11e0: 61 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75  action on each u
11f0: 73 65 64 20 64 61 74 61 62 61 73 65 20 61 6e 64  sed database and
1200: 20 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 73   to verify the s
1210: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20  chema cookie.   
1220: 20 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73 65 64   ** on each used
1230: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a   database..    *
1240: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  /.    if( pParse
1250: 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3e 30 20 29  ->cookieGoto>0 )
1260: 7b 0a 20 20 20 20 20 20 79 44 62 4d 61 73 6b 20  {.      yDbMask 
1270: 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20  mask;.      int 
1280: 69 44 62 2c 20 69 2c 20 61 64 64 72 3b 0a 20 20  iDb, i, addr;.  
1290: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
12a0: 75 6d 70 48 65 72 65 28 76 2c 20 70 50 61 72 73  umpHere(v, pPars
12b0: 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29  e->cookieGoto-1)
12c0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d  ;.      for(iDb=
12d0: 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64  0, mask=1; iDb<d
12e0: 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31  b->nDb; mask<<=1
12f0: 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20  , iDb++){.      
1300: 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50    if( (mask & pP
1310: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
1320: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
1330: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1340: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
1350: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
1360: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1370: 28 76 2c 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  (v,OP_Transactio
1380: 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b 20 26 20  n, iDb, (mask & 
1390: 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73  pParse->writeMas
13a0: 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  k)!=0);.        
13b0: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
13c0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
13d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13e0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
13f0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
1400: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1410: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
1420: 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 0a  P_VerifyCookie,.
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 20 20 20 20 20 20 20 20 69 44 62 2c              iDb,
1450: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56   pParse->cookieV
1460: 61 6c 75 65 5b 69 44 62 5d 2c 0a 20 20 20 20 20  alue[iDb],.     
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
1490: 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 47 65  Db].pSchema->iGe
14a0: 6e 65 72 61 74 69 6f 6e 29 3b 0a 20 20 20 20 20  neration);.     
14b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
14c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14d0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
14e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
14f0: 50 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b  Parse->nVtabLock
1500: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1510: 63 68 61 72 20 2a 76 74 61 62 20 3d 20 28 63 68  char *vtab = (ch
1520: 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74 56  ar *)sqlite3GetV
1530: 54 61 62 6c 65 28 64 62 2c 20 70 50 61 72 73 65  Table(db, pParse
1540: 2d 3e 61 70 56 74 61 62 4c 6f 63 6b 5b 69 5d 29  ->apVtabLock[i])
1550: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1560: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1570: 50 5f 56 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20  P_VBegin, 0, 0, 
1580: 30 2c 20 76 74 61 62 2c 20 50 34 5f 56 54 41 42  0, vtab, P4_VTAB
1590: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15a0: 20 70 50 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f   pParse->nVtabLo
15b0: 63 6b 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  ck = 0;.#endif..
15c0: 20 20 20 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c        /* Once al
15d0: 6c 20 74 68 65 20 63 6f 6f 6b 69 65 73 20 68 61  l the cookies ha
15e0: 76 65 20 62 65 65 6e 20 76 65 72 69 66 69 65 64  ve been verified
15f0: 20 61 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   and transaction
1600: 73 20 6f 70 65 6e 65 64 2c 20 0a 20 20 20 20 20  s opened, .     
1610: 20 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 72   ** obtain the r
1620: 65 71 75 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f  equired table-lo
1630: 63 6b 73 2e 20 54 68 69 73 20 69 73 20 61 20 6e  cks. This is a n
1640: 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 74 68 65 20  o-op unless the 
1650: 0a 20 20 20 20 20 20 2a 2a 20 73 68 61 72 65 64  .      ** shared
1660: 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20 69  -cache feature i
1670: 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20  s enabled..     
1680: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 54 61   */.      codeTa
1690: 62 6c 65 4c 6f 63 6b 73 28 70 50 61 72 73 65 29  bleLocks(pParse)
16a0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 6e 69 74  ;..      /* Init
16b0: 69 61 6c 69 7a 65 20 61 6e 79 20 41 55 54 4f 49  ialize any AUTOI
16c0: 4e 43 52 45 4d 45 4e 54 20 64 61 74 61 20 73 74  NCREMENT data st
16d0: 72 75 63 74 75 72 65 73 20 72 65 71 75 69 72 65  ructures require
16e0: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
16f0: 20 20 73 71 6c 69 74 65 33 41 75 74 6f 69 6e 63    sqlite3Autoinc
1700: 72 65 6d 65 6e 74 42 65 67 69 6e 28 70 50 61 72  rementBegin(pPar
1710: 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43  se);..      /* C
1720: 6f 64 65 20 63 6f 6e 73 74 61 6e 74 20 65 78 70  ode constant exp
1730: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 77 68  ressions that wh
1740: 65 72 65 20 66 61 63 74 6f 72 65 64 20 6f 75 74  ere factored out
1750: 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20   of inner loops 
1760: 2a 2f 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  */.      addr = 
1770: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
1780: 74 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  to;.      if( pP
1790: 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72  arse->pConstExpr
17a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
17b0: 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70 50 61 72  List *pEL = pPar
17c0: 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b 0a  se->pConstExpr;.
17d0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
17e0: 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a  cookieGoto = 0;.
17f0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1800: 20 69 3c 70 45 4c 2d 3e 6e 45 78 70 72 3b 20 69   i<pEL->nExpr; i
1810: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
1820: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
1830: 50 61 72 73 65 2c 20 70 45 4c 2d 3e 61 5b 69 5d  Parse, pEL->a[i]
1840: 2e 70 45 78 70 72 2c 20 70 45 4c 2d 3e 61 5b 69  .pExpr, pEL->a[i
1850: 5d 2e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65  ].u.iConstExprRe
1860: 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
1870: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1880: 46 69 6e 61 6c 6c 79 2c 20 6a 75 6d 70 20 62 61  Finally, jump ba
1890: 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ck to the beginn
18a0: 69 6e 67 20 6f 66 20 74 68 65 20 65 78 65 63 75  ing of the execu
18b0: 74 61 62 6c 65 20 63 6f 64 65 2e 20 2a 2f 0a 20  table code. */. 
18c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18d0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
18e0: 6f 2c 20 30 2c 20 61 64 64 72 29 3b 0a 20 20 20  o, 0, addr);.   
18f0: 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65   }.  }...  /* Ge
1900: 74 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  t the VDBE progr
1910: 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65 78 65  am ready for exe
1920: 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66  cution.  */.  if
1930: 28 20 76 20 26 26 20 41 4c 57 41 59 53 28 70 50  ( v && ALWAYS(pP
1940: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26  arse->nErr==0) &
1950: 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
1960: 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  led ){.    asser
1970: 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  t( pParse->iCach
1980: 65 4c 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a  eLevel==0 );  /*
1990: 20 44 69 73 61 62 6c 65 73 20 61 6e 64 20 72 65   Disables and re
19a0: 2d 65 6e 61 62 6c 65 73 20 6d 61 74 63 68 20 2a  -enables match *
19b0: 2f 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d  /.    /* A minim
19c0: 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72  um of one cursor
19d0: 20 69 73 20 72 65 71 75 69 72 65 64 20 69 66 20   is required if 
19e0: 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73  autoincrement is
19f0: 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53 65 65   used.    *  See
1a00: 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33 37 39   ticket [a696379
1a10: 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20  c1f08866] */.   
1a20: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 41 69   if( pParse->pAi
1a30: 6e 63 21 3d 30 20 26 26 20 70 50 61 72 73 65 2d  nc!=0 && pParse-
1a40: 3e 6e 54 61 62 3d 3d 30 20 29 20 70 50 61 72 73  >nTab==0 ) pPars
1a50: 65 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20  e->nTab = 1;.   
1a60: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
1a70: 52 65 61 64 79 28 76 2c 20 70 50 61 72 73 65 29  Ready(v, pParse)
1a80: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
1a90: 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1aa0: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e      pParse->colN
1ab0: 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d  amesSet = 0;.  }
1ac0: 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65  else{.    pParse
1ad0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
1ae0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73  ROR;.  }.  pPars
1af0: 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70  e->nTab = 0;.  p
1b00: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b  Parse->nMem = 0;
1b10: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20  .  pParse->nSet 
1b20: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
1b30: 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Var = 0;.  pPars
1b40: 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20  e->cookieMask = 
1b50: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f  0;.  pParse->coo
1b60: 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a  kieGoto = 0;.}..
1b70: 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61  /*.** Run the pa
1b80: 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65  rser and code ge
1b90: 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69 76  nerator recursiv
1ba0: 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ely in order to 
1bb0: 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65  generate.** code
1bc0: 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61   for the SQL sta
1bd0: 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74  tement given ont
1be0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
1bf0: 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a   pParse context.
1c00: 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  ** currently und
1c10: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
1c20: 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73 65    When the parse
1c30: 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73 69  r is run recursi
1c40: 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79  vely.** this way
1c50: 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48  , the final OP_H
1c60: 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e  alt is not appen
1c70: 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e  ded and other in
1c80: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20  itialization.** 
1c90: 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e  and finalization
1ca0: 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74   steps are omitt
1cb0: 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73 65  ed because those
1cc0: 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79   are handling by
1cd0: 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73   the.** outermos
1ce0: 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20  t parser..**.** 
1cf0: 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20 69  Not everything i
1d00: 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69  s nestable.  Thi
1d10: 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64 65  s facility is de
1d20: 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74  signed to permit
1d30: 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41  .** INSERT, UPDA
1d40: 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f  TE, and DELETE o
1d50: 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73  perations agains
1d60: 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e  t SQLITE_MASTER.
1d70: 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66    Use.** care if
1d80: 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74   you decide to t
1d90: 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20 72  ry to use this r
1da0: 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20  outine for some 
1db0: 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a  other purposes..
1dc0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e  */.void sqlite3N
1dd0: 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73 65  estedParse(Parse
1de0: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
1df0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
1e00: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
1e10: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  p;.  char *zSql;
1e20: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
1e30: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
1e40: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1e50: 3b 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45 5f  ;.# define SAVE_
1e60: 53 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72 73  SZ  (sizeof(Pars
1e70: 65 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50 61  e) - offsetof(Pa
1e80: 72 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68 61  rse,nVar)).  cha
1e90: 72 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f 53  r saveBuf[SAVE_S
1ea0: 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Z];..  if( pPars
1eb0: 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e  e->nErr ) return
1ec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1ed0: 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b  se->nested<10 );
1ee0: 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f    /* Nesting sho
1ef0: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c  uld only be of l
1f00: 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a  imited depth */.
1f10: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
1f20: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20  Format);.  zSql 
1f30: 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
1f40: 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  f(db, zFormat, a
1f50: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
1f60: 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20  ;.  if( zSql==0 
1f70: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20  ){.    return;  
1f80: 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73   /* A malloc mus
1f90: 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f  t have failed */
1fa0: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
1fb0: 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70  ested++;.  memcp
1fc0: 79 28 73 61 76 65 42 75 66 2c 20 26 70 50 61 72  y(saveBuf, &pPar
1fd0: 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53  se->nVar, SAVE_S
1fe0: 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 50  Z);.  memset(&pP
1ff0: 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53  arse->nVar, 0, S
2000: 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74  AVE_SZ);.  sqlit
2010: 65 33 52 75 6e 50 61 72 73 65 72 28 70 50 61 72  e3RunParser(pPar
2020: 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d  se, zSql, &zErrM
2030: 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  sg);.  sqlite3Db
2040: 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67  Free(db, zErrMsg
2050: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
2060: 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20  ee(db, zSql);.  
2070: 6d 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d 3e  memcpy(&pParse->
2080: 6e 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20 53  nVar, saveBuf, S
2090: 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73  AVE_SZ);.  pPars
20a0: 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a  e->nested--;.}..
20b0: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
20c0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
20d0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
20e0: 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  bes a particular
20f0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
2100: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
2110: 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  e of that table 
2120: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
2130: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
2140: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
2150: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
2160: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
2170: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
2180: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
2190: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
21a0: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
21b0: 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  d for the table 
21c0: 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  and the.** first
21d0: 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20   matching table 
21e0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
21f0: 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 64  o checking for d
2200: 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a 2a  uplicate table.*
2210: 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  * names is done.
2220: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
2230: 64 65 72 20 69 73 20 54 45 4d 50 20 66 69 72 73  der is TEMP firs
2240: 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68  t, then MAIN, th
2250: 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69  en any.** auxili
2260: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
2270: 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 41 54  ded using the AT
2280: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  TACH command..**
2290: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
22a0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
22b0: 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  )..*/.Table *sql
22c0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73 71  ite3FindTable(sq
22d0: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
22e0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f   char *zName, co
22f0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 62  nst char *zDatab
2300: 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ase){.  Table *p
2310: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
2320: 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 61 73   int nName;.  as
2330: 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29  sert( zName!=0 )
2340: 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  nName = sqli
2350: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
2360: 65 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74  e);.  /* All mut
2370: 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65  exes are require
2380: 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63  d for schema acc
2390: 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ess.  Make sure 
23a0: 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f  we hold them. */
23b0: 0a 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61  .  assert( zData
23c0: 62 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74  base!=0 || sqlit
23d0: 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
23e0: 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20  utexes(db) );.  
23f0: 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44  for(i=OMIT_TEMPD
2400: 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  B; i<db->nDb; i+
2410: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20  +){.    int j = 
2420: 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b  (i<2) ? i^1 : i;
2430: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45 4d     /* Search TEM
2440: 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f  P before MAIN */
2450: 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62 61  .    if( zDataba
2460: 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  se!=0 && sqlite3
2470: 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73  StrICmp(zDatabas
2480: 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e  e, db->aDb[j].zN
2490: 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ame) ) continue;
24a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
24b0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
24c0: 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b  eld(db, j, 0) );
24d0: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
24e0: 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 44  HashFind(&db->aD
24f0: 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62  b[j].pSchema->tb
2500: 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  lHash, zName, nN
2510: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20  ame);.    if( p 
2520: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
2530: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
2540: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
2550: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
2560: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
2570: 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
2580: 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67  abase.** table g
2590: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
25a0: 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   that table and 
25b0: 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65  (optionally) the
25c0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
25d0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
25e0: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ing the table.  
25f0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
2600: 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20  ot found.  Also 
2610: 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  leave an.** erro
2620: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
2630: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
2640: 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
2650: 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
2660: 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69  routine and sqli
2670: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69  te3FindTable() i
2680: 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72  s that this.** r
2690: 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e  outine leaves an
26a0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
26b0: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
26c0: 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74  g where.** sqlit
26d0: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f  e3FindTable() do
26e0: 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65  es not..*/.Table
26f0: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54   *sqlite3LocateT
2700: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
2710: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
2720: 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69  * context in whi
2730: 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72  ch to report err
2740: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ors */.  int isV
2750: 69 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  iew,            
2760: 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69  /* True if looki
2770: 6e 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61  ng for a VIEW ra
2780: 74 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c  ther than a TABL
2790: 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  E */.  const cha
27a0: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
27b0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
27c0: 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  le we are lookin
27d0: 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  g for */.  const
27e0: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20   char *zDbase   
27f0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2800: 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68   database.  Migh
2810: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
2820: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
2830: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
2840: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
2850: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2860: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2870: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2880: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2890: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
28a0: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
28b0: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
28c0: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
28d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
28e0: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
28f0: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
2900: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
2910: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
2920: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
2930: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69  har *zMsg = isVi
2940: 65 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69  ew ? "no such vi
2950: 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74  ew" : "no such t
2960: 61 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a  able";.    if( z
2970: 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73  Dbase ){.      s
2980: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2990: 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25  Parse, "%s: %s.%
29a0: 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65  s", zMsg, zDbase
29b0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
29c0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
29d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
29e0: 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73  e, "%s: %s", zMs
29f0: 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  g, zName);.    }
2a00: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
2a10: 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
2a20: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
2a30: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
2a40: 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
2a50: 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20  ed by *p..**.** 
2a60: 54 68 69 73 20 69 73 20 61 20 77 72 61 70 70 65  This is a wrappe
2a70: 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33  r around sqlite3
2a80: 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54  LocateTable(). T
2a90: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
2aa0: 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  tween.** sqlite3
2ab0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e  LocateTable() an
2ac0: 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
2ad0: 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
2ae0: 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a  ction restricts.
2af0: 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  ** the search to
2b00: 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68   schema (p->pSch
2b10: 65 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f  ema) if it is no
2b20: 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65  t NULL. p->pSche
2b30: 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e  ma may be.** non
2b40: 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70  -NULL if it is p
2b50: 61 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72  art of a view or
2b60: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
2b70: 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65   definition. See
2b80: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72  .** sqlite3FixSr
2b90: 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74 61  cList() for deta
2ba0: 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ils..*/.Table *s
2bb0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
2bc0: 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a  eItem(.  Parse *
2bd0: 70 50 61 72 73 65 2c 20 0a 20 20 69 6e 74 20 69  pParse, .  int i
2be0: 73 56 69 65 77 2c 20 0a 20 20 73 74 72 75 63 74  sView, .  struct
2bf0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2c00: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
2c10: 20 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28   *zDb;.  assert(
2c20: 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c   p->pSchema==0 |
2c30: 7c 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  | p->zDatabase==
2c40: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53  0 );.  if( p->pS
2c50: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74  chema ){.    int
2c60: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
2c70: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
2c80: 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65  se->db, p->pSche
2c90: 6d 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70  ma);.    zDb = p
2ca0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
2cb0: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c  Db].zName;.  }el
2cc0: 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d  se{.    zDb = p-
2cd0: 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a  >zDatabase;.  }.
2ce0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2cf0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
2d00: 73 65 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e 7a  se, isView, p->z
2d10: 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f  Name, zDb);.}../
2d20: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2d30: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
2d40: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2d50: 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75  es .** a particu
2d60: 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20  lar index given 
2d70: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
2d80: 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68   index.** and th
2d90: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
2da0: 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74  tabase that cont
2db0: 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a  ains the index..
2dc0: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
2dd0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
2de0: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
2df0: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
2e00: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
2e10: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c   for the.** tabl
2e20: 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  e and the first 
2e30: 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69  matching index i
2e40: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
2e50: 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72   checking.** for
2e60: 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78   duplicate index
2e70: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
2e80: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
2e90: 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69  er is.** TEMP fi
2ea0: 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20  rst, then MAIN, 
2eb0: 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61  then any auxilia
2ec0: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
2ed0: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ed.** using the 
2ee0: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a  ATTACH command..
2ef0: 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65  */.Index *sqlite
2f00: 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74  3FindIndex(sqlit
2f10: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
2f20: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
2f30: 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49   char *zDb){.  I
2f40: 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69  ndex *p = 0;.  i
2f50: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  nt i;.  int nNam
2f60: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
2f70: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 2f 2a  n30(zName);.  /*
2f80: 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65   All mutexes are
2f90: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 63   required for sc
2fa0: 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61  hema access.  Ma
2fb0: 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20  ke sure we hold 
2fc0: 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72  them. */.  asser
2fd0: 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71 6c  t( zDb!=0 || sql
2fe0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
2ff0: 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a  lMutexes(db) );.
3000: 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d    for(i=OMIT_TEM
3010: 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  PDB; i<db->nDb; 
3020: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20  i++){.    int j 
3030: 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20  = (i<2) ? i^1 : 
3040: 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  i;  /* Search TE
3050: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
3060: 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  /.    Schema *pS
3070: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
3080: 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  j].pSchema;.    
3090: 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61 20  assert( pSchema 
30a0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26  );.    if( zDb &
30b0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
30c0: 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d  (zDb, db->aDb[j]
30d0: 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e  .zName) ) contin
30e0: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
30f0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
3100: 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29  exHeld(db, j, 0)
3110: 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   );.    p = sqli
3120: 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63  te3HashFind(&pSc
3130: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a  hema->idxHash, z
3140: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
3150: 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b    if( p ) break;
3160: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
3170: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69  .}../*.** Reclai
3180: 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65  m the memory use
3190: 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f  d by an index.*/
31a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
31b0: 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  eIndex(sqlite3 *
31c0: 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a 23  db, Index *p){.#
31d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31e0: 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71 6c  IT_ANALYZE.  sql
31f0: 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 53  ite3DeleteIndexS
3200: 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a 23  amples(db, p);.#
3210: 65 6e 64 69 66 0a 20 20 69 66 28 20 64 62 3d 3d  endif.  if( db==
3220: 30 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73  0 || db->pnBytes
3230: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
3240: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
3250: 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 73  ->pKeyInfo);.  s
3260: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3270: 28 64 62 2c 20 70 2d 3e 70 50 61 72 74 49 64 78  (db, p->pPartIdx
3280: 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65  Where);.  sqlite
3290: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
32a0: 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66 28 20 70  ColAff);.  if( p
32b0: 2d 3e 69 73 52 65 73 69 7a 65 64 20 29 20 73 71  ->isResized ) sq
32c0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
32d0: 70 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20 73 71  p->azColl);.  sq
32e0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
32f0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  p);.}../*.** For
3300: 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c 6c 65   the index calle
3310: 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69 63 68  d zIdxName which
3320: 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65   is found in the
3330: 20 64 61 74 61 62 61 73 65 20 69 44 62 2c 0a 2a   database iDb,.*
3340: 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e  * unlike that in
3350: 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54 61 62  dex from its Tab
3360: 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  le then remove t
3370: 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a  he index from.**
3380: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
3390: 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65 20 61  table and free a
33a0: 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ll memory struct
33b0: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ures associated.
33c0: 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e 64 65  ** with the inde
33d0: 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  x..*/.void sqlit
33e0: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
33f0: 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a  eIndex(sqlite3 *
3400: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
3410: 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d  st char *zIdxNam
3420: 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  e){.  Index *pIn
3430: 64 65 78 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  dex;.  int len;.
3440: 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a    Hash *pHash;..
3450: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3460: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
3470: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
3480: 20 20 70 48 61 73 68 20 3d 20 26 64 62 2d 3e 61    pHash = &db->a
3490: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
34a0: 3e 69 64 78 48 61 73 68 3b 0a 20 20 6c 65 6e 20  >idxHash;.  len 
34b0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
34c0: 30 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70  0(zIdxName);.  p
34d0: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48  Index = sqlite3H
34e0: 61 73 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c  ashInsert(pHash,
34f0: 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2c 20   zIdxName, len, 
3500: 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  0);.  if( ALWAYS
3510: 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20  (pIndex) ){.    
3520: 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  if( pIndex->pTab
3530: 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64  le->pIndex==pInd
3540: 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  ex ){.      pInd
3550: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
3560: 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  ex = pIndex->pNe
3570: 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
3580: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20       Index *p;. 
3590: 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63       /* Justific
35a0: 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28  ation of ALWAYS(
35b0: 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75  );  The index mu
35c0: 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73  st be on the lis
35d0: 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e  t of.      ** in
35e0: 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  dices. */.      
35f0: 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  p = pIndex->pTab
3600: 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  le->pIndex;.    
3610: 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
3620: 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d  p) && p->pNext!=
3630: 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d  pIndex ){ p = p-
3640: 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20  >pNext; }.      
3650: 69 66 28 20 41 4c 57 41 59 53 28 70 20 26 26 20  if( ALWAYS(p && 
3660: 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78  p->pNext==pIndex
3670: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
3680: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
3690: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
36a0: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64     }.    freeInd
36b0: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
36c0: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
36d0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
36e0: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
36f0: 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20 74  * Look through t
3700: 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20  he list of open 
3710: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69  database files i
3720: 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64 20  n db->aDb[] and 
3730: 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20 62  if.** any have b
3740: 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d 6f  een closed, remo
3750: 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
3760: 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63 61   list.  Realloca
3770: 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61 44  te the.** db->aD
3780: 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74 6f  b[] structure to
3790: 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65 2c   a smaller size,
37a0: 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a   if possible..**
37b0: 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68 65  .** Entry 0 (the
37c0: 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65   "main" database
37d0: 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28 74  ) and entry 1 (t
37e0: 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62 61  he "temp" databa
37f0: 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65 72  se).** are never
3800: 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20   candidates for 
3810: 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64 2e  being collapsed.
3820: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3830: 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65  CollapseDatabase
3840: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64  Array(sqlite3 *d
3850: 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  b){.  int i, j;.
3860: 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64    for(i=j=2; i<d
3870: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3880: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
3890: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
38a0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
38b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
38c0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
38d0: 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db->zName);.    
38e0: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30    pDb->zName = 0
38f0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
3900: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3910: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
3920: 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44  >aDb[j] = db->aD
3930: 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b[i];.    }.    
3940: 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  j++;.  }.  memse
3950: 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30  t(&db->aDb[j], 0
3960: 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69  , (db->nDb-j)*si
3970: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29  zeof(db->aDb[j])
3980: 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a  );.  db->nDb = j
3990: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
39a0: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
39b0: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
39c0: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
39d0: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
39e0: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
39f0: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
3a00: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3a10: 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62  db->aDb);.    db
3a20: 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
3a30: 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  tatic;.  }.}../*
3a40: 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 73 63  .** Reset the sc
3a50: 68 65 6d 61 20 66 6f 72 20 74 68 65 20 64 61 74  hema for the dat
3a60: 61 62 61 73 65 20 61 74 20 69 6e 64 65 78 20 69  abase at index i
3a70: 44 62 2e 20 20 41 6c 73 6f 20 72 65 73 65 74 20  Db.  Also reset 
3a80: 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73 63 68 65  the.** TEMP sche
3a90: 6d 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ma..*/.void sqli
3aa0: 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d  te3ResetOneSchem
3ab0: 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  a(sqlite3 *db, i
3ac0: 6e 74 20 69 44 62 29 7b 0a 20 20 44 62 20 2a 70  nt iDb){.  Db *p
3ad0: 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  Db;.  assert( iD
3ae0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
3af0: 2f 2a 20 43 61 73 65 20 31 3a 20 20 52 65 73 65  /* Case 1:  Rese
3b00: 74 20 74 68 65 20 73 69 6e 67 6c 65 20 73 63 68  t the single sch
3b10: 65 6d 61 20 69 64 65 6e 74 69 66 69 65 64 20 62  ema identified b
3b20: 79 20 69 44 62 20 2a 2f 0a 20 20 70 44 62 20 3d  y iDb */.  pDb =
3b30: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
3b40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3b50: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
3b60: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
3b70: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
3b80: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 73  Schema!=0 );.  s
3b90: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
3ba0: 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b  r(pDb->pSchema);
3bb0: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 64 61  ..  /* If any da
3bc0: 74 61 62 61 73 65 20 6f 74 68 65 72 20 74 68 61  tabase other tha
3bd0: 6e 20 54 45 4d 50 20 69 73 20 72 65 73 65 74 2c  n TEMP is reset,
3be0: 20 74 68 65 6e 20 61 6c 73 6f 20 72 65 73 65 74   then also reset
3bf0: 20 54 45 4d 50 0a 20 20 2a 2a 20 73 69 6e 63 65   TEMP.  ** since
3c00: 20 54 45 4d 50 20 6d 69 67 68 74 20 62 65 20 68   TEMP might be h
3c10: 6f 6c 64 69 6e 67 20 74 72 69 67 67 65 72 73 20  olding triggers 
3c20: 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
3c30: 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a  ables in the.  *
3c40: 2a 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  * other database
3c50: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 62  ..  */.  if( iDb
3c60: 21 3d 31 20 29 7b 0a 20 20 20 20 70 44 62 20 3d  !=1 ){.    pDb =
3c70: 20 26 64 62 2d 3e 61 44 62 5b 31 5d 3b 0a 20 20   &db->aDb[1];.  
3c80: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
3c90: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20  Schema!=0 );.   
3ca0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
3cb0: 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61  ear(pDb->pSchema
3cc0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b  );.  }.  return;
3cd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
3ce0: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
3cf0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20  mation from all 
3d00: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
3d10: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  es (including.**
3d20: 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d   "main" and "tem
3d30: 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  p") for a single
3d40: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
3d50: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
3d60: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
3d70: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
3d80: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
3d90: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
3da0: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
3db0: 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  b);.  for(i=0; i
3dc0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
3dd0: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
3de0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
3df0: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  f( pDb->pSchema 
3e00: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3e10: 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d  SchemaClear(pDb-
3e20: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
3e30: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
3e40: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
3e50: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71 6c  rnChanges;.  sql
3e60: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
3e70: 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  st(db);.  sqlite
3e80: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
3e90: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c  b);.  sqlite3Col
3ea0: 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72  lapseDatabaseArr
3eb0: 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ay(db);.}../*.**
3ec0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3ed0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   called when a c
3ee0: 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f  ommit occurs..*/
3ef0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
3f00: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
3f10: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
3f20: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
3f30: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
3f40: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
3f50: 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20 61 6c  Delete memory al
3f60: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
3f70: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 20  column names of 
3f80: 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  a table or view 
3f90: 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e 61 43  (the.** Table.aC
3fa0: 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a 2f 0a  ol[] array)..*/.
3fb0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
3fc0: 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61  teDeleteColumnNa
3fd0: 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mes(sqlite3 *db,
3fe0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
3ff0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75  .  int i;.  Colu
4000: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65  mn *pCol;.  asse
4010: 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b  rt( pTable!=0 );
4020: 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 70  .  if( (pCol = p
4030: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20  Table->aCol)!=0 
4040: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
4050: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
4060: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
4070: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4080: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  e(db, pCol->zNam
4090: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
40a0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
40b0: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
40c0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
40d0: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c  e(db, pCol->zDfl
40e0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
40f0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
4100: 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20  ->zType);.      
4110: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4120: 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a  , pCol->zColl);.
4130: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4140: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
4150: 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d  le->aCol);.  }.}
4160: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
4170: 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73  he memory data s
4180: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
4190: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
41a0: 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e  ven.** Table.  N
41b0: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
41c0: 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68  de to disk by th
41d0: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
41e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
41f0: 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  ust deletes the 
4200: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
4210: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c   It does not unl
4220: 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ink.** the table
4230: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
4240: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
4250: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
4260: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
4270: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
4280: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
4290: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
42a0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
42b0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  ** the table..**
42c0: 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61 6d  .** The db param
42d0: 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c  eter is optional
42e0: 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64 20  .  It is needed 
42f0: 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  if the Table obj
4300: 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ect .** contains
4310: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
4320: 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65 63  y.  (Table objec
4330: 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ts in the schema
4340: 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c   do not use.** l
4350: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c  ookaside memory,
4360: 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d 65   but some epheme
4370: 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
4380: 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a  s do.)  Or the.*
4390: 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 63  * db parameter c
43a0: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
43b0: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
43c0: 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20   to measure the 
43d0: 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62  memory.** used b
43e0: 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  y the Table obje
43f0: 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ct..*/.void sqli
4400: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73  te3DeleteTable(s
4410: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
4420: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e  e *pTable){.  In
4430: 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e  dex *pIndex, *pN
4440: 65 78 74 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  ext;.  TESTONLY(
4450: 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 3b   int nLookaside;
4460: 20 29 20 2f 2a 20 55 73 65 64 20 74 6f 20 76 65   ) /* Used to ve
4470: 72 69 66 79 20 6c 6f 6f 6b 61 73 69 64 65 20 6e  rify lookaside n
4480: 6f 74 20 75 73 65 64 20 66 6f 72 20 73 63 68 65  ot used for sche
4490: 6d 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ma */..  assert(
44a0: 20 21 70 54 61 62 6c 65 20 7c 7c 20 70 54 61 62   !pTable || pTab
44b0: 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20  le->nRef>0 );.. 
44c0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74   /* Do not delet
44d0: 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e 74 69  e the table unti
44e0: 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  l the reference 
44f0: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
4500: 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70 54  ro. */.  if( !pT
4510: 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  able ) return;. 
4520: 20 69 66 28 20 28 28 21 64 62 20 7c 7c 20 64 62   if( ((!db || db
4530: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4540: 30 29 20 26 26 20 28 2d 2d 70 54 61 62 6c 65 2d  0) && (--pTable-
4550: 3e 6e 52 65 66 29 3e 30 29 20 29 20 72 65 74 75  >nRef)>0) ) retu
4560: 72 6e 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64  rn;..  /* Record
4570: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
4580: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61  utstanding looka
4590: 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  side allocations
45a0: 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62 6c 65   in schema Table
45b0: 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20  s.  ** prior to 
45c0: 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65 28 29  doing any free()
45d0: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 53 69   operations.  Si
45e0: 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62 6c 65  nce schema Table
45f0: 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a  s do not use.  *
4600: 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69  * lookaside, thi
4610: 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20  s number should 
4620: 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20  not change. */. 
4630: 20 54 45 53 54 4f 4e 4c 59 28 20 6e 4c 6f 6f 6b   TESTONLY( nLook
4640: 61 73 69 64 65 20 3d 20 28 64 62 20 26 26 20 28  aside = (db && (
4650: 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73  pTable->tabFlags
4660: 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
4670: 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20  ==0) ?.         
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4690: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
46a0: 75 74 20 3a 20 30 20 29 3b 0a 0a 20 20 2f 2a 20  ut : 0 );..  /* 
46b0: 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63  Delete all indic
46c0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
46d0: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  th this table. *
46e0: 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d  /.  for(pIndex =
46f0: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b   pTable->pIndex;
4700: 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d   pIndex; pIndex=
4710: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
4720: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
4730: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
4740: 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  Index->pSchema==
4750: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20  pTable->pSchema 
4760: 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 20 7c  );.    if( !db |
4770: 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  | db->pnBytesFre
4780: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ed==0 ){.      c
4790: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e  har *zName = pIn
47a0: 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20  dex->zName; .   
47b0: 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e     TESTONLY ( In
47c0: 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71  dex *pOld = ) sq
47d0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
47e0: 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e 64 65  .         &pInde
47f0: 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  x->pSchema->idxH
4800: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69  ash, zName, sqli
4810: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
4820: 65 29 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20  e), 0.      );. 
4830: 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 3d       assert( db=
4840: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 63 68  =0 || sqlite3Sch
4850: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
4860: 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68   0, pIndex->pSch
4870: 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 61 73  ema) );.      as
4880: 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 49 6e 64  sert( pOld==pInd
4890: 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d 30 20 29 3b  ex || pOld==0 );
48a0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49  .    }.    freeI
48b0: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
48c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
48d0: 74 65 20 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b  te any foreign k
48e0: 65 79 73 20 61 74 74 61 63 68 65 64 20 74 6f 20  eys attached to 
48f0: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
4900: 20 73 71 6c 69 74 65 33 46 6b 44 65 6c 65 74 65   sqlite3FkDelete
4910: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20  (db, pTable);.. 
4920: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54   /* Delete the T
4930: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  able structure i
4940: 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71  tself..  */.  sq
4950: 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  liteDeleteColumn
4960: 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65  Names(db, pTable
4970: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
4980: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a  ee(db, pTable->z
4990: 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
49a0: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
49b0: 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73  e->zColAff);.  s
49c0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
49d0: 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  te(db, pTable->p
49e0: 53 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66  Select);.#ifndef
49f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
4a00: 43 4b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  CK.  sqlite3Expr
4a10: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
4a20: 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a  Table->pCheck);.
4a30: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
4a40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
4a50: 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65  ALTABLE.  sqlite
4a60: 33 56 74 61 62 43 6c 65 61 72 28 64 62 2c 20 70  3VtabClear(db, p
4a70: 54 61 62 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20  Table);.#endif. 
4a80: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4a90: 62 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f  b, pTable);..  /
4aa0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 6e 6f  * Verify that no
4ab0: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
4ac0: 79 20 77 61 73 20 75 73 65 64 20 62 79 20 73 63  y was used by sc
4ad0: 68 65 6d 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20  hema tables */. 
4ae0: 20 61 73 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73   assert( nLookas
4af0: 69 64 65 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61  ide==0 || nLooka
4b00: 73 69 64 65 3d 3d 64 62 2d 3e 6c 6f 6f 6b 61 73  side==db->lookas
4b10: 69 64 65 2e 6e 4f 75 74 20 29 3b 0a 7d 0a 0a 2f  ide.nOut );.}../
4b20: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20  *.** Unlink the 
4b30: 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d  given table from
4b40: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73   the hash tables
4b50: 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20   and the delete 
4b60: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72  the.** table str
4b70: 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20  ucture with all 
4b80: 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20  its indices and 
4b90: 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f  foreign keys..*/
4ba0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
4bb0: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c  inkAndDeleteTabl
4bc0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  e(sqlite3 *db, i
4bd0: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
4be0: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20  ar *zTabName){. 
4bf0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20   Table *p;.  Db 
4c00: 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
4c10: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   db!=0 );.  asse
4c20: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
4c30: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61  b<db->nDb );.  a
4c40: 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20  ssert( zTabName 
4c50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
4c60: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
4c70: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
4c80: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 7a  );.  testcase( z
4c90: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b  TabName[0]==0 );
4ca0: 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68    /* Zero-length
4cb0: 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65   table names are
4cc0: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44   allowed */.  pD
4cd0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
4ce0: 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ];.  p = sqlite3
4cf0: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d  HashInsert(&pDb-
4d00: 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
4d10: 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 0a 20 20 20  h, zTabName,.   
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d30: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 6c       sqlite3Strl
4d40: 65 6e 33 30 28 7a 54 61 62 4e 61 6d 65 29 2c 30  en30(zTabName),0
4d50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  );.  sqlite3Dele
4d60: 74 65 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a  teTable(db, p);.
4d70: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
4d80: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
4d90: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  ges;.}../*.** Gi
4da0: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74  ven a token, ret
4db0: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
4dc0: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  t consists of th
4dd0: 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a  e text of that.*
4de0: 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20  * token.  Space 
4df0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
4e00: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69  rned string.** i
4e10: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
4e20: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
4e30: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
4e40: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
4e50: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  ** function..**.
4e60: 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e  ** Any quotation
4e70: 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e 61   marks (ex:  "na
4e80: 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61  me", 'name', [na
4e90: 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20  me], or `name`) 
4ea0: 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64  that.** surround
4eb0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
4ec0: 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76   token are remov
4ed0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73  ed..**.** Tokens
4ee0: 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20   are often just 
4ef0: 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68  pointers into th
4f00: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74  e original SQL t
4f10: 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72  ext and so.** ar
4f20: 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69  e not \000 termi
4f30: 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f  nated and are no
4f40: 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54  t persistent.  T
4f50: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
4f60: 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65  ng.** is \000 te
4f70: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20  rminated and is 
4f80: 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63  persistent..*/.c
4f90: 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65  har *sqlite3Name
4fa0: 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65  FromToken(sqlite
4fb0: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
4fc0: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
4fd0: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
4fe0: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
4ff0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
5000: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d  (db, (char*)pNam
5010: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
5020: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
5030: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ote(zName);.  }e
5040: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
5050: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5060: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
5070: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
5080: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74  _master table st
5090: 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65  ored in database
50a0: 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a   number iDb for.
50b0: 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20  ** writing. The 
50c0: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  table is opened 
50d0: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a  using cursor 0..
50e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f  */.void sqlite3O
50f0: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50  penMasterTable(P
5100: 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  arse *p, int iDb
5110: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
5120: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29  qlite3GetVdbe(p)
5130: 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  ;.  sqlite3Table
5140: 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53  Lock(p, iDb, MAS
5150: 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53 43 48  TER_ROOT, 1, SCH
5160: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b  EMA_TABLE(iDb));
5170: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
5180: 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 4f 70  dOp4Int(v, OP_Op
5190: 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54  enWrite, 0, MAST
51a0: 45 52 5f 52 4f 4f 54 2c 20 69 44 62 2c 20 35 29  ER_ROOT, iDb, 5)
51b0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d  ;.  if( p->nTab=
51c0: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61  =0 ){.    p->nTa
51d0: 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  b = 1;.  }.}../*
51e0: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e  .** Parameter zN
51f0: 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ame points to a 
5200: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 62  nul-terminated b
5210: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
5220: 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
5230: 61 20 64 61 74 61 62 61 73 65 20 28 22 6d 61 69  a database ("mai
5240: 6e 22 2c 20 22 74 65 6d 70 22 20 6f 72 20 74 68  n", "temp" or th
5250: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74  e name of an att
5260: 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 0a  ached db). This.
5270: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
5280: 72 6e 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66  rns the index of
5290: 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62   the named datab
52a0: 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  ase in db->aDb[]
52b0: 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68  , or.** -1 if th
52c0: 65 20 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f  e named db canno
52d0: 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69  t be found..*/.i
52e0: 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62  nt sqlite3FindDb
52f0: 4e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62  Name(sqlite3 *db
5300: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
5310: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ame){.  int i = 
5320: 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  -1;         /* D
5330: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
5340: 2f 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  /.  if( zName ){
5350: 0a 20 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20  .    Db *pDb;.  
5360: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
5370: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
5380: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d  ;.    for(i=(db-
5390: 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62  >nDb-1), pDb=&db
53a0: 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20  ->aDb[i]; i>=0; 
53b0: 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20  i--, pDb--){.   
53c0: 20 20 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45     if( (!OMIT_TE
53d0: 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26  MPDB || i!=1 ) &
53e0: 26 20 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  & n==sqlite3Strl
53f0: 65 6e 33 30 28 70 44 62 2d 3e 7a 4e 61 6d 65 29  en30(pDb->zName)
5400: 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 30   && .          0
5410: 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
5420: 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  (pDb->zName, zNa
5430: 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  me) ){.        b
5440: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5450: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5460: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   i;.}../*.** The
5470: 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f   token *pName co
5480: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20  ntains the name 
5490: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65  of a database (e
54a0: 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a  ither "main" or.
54b0: 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65  ** "temp" or the
54c0: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61   name of an atta
54d0: 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72  ched db). This r
54e0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
54f0: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74  he.** index of t
5500: 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  he named databas
5510: 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20  e in db->aDb[], 
5520: 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d  or -1 if the nam
5530: 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e  ed db .** does n
5540: 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74  ot exist..*/.int
5550: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73   sqlite3FindDb(s
5560: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
5570: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  n *pName){.  int
5580: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
55b0: 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mber */.  char *
55c0: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
55e0: 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65  * Name we are se
55f0: 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20  arching for */. 
5600: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
5610: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
5620: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20  , pName);.  i = 
5630: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
5640: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
5650: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5660: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  , zName);.  retu
5670: 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20  rn i;.}../* The 
5680: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72  table or view or
5690: 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73   trigger name is
56a0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
56b0: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
56c0: 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64  ns.** pName1 and
56d0: 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20   pName2. If the 
56e0: 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66  table name was f
56f0: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
5700: 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  for example:.**.
5710: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
5720: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a  xxx.yyy (...);.*
5730: 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  * .** Then pName
5740: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
5750: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
5760: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
5770: 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20   hand if.** the 
5780: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
5790: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
57a0: 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43  d, i.e.:.**.** C
57b0: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
57c0: 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  ...);.**.** Then
57d0: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
57e0: 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d  o "yyy" and pNam
57f0: 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20  e2 is ""..**.** 
5800: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
5810: 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20  s the *ppUnqual 
5820: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
5830: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
5840: 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d  Name1 or.** pNam
5850: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
5860: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
5870: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65  table name.  The
5880: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
5890: 20 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20   database "xxx" 
58a0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
58b0: 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61  int sqlite3TwoPa
58c0: 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  rtName(.  Parse 
58d0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
58e0: 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64   Parsing and cod
58f0: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
5900: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
5910: 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a  *pName1,      /*
5920: 20 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68   The "xxx" in th
5930: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
5940: 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54   or "xxx" */.  T
5950: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
5960: 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20     /* The "yyy" 
5970: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
5980: 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e  .yyy" */.  Token
5990: 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f   **pUnqual     /
59a0: 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75  * Write the unqu
59b0: 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e  alified object n
59c0: 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ame here */.){. 
59d0: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
59f0: 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
5a00: 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   the object */. 
5a10: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
5a20: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
5a30: 28 20 41 4c 57 41 59 53 28 70 4e 61 6d 65 32 21  ( ALWAYS(pName2!
5a40: 3d 30 29 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e  =0) && pName2->n
5a50: 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  >0 ){.    if( db
5a60: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a  ->init.busy ) {.
5a70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
5a80: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
5a90: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 22  orrupt database"
5aa0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
5ab0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
5ac0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
5ad0: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
5ae0: 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d  Name2;.    iDb =
5af0: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64   sqlite3FindDb(d
5b00: 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
5b10: 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
5b20: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5b30: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e  sg(pParse, "unkn
5b40: 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22  own database %T"
5b50: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20  , pName1);.     
5b60: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
5b70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
5b80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
5b90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
5ba0: 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20  >init.iDb==0 || 
5bb0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b  db->init.busy );
5bc0: 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69  .    iDb = db->i
5bd0: 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55  nit.iDb;.    *pU
5be0: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a  nqual = pName1;.
5bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62    }.  return iDb
5c00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5c10: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
5c20: 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  to check if the 
5c30: 55 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61  UTF-8 string zNa
5c40: 6d 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a  me is a legal.**
5c50: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   unqualified nam
5c60: 65 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65  e for a new sche
5c70: 6d 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65  ma object (table
5c80: 2c 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72  , index, view or
5c90: 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c  .** trigger). Al
5ca0: 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61  l names are lega
5cb0: 6c 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 74  l except those t
5cc0: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 74  hat begin with t
5cd0: 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71  he string.** "sq
5ce0: 6c 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72  lite_" (in upper
5cf0: 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64  , lower or mixed
5d00: 20 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72   case). This por
5d10: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65  tion of the name
5d20: 73 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65  space.** is rese
5d30: 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  rved for interna
5d40: 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  l use..*/.int sq
5d50: 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
5d60: 4e 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72  Name(Parse *pPar
5d70: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
5d80: 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70  zName){.  if( !p
5d90: 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e  Parse->db->init.
5da0: 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e  busy && pParse->
5db0: 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20  nested==0 .     
5dc0: 20 20 20 20 20 26 26 20 28 70 50 61 72 73 65 2d       && (pParse-
5dd0: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
5de0: 49 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29  ITE_WriteSchema)
5df0: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  ==0.          &&
5e00: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49   0==sqlite3StrNI
5e10: 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  Cmp(zName, "sqli
5e20: 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20  te_", 7) ){.    
5e30: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5e40: 70 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20  pParse, "object 
5e50: 6e 61 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f  name reserved fo
5e60: 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20  r internal use: 
5e70: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
5e80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
5e90: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
5ea0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5eb0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5ec0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
5ed0: 64 65 78 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  dex of a table.*
5ee0: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
5ef0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
5f00: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
5f10: 49 6e 64 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28  Index *p;.  for(
5f20: 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  p=pTab->pIndex; 
5f30: 70 20 26 26 20 70 2d 3e 61 75 74 6f 49 6e 64 65  p && p->autoInde
5f40: 78 21 3d 32 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  x!=2; p=p->pNext
5f50: 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ){}.  return p;.
5f60: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5f70: 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  the column of in
5f80: 64 65 78 20 70 49 64 78 20 74 68 61 74 20 63 6f  dex pIdx that co
5f90: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 61 62  rresponds to tab
5fa0: 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f  le.** column iCo
5fb0: 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  l.  Return -1 if
5fc0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
5fd0: 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e  16 sqlite3Column
5fe0: 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70  OfIndex(Index *p
5ff0: 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a  Idx, i16 iCol){.
6000: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
6010: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; i<pIdx->nCol
6020: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  umn; i++){.    i
6030: 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61  f( iCol==pIdx->a
6040: 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74  iColumn[i] ) ret
6050: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
6060: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
6070: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74   Begin construct
6080: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20  ing a new table 
6090: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69  representation i
60a0: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
60b0: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  is.** the first 
60c0: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f  of several actio
60d0: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20  n routines that 
60e0: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65  get called in re
60f0: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43  sponse.** to a C
6100: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
6110: 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69  ement.  In parti
6120: 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74  cular, this rout
6130: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  ine is called.**
6140: 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f   after seeing to
6150: 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e  kens "CREATE" an
6160: 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68  d "TABLE" and th
6170: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  e table name. Th
6180: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67  e isTemp.** flag
6190: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
61a0: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  table should be 
61b0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75  stored in the au
61c0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
61d0: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64  .** file instead
61e0: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   of in the main 
61f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
6200: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  This is normally
6210: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
6220: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20  n the "TEMP" or 
6230: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77  "TEMPORARY" keyw
6240: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65  ord occurs in be
6250: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20  tween.** CREATE 
6260: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a  and TABLE..**.**
6270: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   The new table r
6280: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c  ecord is initial
6290: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20  ized and put in 
62a0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
62b0: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66  e..** As more of
62c0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
62d0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70  E statement is p
62e0: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61  arsed, additiona
62f0: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74  l action.** rout
6300: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c  ines will be cal
6310: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20  led to add more 
6320: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74  information to t
6330: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41  his record..** A
6340: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
6350: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6360: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c  atement, the sql
6370: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72  ite3EndTable() r
6380: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
6390: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  led to complete 
63a0: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  the construction
63b0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
63c0: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69  e record..*/.voi
63d0: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61  d sqlite3StartTa
63e0: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
63f0: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65  arse,   /* Parse
6400: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  r context */.  T
6410: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
6420: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66  /* First part of
6430: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
6440: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a   table or view *
6450: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
6460: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70  2,   /* Second p
6470: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  art of the name 
6480: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
6490: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73  view */.  int is
64a0: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72  Temp,      /* Tr
64b0: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
64c0: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEMP table */.  
64d0: 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20  int isView,     
64e0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
64f0: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20   is a VIEW */.  
6500: 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20  int isVirtual,  
6510: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
6520: 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61   is a VIRTUAL ta
6530: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  ble */.  int noE
6540: 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  rr        /* Do 
6550: 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65  nothing if table
6560: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
6570: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
6580: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
6590: 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65  Name = 0; /* The
65a0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77   name of the new
65b0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
65c0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
65d0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ->db;.  Vdbe *v;
65e0: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
65f0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
6600: 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65  number to create
6610: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f   the table in */
6620: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b  .  Token *pName;
6630: 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
6640: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  ed name of the t
6650: 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a  able to create *
6660: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  /..  /* The tabl
6670: 65 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74  e or view name t
6680: 6f 20 63 72 65 61 74 65 20 69 73 20 70 61 73 73  o create is pass
6690: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
66a0: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20  ne via tokens.  
66b0: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
66c0: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
66d0: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
66e0: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
66f0: 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   example:.  **. 
6700: 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
6710: 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a   xxx.yyy (...);.
6720: 20 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20    ** .  ** Then 
6730: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
6740: 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65   "xxx" and pName
6750: 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20  2 "yyy". On the 
6760: 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20  other hand if.  
6770: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  ** the table nam
6780: 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71  e is not fully q
6790: 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a  ualified, i.e.:.
67a0: 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45    **.  ** CREATE
67b0: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
67c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
67d0: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
67e0: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
67f0: 32 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20  2 is ""..  **.  
6800: 2a 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f  ** The call belo
6810: 77 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65  w sets the pName
6820: 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   pointer to poin
6830: 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28  t at the token (
6840: 70 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70  pName1 or.  ** p
6850: 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72  Name2) that stor
6860: 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  es the unqualifi
6870: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  ed table name. T
6880: 68 65 20 76 61 72 69 61 62 6c 65 20 69 44 62 20  he variable iDb 
6890: 69 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74  is.  ** set to t
68a0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
68b0: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 74 68  database that th
68c0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
68d0: 69 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72  is to be.  ** cr
68e0: 65 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20  eated in..  */. 
68f0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
6900: 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
6910: 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
6920: 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  , &pName);.  if(
6930: 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
6940: 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d  .  if( !OMIT_TEM
6950: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26  PDB && isTemp &&
6960: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20   pName2->n>0 && 
6970: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  iDb!=1 ){.    /*
6980: 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74   If creating a t
6990: 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e  emp table, the n
69a0: 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71  ame may not be q
69b0: 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73  ualified. Unless
69c0: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74   .    ** the dat
69d0: 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74  abase name is "t
69e0: 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f  emp" anyway.  */
69f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
6a00: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65  rMsg(pParse, "te
6a10: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61  mporary table na
6a20: 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61  me must be unqua
6a30: 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72 65  lified");.    re
6a40: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
6a50: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
6a60: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
6a70: 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61  ;..  pParse->sNa
6a80: 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65  meToken = *pName
6a90: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
6aa0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
6ab0: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  (db, pName);.  i
6ac0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
6ad0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49  turn;.  if( SQLI
6ae0: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
6af0: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
6b00: 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
6b10: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6b20: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
6b30: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69    if( db->init.i
6b40: 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d  Db==1 ) isTemp =
6b50: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
6b60: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
6b70: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
6b80: 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73  (isTemp & 1)==is
6b90: 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20  Temp );.  {.    
6ba0: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68  int code;.    ch
6bb0: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
6bc0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
6bd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
6be0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
6bf0: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
6c00: 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
6c10: 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
6c20: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
6c30: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
6c40: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
6c50: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
6c60: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
6c70: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
6c80: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
6c90: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b  REATE_TEMP_VIEW;
6ca0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6cb0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
6cc0: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b  ITE_CREATE_VIEW;
6cd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
6ce0: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
6cf0: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
6d00: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
6d10: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
6d20: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  EATE_TEMP_TABLE;
6d30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6d40: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
6d50: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
6d60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6d70: 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75      if( !isVirtu
6d80: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74  al && sqlite3Aut
6d90: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
6da0: 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a  ode, zName, 0, z
6db0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
6dc0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6dd0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ror;.    }.  }.#
6de0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
6df0: 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61   sure the new ta
6e00: 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f  ble name does no
6e10: 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61  t collide with a
6e20: 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
6e30: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e  index or table n
6e40: 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ame in the same 
6e50: 64 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65  database.  Issue
6e60: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
6e70: 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65  e if.  ** it doe
6e80: 73 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  s. The exception
6e90: 20 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65   is if the state
6ea0: 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65  ment being parse
6eb0: 64 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a  d was passed.  *
6ec0: 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  * to an sqlite3_
6ed0: 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63  declare_vtab() c
6ee0: 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73  all. In that cas
6ef0: 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  e only the colum
6f00: 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64  n names.  ** and
6f10: 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75   types will be u
6f20: 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73  sed, so there is
6f30: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74   no need to test
6f40: 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20   for namespace. 
6f50: 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a   ** collisions..
6f60: 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44    */.  if( !IN_D
6f70: 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20  ECLARE_VTAB ){. 
6f80: 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64     char *zDb = d
6f90: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
6fa0: 65 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  e;.    if( SQLIT
6fb0: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
6fc0: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
6fd0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
6fe0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6ff0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c  .    }.    pTabl
7000: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
7010: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
7020: 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54  zDb);.    if( pT
7030: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66  able ){.      if
7040: 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  ( !noErr ){.    
7050: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7060: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
7070: 6c 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78  le %T already ex
7080: 69 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  ists", pName);. 
7090: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
70a0: 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d      assert( !db-
70b0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
70c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
70d0: 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
70e0: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
70f0: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62    }.      goto b
7100: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7110: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
7120: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
7130: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29  (db, zName, zDb)
7140: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
7150: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7160: 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61  rse, "there is a
7170: 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20  lready an index 
7180: 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
7190: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  );.      goto be
71a0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
71b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54  .    }.  }..  pT
71c0: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62  able = sqlite3Db
71d0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
71e0: 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
71f0: 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29   if( pTable==0 )
7200: 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  {.    db->malloc
7210: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
7220: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
7230: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70  ITE_NOMEM;.    p
7240: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
7250: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
7260: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ble_error;.  }. 
7270: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d   pTable->zName =
7280: 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65   zName;.  pTable
7290: 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20  ->iPKey = -1;.  
72a0: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20  pTable->pSchema 
72b0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
72c0: 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65  Schema;.  pTable
72d0: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54  ->nRef = 1;.  pT
72e0: 61 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 20 3d 20  able->nRowEst = 
72f0: 31 30 34 38 35 37 36 3b 0a 20 20 61 73 73 65 72  1048576;.  asser
7300: 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  t( pParse->pNewT
7310: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61  able==0 );.  pPa
7320: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
7330: 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49   pTable;..  /* I
7340: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61  f this is the ma
7350: 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65  gic sqlite_seque
7360: 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62  nce table used b
7370: 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c  y autoincrement,
7380: 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72  .  ** then recor
7390: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
73a0: 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65  his table in the
73b0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
73c0: 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f  tructure.  ** so
73d0: 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e   that INSERT can
73e0: 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   find the table 
73f0: 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  easily..  */.#if
7400: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7410: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
7420: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65   if( !pParse->ne
7430: 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a  sted && strcmp(z
7440: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65  Name, "sqlite_se
7450: 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20  quence")==0 ){. 
7460: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
7470: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
7480: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
7490: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63  .    pTable->pSc
74a0: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20  hema->pSeqTab = 
74b0: 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  pTable;.  }.#end
74c0: 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  if..  /* Begin g
74d0: 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f  enerating the co
74e0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73  de that will ins
74f0: 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65  ert the table re
7500: 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  cord into.  ** t
7510: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
7520: 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e   table.  Note in
7530: 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74   particular that
7540: 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61   we must go ahea
7550: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63  d.  ** and alloc
7560: 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ate the record n
7570: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
7580: 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20  ble entry now.  
7590: 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20  Before any.  ** 
75a0: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
75b0: 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61  NIQUE keywords a
75c0: 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73  re parsed.  Thos
75d0: 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20  e keywords will 
75e0: 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63  cause.  ** indic
75f0: 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  es to be created
7600: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72   and the table r
7610: 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20  ecord must come 
7620: 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  before the .  **
7630: 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65   indices.  Hence
7640: 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  , the record num
7650: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
7660: 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  e must be alloca
7670: 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20  ted.  ** now..  
7680: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
7690: 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20  it.busy && (v = 
76a0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
76b0: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
76c0: 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20 20 69 6e    int j1;.    in
76d0: 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20  t fileFormat;.  
76e0: 20 20 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32    int reg1, reg2
76f0: 2c 20 72 65 67 33 3b 0a 20 20 20 20 73 71 6c 69  , reg3;.    sqli
7700: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
7710: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
7720: 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
7730: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
7740: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
7750: 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  ( isVirtual ){. 
7760: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7770: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65  AddOp0(v, OP_VBe
7780: 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  gin);.    }.#end
7790: 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
77a0: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e  e file format an
77b0: 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68  d encoding in th
77c0: 65 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20  e database have 
77d0: 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20  not been set, . 
77e0: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e     ** set them n
77f0: 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ow..    */.    r
7800: 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65  eg1 = pParse->re
7810: 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73  gRowid = ++pPars
7820: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
7830: 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52  2 = pParse->regR
7840: 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oot = ++pParse->
7850: 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d  nMem;.    reg3 =
7860: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
7870: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7880: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61  AddOp3(v, OP_Rea
7890: 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65  dCookie, iDb, re
78a0: 67 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46  g3, BTREE_FILE_F
78b0: 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69  ORMAT);.    sqli
78c0: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
78d0: 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 6a 31  (v, iDb);.    j1
78e0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
78f0: 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72  dOp1(v, OP_If, r
7900: 65 67 33 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f  eg3);.    fileFo
7910: 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67  rmat = (db->flag
7920: 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63  s & SQLITE_Legac
7930: 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20  yFileFmt)!=0 ?. 
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7950: 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f   1 : SQLITE_MAX_
7960: 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20  FILE_FORMAT;.   
7970: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7980: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
7990: 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c 20 72 65  , fileFormat, re
79a0: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
79b0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
79c0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
79d0: 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d   BTREE_FILE_FORM
79e0: 41 54 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73  AT, reg3);.    s
79f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7a00: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
7a10: 45 4e 43 28 64 62 29 2c 20 72 65 67 33 29 3b 0a  ENC(db), reg3);.
7a20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7a30: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
7a40: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
7a50: 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2c  E_TEXT_ENCODING,
7a60: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
7a70: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
7a80: 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  v, j1);..    /* 
7a90: 54 68 69 73 20 6a 75 73 74 20 63 72 65 61 74 65  This just create
7aa0: 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72  s a place-holder
7ab0: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73   record in the s
7ac0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
7ad0: 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  le..    ** The r
7ae0: 65 63 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f  ecord created do
7af0: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
7b00: 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74  nything yet.  It
7b10: 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65   will be replace
7b20: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
7b30: 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f  real entry in co
7b40: 64 65 20 67 65 6e 65 72 61 74 65 64 20 61 74 20  de generated at 
7b50: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
7b60: 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
7b70: 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   The rowid for t
7b80: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20  he new entry is 
7b90: 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72  left in register
7ba0: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
7bb0: 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  d..    ** The ro
7bc0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
7bd0: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
7be0: 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 20 70  is left in reg p
7bf0: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a  Parse->regRoot..
7c00: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64      ** The rowid
7c10: 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 6e   and root page n
7c20: 75 6d 62 65 72 20 76 61 6c 75 65 73 20 61 72 65  umber values are
7c30: 20 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 63   needed by the c
7c40: 6f 64 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ode that.    ** 
7c50: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20  sqlite3EndTable 
7c60: 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20  will generate.. 
7c70: 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e     */.#if !defin
7c80: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
7c90: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
7ca0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
7cb0: 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69  TUALTABLE).    i
7cc0: 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56  f( isView || isV
7cd0: 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20  irtual ){.      
7ce0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7cf0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
7d00: 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d   0, reg2);.    }
7d10: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
7d20: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
7d30: 61 64 64 72 43 72 54 61 62 20 3d 20 73 71 6c 69  addrCrTab = sqli
7d40: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7d50: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c   OP_CreateTable,
7d60: 20 69 44 62 2c 20 72 65 67 32 29 3b 0a 20 20 20   iDb, reg2);.   
7d70: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70   }.    sqlite3Op
7d80: 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50  enMasterTable(pP
7d90: 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
7da0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7db0: 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
7dc0: 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  , 0, reg1);.    
7dd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7de0: 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
7df0: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
7e00: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7e10: 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72   OP_Insert, 0, r
7e20: 65 67 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20  eg3, reg1);.    
7e30: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7e40: 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50  eP5(v, OPFLAG_AP
7e50: 50 45 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74  PEND);.    sqlit
7e60: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
7e70: 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a  OP_Close);.  }..
7e80: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e    /* Normal (non
7e90: 2d 65 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20  -error) return. 
7ea0: 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20  */.  return;..  
7eb0: 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
7ec0: 63 63 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68  ccurs, we jump h
7ed0: 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62  ere */.begin_tab
7ee0: 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  le_error:.  sqli
7ef0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
7f00: 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  ame);.  return;.
7f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61  }../*.** This ma
7f20: 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63  cro is used to c
7f30: 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e  ompare two strin
7f40: 67 73 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73  gs in a case-ins
7f50: 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e  ensitive manner.
7f60: 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74  .** It is slight
7f70: 6c 79 20 66 61 73 74 65 72 20 74 68 61 6e 20 63  ly faster than c
7f80: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74  alling sqlite3St
7f90: 72 49 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79  rICmp() directly
7fa0: 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65  , but.** produce
7fb0: 73 20 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a  s larger code..*
7fc0: 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68  *.** WARNING: Th
7fd0: 69 73 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20  is macro is not 
7fe0: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
7ff0: 74 68 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d  the strcmp() fam
8000: 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72  ily. It.** retur
8010: 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74  ns true if the t
8020: 77 6f 20 73 74 72 69 6e 67 73 20 61 72 65 20 65  wo strings are e
8030: 71 75 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20  qual, otherwise 
8040: 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  false..*/.#defin
8050: 65 20 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20  e STRICMP(x, y) 
8060: 28 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54  (\.sqlite3UpperT
8070: 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65  oLower[*(unsigne
8080: 64 20 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20  d char *)(x)]== 
8090: 20 20 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72    \.sqlite3Upper
80a0: 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e  ToLower[*(unsign
80b0: 65 64 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20  ed char *)(y)]  
80c0: 20 20 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53     \.&& sqlite3S
80d0: 74 72 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29  trICmp((x)+1,(y)
80e0: 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20  +1)==0 )../*.** 
80f0: 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e  Add a new column
8100: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75   to the table cu
8110: 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
8120: 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a  nstructed..**.**
8130: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
8140: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  s this routine o
8150: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  nce for each col
8160: 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  umn declaration.
8170: 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ** in a CREATE T
8180: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
8190: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
81a0: 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64  le() gets called
81b0: 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74  .** first to get
81c0: 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20   things going.  
81d0: 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  Then this routin
81e0: 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
81f0: 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a  each.** column..
8200: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
8210: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
8220: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
8230: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
8240: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
8250: 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20  ar *z;.  Column 
8260: 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33  *pCol;.  sqlite3
8270: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
8280: 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  b;.  if( (p = pP
8290: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
82a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69  ==0 ) return;.#i
82b0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
82c0: 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f  UMN.  if( p->nCo
82d0: 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  l+1>db->aLimit[S
82e0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
82f0: 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MN] ){.    sqlit
8300: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8310: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c  e, "too many col
8320: 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e  umns on %s", p->
8330: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
8340: 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  rn;.  }.#endif. 
8350: 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
8360: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e  FromToken(db, pN
8370: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  ame);.  if( z==0
8380: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
8390: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b  (i=0; i<p->nCol;
83a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53   i++){.    if( S
83b0: 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f  TRICMP(z, p->aCo
83c0: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20  l[i].zName) ){. 
83d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
83e0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
83f0: 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e  plicate column n
8400: 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20  ame: %s", z);.  
8410: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8420: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
8430: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
8440: 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c  }.  if( (p->nCol
8450: 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20   & 0x7)==0 ){.  
8460: 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a    Column *aNew;.
8470: 20 20 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74      aNew = sqlit
8480: 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70  e3DbRealloc(db,p
8490: 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b  ->aCol,(p->nCol+
84a0: 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f  8)*sizeof(p->aCo
84b0: 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  l[0]));.    if( 
84c0: 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aNew==0 ){.     
84d0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
84e0: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  b, z);.      ret
84f0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
8500: 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20  ->aCol = aNew;. 
8510: 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e   }.  pCol = &p->
8520: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20  aCol[p->nCol];. 
8530: 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c   memset(pCol, 0,
8540: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b   sizeof(p->aCol[
8550: 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e  0]));.  pCol->zN
8560: 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20  ame = z;. .  /* 
8570: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74  If there is no t
8580: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63  ype specified, c
8590: 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20  olumns have the 
85a0: 64 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79  default affinity
85b0: 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66  .  ** 'NONE'. If
85c0: 20 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65   there is a type
85d0: 20 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e   specified, then
85e0: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
85f0: 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a  nType() will.  *
8600: 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74  * be called next
8610: 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66   to set pCol->af
8620: 66 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79  finity correctly
8630: 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61  ..  */.  pCol->a
8640: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
8650: 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f  _AFF_NONE;.  pCo
8660: 6c 2d 3e 73 7a 45 73 74 20 3d 20 31 3b 0a 20 20  l->szEst = 1;.  
8670: 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a  p->nCol++;.}../*
8680: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8690: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
86a0: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
86b0: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
86c0: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
86d0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
86e0: 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c  ent.  A "NOT NUL
86f0: 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  L" constraint ha
8700: 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f  s.** been seen o
8710: 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69  n a column.  Thi
8720: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
8730: 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20  he notNull flag 
8740: 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  on.** the column
8750: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
8760: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a   construction..*
8770: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
8780: 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a  dNotNull(Parse *
8790: 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72  pParse, int onEr
87a0: 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ror){.  Table *p
87b0: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
87c0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
87d0: 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70   p==0 || NEVER(p
87e0: 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75  ->nCol<1) ) retu
87f0: 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d  rn;.  p->aCol[p-
8800: 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c  >nCol-1].notNull
8810: 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a   = (u8)onError;.
8820: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68  }../*.** Scan th
8830: 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61  e column type na
8840: 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68  me zType (length
8850: 20 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75   nType) and retu
8860: 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69  rn the.** associ
8870: 61 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79  ated affinity ty
8880: 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  pe..**.** This r
8890: 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61  outine does a ca
88a0: 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73  se-independent s
88b0: 65 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66  earch of zType f
88c0: 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74  or the .** subst
88d0: 72 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c  rings in the fol
88e0: 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66  lowing table. If
88f0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73   one of the subs
8900: 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75  trings is.** fou
8910: 6e 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f  nd, the correspo
8920: 6e 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69  nding affinity i
8930: 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a  s returned. If z
8940: 54 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  Type contains.**
8950: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f   more than one o
8960: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73  f the substrings
8970: 2c 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64  , entries toward
8980: 20 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20   the top of .** 
8990: 74 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70  the table take p
89a0: 72 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61  riority. For exa
89b0: 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69  mple, if zType i
89c0: 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a  s 'BLOBINT', .**
89d0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
89e0: 47 45 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e  GER is returned.
89f0: 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67  .**.** Substring
8a00: 20 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a       | Affinity.
8a10: 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
8a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a30: 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20  ---.** 'INT'    
8a40: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
8a50: 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48  F_INTEGER.** 'CH
8a60: 41 52 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  AR'        | SQL
8a70: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
8a80: 27 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20  'CLOB'        | 
8a90: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
8aa0: 2a 2a 20 27 54 45 58 54 27 20 20 20 20 20 20 20  ** 'TEXT'       
8ab0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
8ac0: 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20  XT.** 'BLOB'    
8ad0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8ae0: 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20  _NONE.** 'REAL' 
8af0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8b00: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f  AFF_REAL.** 'FLO
8b10: 41 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  A'        | SQLI
8b20: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27  TE_AFF_REAL.** '
8b30: 44 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20 53  DOUB'        | S
8b40: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
8b50: 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20  *.** If none of 
8b60: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
8b70: 6e 20 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c  n the above tabl
8b80: 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20  e are found,.** 
8b90: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
8ba0: 49 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  IC is returned..
8bb0: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41  */.char sqlite3A
8bc0: 66 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73  ffinityType(cons
8bd0: 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20 75 38 20  t char *zIn, u8 
8be0: 2a 70 73 7a 45 73 74 29 7b 0a 20 20 75 33 32 20  *pszEst){.  u32 
8bf0: 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66  h = 0;.  char af
8c00: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
8c10: 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20  UMERIC;.  const 
8c20: 63 68 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b  char *zChar = 0;
8c30: 0a 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29  ..  if( zIn==0 )
8c40: 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 20 20 77   return aff;.  w
8c50: 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a  hile( zIn[0] ){.
8c60: 20 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b      h = (h<<8) +
8c70: 20 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c   sqlite3UpperToL
8c80: 6f 77 65 72 5b 28 2a 7a 49 6e 29 26 30 78 66 66  ower[(*zIn)&0xff
8c90: 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20  ];.    zIn++;.  
8ca0: 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c    if( h==(('c'<<
8cb0: 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27  24)+('h'<<16)+('
8cc0: 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20  a'<<8)+'r') ){  
8cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48             /* CH
8ce0: 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  AR */.      aff 
8cf0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
8d00: 54 3b 0a 20 20 20 20 20 20 7a 43 68 61 72 20 3d  T;.      zChar =
8d10: 20 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20   zIn;.    }else 
8d20: 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34  if( h==(('c'<<24
8d30: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
8d40: 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20  <<8)+'b') ){    
8d50: 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20     /* CLOB */.  
8d60: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
8d70: 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d  _AFF_TEXT;.    }
8d80: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74  else if( h==(('t
8d90: 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29  '<<24)+('e'<<16)
8da0: 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29  +('x'<<8)+'t') )
8db0: 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20  {       /* TEXT 
8dc0: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
8dd0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
8de0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
8df0: 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27  =(('b'<<24)+('l'
8e00: 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27  <<16)+('o'<<8)+'
8e10: 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b')          /* 
8e20: 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20  BLOB */.        
8e30: 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f  && (aff==SQLITE_
8e40: 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61  AFF_NUMERIC || a
8e50: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff==SQLITE_AFF_R
8e60: 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66  EAL) ){.      af
8e70: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  f = SQLITE_AFF_N
8e80: 4f 4e 45 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ONE;.      if( z
8e90: 49 6e 5b 30 5d 3d 3d 27 28 27 20 29 20 7a 43 68  In[0]=='(' ) zCh
8ea0: 61 72 20 3d 20 7a 49 6e 3b 0a 23 69 66 6e 64 65  ar = zIn;.#ifnde
8eb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
8ec0: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
8ed0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
8ee0: 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  'r'<<24)+('e'<<1
8ef0: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29  6)+('a'<<8)+'l')
8f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41            /* REA
8f10: 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  L */.        && 
8f20: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
8f30: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
8f40: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8f50: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
8f60: 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c  e if( h==(('f'<<
8f70: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
8f80: 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20  o'<<8)+'a')     
8f90: 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a       /* FLOA */.
8fa0: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
8fb0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
8fc0: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
8fd0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
8fe0: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
8ff0: 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28   h==(('d'<<24)+(
9000: 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38  'o'<<16)+('u'<<8
9010: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
9020: 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20  /* DOUB */.     
9030: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
9040: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
9050: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
9060: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65  ITE_AFF_REAL;.#e
9070: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69  ndif.    }else i
9080: 66 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46  f( (h&0x00FFFFFF
9090: 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27  )==(('i'<<16)+('
90a0: 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  n'<<8)+'t') ){  
90b0: 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20    /* INT */.    
90c0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
90d0: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
90e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
90f0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 73 7a 45   }..  /* If pszE
9100: 73 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  st is not NULL, 
9110: 73 74 6f 72 65 20 61 6e 20 65 73 74 69 6d 61 74  store an estimat
9120: 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20 73  e of the field s
9130: 69 7a 65 2e 20 20 54 68 65 0a 20 20 2a 2a 20 65  ize.  The.  ** e
9140: 73 74 69 6d 61 74 65 20 69 73 20 73 63 61 6c 65  stimate is scale
9150: 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 69  d so that the si
9160: 7a 65 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72  ze of an integer
9170: 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20 69 66 28   is 1.  */.  if(
9180: 20 70 73 7a 45 73 74 20 29 7b 0a 20 20 20 20 2a   pszEst ){.    *
9190: 70 73 7a 45 73 74 20 3d 20 31 3b 20 20 20 2f 2a  pszEst = 1;   /*
91a0: 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 69 73   default size is
91b0: 20 61 70 70 72 6f 78 20 34 20 62 79 74 65 73 20   approx 4 bytes 
91c0: 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66 3c 3d  */.    if( aff<=
91d0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
91e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 68  ){.      if( zCh
91f0: 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  ar ){.        wh
9200: 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d 20 29 7b  ile( zChar[0] ){
9210: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
9220: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 43  qlite3Isdigit(zC
9230: 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  har[0]) ){.     
9240: 20 20 20 20 20 20 20 69 6e 74 20 76 20 3d 20 30         int v = 0
9250: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
9260: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 43  lite3GetInt32(zC
9270: 68 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20 20  har, &v);.      
9280: 20 20 20 20 20 20 76 20 3d 20 76 2f 34 20 2b 20        v = v/4 + 
9290: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  1;.            i
92a0: 66 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20 32  f( v>255 ) v = 2
92b0: 35 35 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  55;.            
92c0: 2a 70 73 7a 45 73 74 20 3d 20 76 3b 20 2f 2a 20  *pszEst = v; /* 
92d0: 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43 48 41 52  BLOB(k), VARCHAR
92e0: 28 6b 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e 20  (k), CHAR(k) -> 
92f0: 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20 20  r=(k/4+1) */.   
9300: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9310: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9320: 20 20 20 20 20 20 7a 43 68 61 72 2b 2b 3b 0a 20        zChar++;. 
9330: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9340: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70  else{.        *p
9350: 73 7a 45 73 74 20 3d 20 35 3b 20 20 20 2f 2a 20  szEst = 5;   /* 
9360: 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f 42  BLOB, TEXT, CLOB
9370: 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f 78   -> r=5  (approx
9380: 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20 20   20 bytes)*/.   
9390: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
93a0: 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a   return aff;.}..
93b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
93c0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
93d0: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
93e0: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
93f0: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
9400: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
9410: 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72  ement.  The pFir
9420: 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20  st token is the 
9430: 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69  first.** token i
9440: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f  n the sequence o
9450: 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65  f tokens that de
9460: 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20  scribe the type 
9470: 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  of the.** column
9480: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
9490: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
94a0: 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61   pLast is the la
94b0: 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74  st token.** in t
94c0: 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73  he sequence.  Us
94d0: 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  e this informati
94e0: 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  on to construct 
94f0: 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74  a string.** that
9500: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79   contains the ty
9510: 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  pename of the co
9520: 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74  lumn and store t
9530: 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e  hat string.** in
9540: 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64   zType..*/ .void
9550: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
9560: 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  nType(Parse *pPa
9570: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70  rse, Token *pTyp
9580: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
9590: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
95a0: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
95b0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
95c0: 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d  p==0 || NEVER(p-
95d0: 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72  >nCol<1) ) retur
95e0: 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e  n;.  pCol = &p->
95f0: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b  aCol[p->nCol-1];
9600: 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d  .  assert( pCol-
9610: 3e 7a 54 79 70 65 3d 3d 30 20 29 3b 0a 20 20 70  >zType==0 );.  p
9620: 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c  Col->zType = sql
9630: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
9640: 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  n(pParse->db, pT
9650: 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66  ype);.  pCol->af
9660: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
9670: 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 43 6f  AffinityType(pCo
9680: 6c 2d 3e 7a 54 79 70 65 2c 20 26 70 43 6f 6c 2d  l->zType, &pCol-
9690: 3e 73 7a 45 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >szEst);.}../*.*
96a0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
96b0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
96c0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f  value for the mo
96d0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
96e0: 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74  d column.** of t
96f0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
9700: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
9710: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66  ction..**.** Def
9720: 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65  ault value expre
9730: 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63  ssions must be c
9740: 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20  onstant.  Raise 
9750: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20  an exception if 
9760: 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74  this.** is not t
9770: 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  he case..**.** T
9780: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
9790: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
97a0: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
97b0: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
97c0: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
97d0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
97e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
97f0: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50  ddDefaultValue(P
9800: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
9810: 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 29 7b 0a  prSpan *pSpan){.
9820: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f    Table *p;.  Co
9830: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71  lumn *pCol;.  sq
9840: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
9850: 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50  se->db;.  p = pP
9860: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
9870: 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20  .  if( p!=0 ){. 
9880: 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61     pCol = &(p->a
9890: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b  Col[p->nCol-1]);
98a0: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
98b0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
98c0: 72 46 75 6e 63 74 69 6f 6e 28 70 53 70 61 6e 2d  rFunction(pSpan-
98d0: 3e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  >pExpr) ){.     
98e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
98f0: 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c  (pParse, "defaul
9900: 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d  t value of colum
9910: 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f  n [%s] is not co
9920: 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20  nstant",.       
9930: 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b     pCol->zName);
9940: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9950: 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70    /* A copy of p
9960: 45 78 70 72 20 69 73 20 75 73 65 64 20 69 6e 73  Expr is used ins
9970: 74 65 61 64 20 6f 66 20 74 68 65 20 6f 72 69 67  tead of the orig
9980: 69 6e 61 6c 2c 20 61 73 20 70 45 78 70 72 20 63  inal, as pExpr c
9990: 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
99a0: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f 69   tokens that poi
99b0: 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d  nt to volatile m
99c0: 65 6d 6f 72 79 2e 20 54 68 65 20 27 73 70 61 6e  emory. The 'span
99d0: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
99e0: 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ion.      ** is 
99f0: 72 65 71 75 69 72 65 64 20 62 79 20 70 72 61 67  required by prag
9a00: 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20  ma table_info.. 
9a10: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
9a20: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
9a30: 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29  db, pCol->pDflt)
9a40: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44  ;.      pCol->pD
9a50: 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  flt = sqlite3Exp
9a60: 72 44 75 70 28 64 62 2c 20 70 53 70 61 6e 2d 3e  rDup(db, pSpan->
9a70: 70 45 78 70 72 2c 20 45 58 50 52 44 55 50 5f 52  pExpr, EXPRDUP_R
9a80: 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20 73 71  EDUCE);.      sq
9a90: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9aa0: 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20  pCol->zDflt);.  
9ab0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 20      pCol->zDflt 
9ac0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
9ad0: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53  up(db, (char*)pS
9ae0: 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20  pan->zStart,.   
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b10: 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a    (int)(pSpan->z
9b20: 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74  End - pSpan->zSt
9b30: 61 72 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  art));.    }.  }
9b40: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
9b50: 6c 65 74 65 28 64 62 2c 20 70 53 70 61 6e 2d 3e  lete(db, pSpan->
9b60: 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pExpr);.}../*.**
9b70: 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 50   Designate the P
9b80: 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74  RIMARY KEY for t
9b90: 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 74  he table.  pList
9ba0: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e 61   is a list of na
9bb0: 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d  mes .** of colum
9bc0: 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ns that form the
9bd0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
9be0: 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c 2c  f pList is NULL,
9bf0: 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73   then the.** mos
9c00: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
9c10: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 74   column of the t
9c20: 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 6d  able is the prim
9c30: 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  ary key..**.** A
9c40: 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 20   table can have 
9c50: 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 6d  at most one prim
9c60: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 65  ary key.  If the
9c70: 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
9c80: 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 20  as.** a primary 
9c90: 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 73  key (and this is
9ca0: 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 6d   the second prim
9cb0: 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 72  ary key) then cr
9cc0: 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  eate an.** error
9cd0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50  ..**.** If the P
9ce0: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f 6e  RIMARY KEY is on
9cf0: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
9d00: 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 20   whose datatype 
9d10: 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 74  is INTEGER,.** t
9d20: 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 20  hen we will try 
9d30: 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c 75  to use that colu
9d40: 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64 2e  mn as the rowid.
9d50: 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 2e    Set the Table.
9d60: 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 6f  iPKey.** field o
9d70: 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  f the table unde
9d80: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74  r construction t
9d90: 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 6f  o be the index o
9da0: 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52  f the.** INTEGER
9db0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
9dc0: 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b 65  umn.  Table.iPKe
9dd0: 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 69  y is set to -1 i
9de0: 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  f there is.** no
9df0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
9e00: 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   KEY..**.** If t
9e10: 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 6e  he key is not an
9e20: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
9e30: 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 74   KEY, then creat
9e40: 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 6e  e a unique.** in
9e50: 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 2e  dex for the key.
9e60: 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 72    No index is cr
9e70: 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 45  eated for INTEGE
9e80: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e 0a  R PRIMARY KEYs..
9e90: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
9ea0: 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 20  ddPrimaryKey(.  
9eb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
9ec0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
9ed0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
9ee0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 4c  st *pList,  /* L
9ef0: 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 6d  ist of field nam
9f00: 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  es to be indexed
9f10: 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
9f20: 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20  r,      /* What 
9f30: 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e 69  to do with a uni
9f40: 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 74  queness conflict
9f50: 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 6e   */.  int autoIn
9f60: 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  c,      /* True 
9f70: 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52 45  if the AUTOINCRE
9f80: 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 20  MENT keyword is 
9f90: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  present */.  int
9fa0: 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20 2f   sortOrder     /
9fb0: 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20  * SQLITE_SO_ASC 
9fc0: 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  or SQLITE_SO_DES
9fd0: 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  C */.){.  Table 
9fe0: 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e  *pTab = pParse->
9ff0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63 68 61  pNewTable;.  cha
a000: 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20  r *zType = 0;.  
a010: 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c 20 69  int iCol = -1, i
a020: 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20  ;.  int nTerm;. 
a030: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20   if( pTab==0 || 
a040: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
a050: 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b  ) goto primary_k
a060: 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70  ey_exit;.  if( p
a070: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
a080: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
a090: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
a0a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
a0b0: 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22  .      "table \"
a0c0: 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68  %s\" has more th
a0d0: 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  an one primary k
a0e0: 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ey", pTab->zName
a0f0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d  );.    goto prim
a100: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
a110: 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61  }.  pTab->tabFla
a120: 67 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d  gs |= TF_HasPrim
a130: 61 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c  aryKey;.  if( pL
a140: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43  ist==0 ){.    iC
a150: 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20  ol = pTab->nCol 
a160: 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61  - 1;.    pTab->a
a170: 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61  Col[iCol].colFla
a180: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52  gs |= COLFLAG_PR
a190: 49 4d 4b 45 59 3b 0a 20 20 20 20 7a 54 79 70 65  IMKEY;.    zType
a1a0: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
a1b0: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 6e  ol].zType;.    n
a1c0: 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  Term = 1;.  }els
a1d0: 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 70  e{.    nTerm = p
a1e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
a1f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72   for(i=0; i<nTer
a200: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  m; i++){.      f
a210: 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c  or(iCol=0; iCol<
a220: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
a230: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
a240: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a250: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
a260: 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  e, pTab->aCol[iC
a270: 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ol].zName)==0 ){
a280: 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d  .          pTab-
a290: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c 46  >aCol[iCol].colF
a2a0: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
a2b0: 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20  PRIMKEY;.       
a2c0: 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d     zType = pTab-
a2d0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70  >aCol[iCol].zTyp
a2e0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  e;.          bre
a2f0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
a300: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
a310: 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20    if( nTerm==1. 
a320: 20 20 26 26 20 7a 54 79 70 65 20 26 26 20 73 71    && zType && sq
a330: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79  lite3StrICmp(zTy
a340: 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d  pe, "INTEGER")==
a350: 30 0a 20 20 20 26 26 20 73 6f 72 74 4f 72 64 65  0.   && sortOrde
a360: 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  r==SQLITE_SO_ASC
a370: 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  .  ){.    pTab->
a380: 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20  iPKey = iCol;.  
a390: 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20    pTab->keyConf 
a3a0: 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20  = (u8)onError;. 
a3b0: 20 20 20 61 73 73 65 72 74 28 20 61 75 74 6f 49     assert( autoI
a3c0: 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63  nc==0 || autoInc
a3d0: 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62 2d  ==1 );.    pTab-
a3e0: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 61 75 74  >tabFlags |= aut
a3f0: 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72  oInc*TF_Autoincr
a400: 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66 28 20 70  ement;.    if( p
a410: 4c 69 73 74 20 29 20 70 50 61 72 73 65 2d 3e 69  List ) pParse->i
a420: 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c  PkSortOrder = pL
a430: 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  ist->a[0].sortOr
a440: 64 65 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  der;.  }else if(
a450: 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e   autoInc ){.#ifn
a460: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a470: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
a480: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
a490: 67 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f 49  g(pParse, "AUTOI
a4a0: 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79  NCREMENT is only
a4b0: 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22   allowed on an "
a4c0: 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52  .       "INTEGER
a4d0: 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a   PRIMARY KEY");.
a4e0: 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
a4f0: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50      Vdbe *v = pP
a500: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 20  arse->pVdbe;.   
a510: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 69   Index *p;.    i
a520: 66 28 20 76 20 29 20 70 50 61 72 73 65 2d 3e 61  f( v ) pParse->a
a530: 64 64 72 53 6b 69 70 50 4b 20 3d 20 73 71 6c 69  ddrSkipPK = sqli
a540: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
a550: 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 70   OP_Noop);.    p
a560: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
a570: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c  Index(pParse, 0,
a580: 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e   0, 0, pList, on
a590: 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20  Error, 0,.      
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5b0: 20 20 20 20 20 30 2c 20 73 6f 72 74 4f 72 64 65       0, sortOrde
a5c0: 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 0);.    if( p
a5d0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74   ){.      p->aut
a5e0: 6f 49 6e 64 65 78 20 3d 20 32 3b 0a 20 20 20 20  oIndex = 2;.    
a5f0: 20 20 69 66 28 20 76 20 29 20 73 71 6c 69 74 65    if( v ) sqlite
a600: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
a610: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 53 6b 69   pParse->addrSki
a620: 70 50 4b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pPK);.    }.    
a630: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pList = 0;.  }..
a640: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
a650: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
a660: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
a670: 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ->db, pList);.  
a680: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
a690: 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b   Add a new CHECK
a6a0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74   constraint to t
a6b0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
a6c0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
a6d0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
a6e0: 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f  qlite3AddCheckCo
a6f0: 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
a700: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
a710: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
a720: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65   */.  Expr *pChe
a730: 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63  ckExpr  /* The c
a740: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20  heck expression 
a750: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
a760: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
a770: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
a780: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
a790: 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26  e;.  if( pTab &&
a7a0: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
a7b0: 42 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70  B ){.    pTab->p
a7c0: 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  Check = sqlite3E
a7d0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
a7e0: 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65  arse, pTab->pChe
a7f0: 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  ck, pCheckExpr);
a800: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
a810: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e  >constraintName.
a820: 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  n ){.      sqlit
a830: 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
a840: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  e(pParse, pTab->
a850: 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73 65 2d  pCheck, &pParse-
a860: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2c  >constraintName,
a870: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   1);.    }.  }el
a880: 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
a890: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
a8a0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
a8b0: 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d  pCheckExpr);.  }
a8c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
a8d0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  e collation func
a8e0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
a8f0: 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64   recently parsed
a900: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a   table column.**
a910: 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20   to the CollSeq 
a920: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
a930: 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65  qlite3AddCollate
a940: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
a950: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  se, Token *pToke
a960: 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  n){.  Table *p;.
a970: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
a980: 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
a990: 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64       /* Dequoted
a9a0: 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69   name of collati
a9b0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20  on sequence */. 
a9c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
a9d0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
a9e0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
a9f0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
aa00: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20  p->nCol-1;.  db 
aa10: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
aa20: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e  zColl = sqlite3N
aa30: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
aa40: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20   pToken);.  if( 
aa50: 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b  !zColl ) return;
aa60: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c  ..  if( sqlite3L
aa70: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
aa80: 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  rse, zColl) ){. 
aa90: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
aaa0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
aab0: 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d  e(db, p->aCol[i]
aac0: 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e  .zColl);.    p->
aad0: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20  aCol[i].zColl = 
aae0: 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a  zColl;.  .    /*
aaf0: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   If the column i
ab00: 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c  s declared as "<
ab10: 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45  name> PRIMARY KE
ab20: 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e  Y COLLATE <type>
ab30: 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61  ",.    ** then a
ab40: 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65  n index may have
ab50: 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e   been created on
ab60: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66   this column bef
ab70: 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  ore the.    ** c
ab80: 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61  ollation type wa
ab90: 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74  s added. Correct
aba0: 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74   this if it is t
abb0: 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  he case..    */.
abc0: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e      for(pIdx=p->
abd0: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
abe0: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
abf0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ac00: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20  Idx->nKeyCol==1 
ac10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
ac20: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
ac30: 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64  i ){.        pId
ac40: 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70  x->azColl[0] = p
ac50: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[i].zColl;
ac60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ac70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
ac80: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
ac90: 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  oll);.  }.}../*.
aca0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
acb0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c   returns the col
acc0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
acd0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74  for database nat
ace0: 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f  ive text.** enco
acf0: 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20  ding identified 
ad00: 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e  by the string zN
ad10: 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d  ame, length nNam
ad20: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
ad30: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
ad40: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
ad50: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  not available, o
ad60: 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a  r not available.
ad70: 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
ad80: 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69  se native encodi
ad90: 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ng, the collatio
ada0: 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76  n factory is inv
adb0: 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65  oked to.** reque
adc0: 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f  st it. If the co
add0: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
ade0: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20  does not supply 
adf0: 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c  such a sequence,
ae00: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75  .** and the sequ
ae10: 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  ence is availabl
ae20: 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78  e in another tex
ae30: 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e  t encoding, then
ae40: 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75   that is.** retu
ae50: 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  rned instead..**
ae60: 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f  .** If no versio
ae70: 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  ns of the reques
ae80: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73  ted collations s
ae90: 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69  equence are avai
aea0: 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f  lable, or.** ano
aeb0: 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72  ther error occur
aec0: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
aed0: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
aee0: 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e   message written
aef0: 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e   into.** pParse.
af00: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
af10: 69 6e 65 20 69 73 20 61 20 77 72 61 70 70 65 72  ine is a wrapper
af20: 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46   around sqlite3F
af30: 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54  indCollSeq().  T
af40: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
af50: 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61  nvokes the colla
af60: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20  tion factory if 
af70: 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74  the named collat
af80: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ion cannot be fo
af90: 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  und.** and gener
afa0: 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ates an error me
afb0: 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  ssage..**.** See
afc0: 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69   also: sqlite3Fi
afd0: 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c  ndCollSeq(), sql
afe0: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29  ite3GetCollSeq()
aff0: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
b000: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
b010: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
b020: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
b030: 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  me){.  sqlite3 *
b040: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
b050: 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28  .  u8 enc = ENC(
b060: 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75  db);.  u8 initbu
b070: 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75  sy = db->init.bu
b080: 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  sy;.  CollSeq *p
b090: 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d  Coll;..  pColl =
b0a0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
b0b0: 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61  Seq(db, enc, zNa
b0c0: 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20  me, initbusy);. 
b0d0: 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26   if( !initbusy &
b0e0: 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43  & (!pColl || !pC
b0f0: 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20  oll->xCmp) ){.  
b100: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
b110: 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  3GetCollSeq(pPar
b120: 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20  se, enc, pColl, 
b130: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  zName);.  }..  r
b140: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
b150: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
b160: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
b170: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68  ncrement the sch
b180: 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a  ema cookie..**.*
b190: 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * The schema coo
b1a0: 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  kie is used to d
b1b0: 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68  etermine when th
b1c0: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
b1d0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
b1e0: 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63  nges.  After eac
b1f0: 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c  h schema change,
b200: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75   the cookie valu
b210: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57  e.** changes.  W
b220: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69  hen a process fi
b230: 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63  rst reads the sc
b240: 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20  hema it records 
b250: 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20  the.** cookie.  
b260: 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e  Thereafter, when
b270: 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20  ever it goes to 
b280: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
b290: 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b  ase,.** it check
b2a0: 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  s the cookie to 
b2b0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  make sure the sc
b2c0: 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61  hema has not cha
b2d0: 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74  nged.** since it
b2e0: 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a   was last read..
b2f0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20  **.** This plan 
b300: 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  is not completel
b310: 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20  y bullet-proof. 
b320: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
b330: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  for.** the schem
b340: 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74  a to change mult
b350: 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66  iple times and f
b360: 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  or the cookie to
b370: 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20   be.** set back 
b380: 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20  to prior value. 
b390: 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e   But schema chan
b3a0: 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65  ges are infreque
b3b0: 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72  nt.** and the pr
b3c0: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74  obability of hit
b3d0: 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f  ting the same co
b3e0: 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e  okie value is on
b3f0: 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69  ly.** 1 chance i
b400: 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72  n 2^32.  So we'r
b410: 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a  e safe enough..*
b420: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68  /.void sqlite3Ch
b430: 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73 65  angeCookie(Parse
b440: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44   *pParse, int iD
b450: 62 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  b){.  int r1 = s
b460: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
b470: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
b480: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b490: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
b4a0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
b4b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b4c0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
b4d0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
b4e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
b4f0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
b500: 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  er, db->aDb[iDb]
b510: 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
b520: 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72 31 29 3b 0a  _cookie+1, r1);.
b530: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b540: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
b550: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
b560: 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20  SCHEMA_VERSION, 
b570: 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  r1);.  sqlite3Re
b580: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
b590: 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a  rse, r1);.}../*.
b5a0: 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e  ** Measure the n
b5b0: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
b5c0: 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75  ers needed to ou
b5d0: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a  tput the given.*
b5e0: 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54  * identifier.  T
b5f0: 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
b600: 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20  ed includes any 
b610: 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62  quotes used.** b
b620: 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c  ut does not incl
b630: 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72  ude the null ter
b640: 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  minator..**.** T
b650: 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63  he estimate is c
b660: 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74  onservative.  It
b670: 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
b680: 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a   that what is.**
b690: 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a   really needed..
b6a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64  */.static int id
b6b0: 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  entLength(const 
b6c0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
b6d0: 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a  n;.  for(n=0; *z
b6e0: 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20  ; n++, z++){.   
b6f0: 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20   if( *z=='"' ){ 
b700: 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74  n++; }.  }.  ret
b710: 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a  urn n + 2;.}../*
b720: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61  .** The first pa
b730: 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
b740: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75  nter to an outpu
b750: 74 20 62 75 66 66 65 72 2e 20 54 68 65 20 73 65  t buffer. The se
b760: 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74  cond .** paramet
b770: 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
b780: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68  to an integer th
b790: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
b7a0: 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68 69  offset at.** whi
b7b0: 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f  ch to write into
b7c0: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
b7d0: 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
b7e0: 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20  n copies the.** 
b7f0: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
b800: 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f  tring pointed to
b810: 20 62 79 20 74 68 65 20 74 68 69 72 64 20 70 61   by the third pa
b820: 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65 64  rameter, zSigned
b830: 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65  Ident,.** to the
b840: 20 73 70 65 63 69 66 69 65 64 20 6f 66 66 73 65   specified offse
b850: 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  t in the buffer 
b860: 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49 64  and updates *pId
b870: 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f  x to refer.** to
b880: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
b890: 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 62  after the last b
b8a0: 79 74 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f  yte written befo
b8b0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
b8c0: 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69   .** If the stri
b8d0: 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 20  ng zSignedIdent 
b8e0: 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
b8f0: 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72  y of alpha-numer
b900: 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  ic.** characters
b910: 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  , does not begin
b920: 20 77 69 74 68 20 61 20 64 69 67 69 74 20 61 6e   with a digit an
b930: 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20  d is not an SQL 
b940: 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e  keyword,.** then
b950: 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
b960: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
b970: 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 69 74  er exactly as it
b980: 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a   is. Otherwise,.
b990: 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64 20  ** it is quoted 
b9a0: 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f  using double-quo
b9b0: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
b9c0: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
b9d0: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
b9e0: 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64   char *zSignedId
b9f0: 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ent){.  unsigned
ba00: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20   char *zIdent = 
ba10: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
ba20: 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20  zSignedIdent;.  
ba30: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
ba40: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
ba50: 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ;..  for(j=0; zI
ba60: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
ba70: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49     if( !sqlite3I
ba80: 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d  salnum(zIdent[j]
ba90: 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  ) && zIdent[j]!=
baa0: 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  '_' ) break;.  }
bab0: 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 73  .  needQuote = s
bac0: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 49  qlite3Isdigit(zI
bad0: 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20  dent[0]).       
bae0: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b       || sqlite3K
baf0: 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e  eywordCode(zIden
bb00: 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20 20 20  t, j)!=TK_ID.   
bb10: 20 20 20 20 20 20 20 20 20 7c 7c 20 7a 49 64 65           || zIde
bb20: 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20 20 20  nt[j]!=0.       
bb30: 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20       || j==0;.. 
bb40: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
bb50: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
bb60: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
bb70: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  [j]; j++){.    z
bb80: 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a  [i++] = zIdent[j
bb90: 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e  ];.    if( zIden
bba0: 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b  t[j]=='"' ) z[i+
bbb0: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20  +] = '"';.  }.  
bbc0: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
bbd0: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
bbe0: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64  z[i] = 0;.  *pId
bbf0: 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x = i;.}../*.** 
bc00: 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54  Generate a CREAT
bc10: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
bc20: 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  t appropriate fo
bc30: 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74  r the given.** t
bc40: 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f  able.  Memory to
bc50: 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f   hold the text o
bc60: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
bc70: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
bc80: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
bc90: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
bca0: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
bcb0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
bcc0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72  .static char *cr
bcd0: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71  eateTableStmt(sq
bce0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
bcf0: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b   *p){.  int i, k
bd00: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  , n;.  char *zSt
bd10: 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70  mt;.  char *zSep
bd20: 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b  , *zSep2, *zEnd;
bd30: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
bd40: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  n = 0;.  for(
bd50: 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20  pCol = p->aCol, 
bd60: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
bd70: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
bd80: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
bd90: 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20  th(pCol->zName) 
bda0: 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  + 5;.  }.  n += 
bdb0: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a  identLength(p->z
bdc0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35  Name);.  if( n<5
bdd0: 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d  0 ){ .    zSep =
bde0: 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d   "";.    zSep2 =
bdf0: 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d   ",";.    zEnd =
be00: 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   ")";.  }else{. 
be10: 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22     zSep = "\n  "
be20: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
be30: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20  \n  ";.    zEnd 
be40: 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e  = "\n)";.  }.  n
be50: 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43   += 35 + 6*p->nC
be60: 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71  ol;.  zStmt = sq
be70: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
be80: 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53  (0, n);.  if( zS
be90: 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  tmt==0 ){.    db
bea0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
beb0: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   1;.    return 0
bec0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
bed0: 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d  snprintf(n, zStm
bee0: 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  t, "CREATE TABLE
bef0: 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74   ");.  k = sqlit
bf00: 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74  e3Strlen30(zStmt
bf10: 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53  );.  identPut(zS
bf20: 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d  tmt, &k, p->zNam
bf30: 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d  e);.  zStmt[k++]
bf40: 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43   = '(';.  for(pC
bf50: 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b  ol=p->aCol, i=0;
bf60: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c   i<p->nCol; i++,
bf70: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74   pCol++){.    st
bf80: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
bf90: 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d  * const azType[]
bfa0: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20   = {.        /* 
bfb0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
bfc0: 20 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20     */ " TEXT",. 
bfd0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
bfe0: 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20  _AFF_NONE    */ 
bff0: 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  "",.        /* S
c000: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
c010: 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20  C */ " NUM",.   
c020: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
c030: 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20  FF_INTEGER */ " 
c040: 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  INT",.        /*
c050: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
c060: 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20      */ " REAL". 
c070: 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65     };.    int le
c080: 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  n;.    const cha
c090: 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73  r *zType;..    s
c0a0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
c0b0: 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20  n-k, &zStmt[k], 
c0c0: 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20  zSep);.    k += 
c0d0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
c0e0: 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20  &zStmt[k]);.    
c0f0: 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20  zSep = zSep2;.  
c100: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
c110: 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  , &k, pCol->zNam
c120: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
c130: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53  pCol->affinity-S
c140: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3e  QLITE_AFF_TEXT >
c150: 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  = 0 );.    asser
c160: 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  t( pCol->affinit
c170: 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  y-SQLITE_AFF_TEX
c180: 54 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a  T < ArraySize(az
c190: 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73  Type) );.    tes
c1a0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
c1b0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
c1c0: 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65  F_TEXT );.    te
c1d0: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
c1e0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
c1f0: 46 46 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 74  FF_NONE );.    t
c200: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
c210: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
c220: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20  AFF_NUMERIC );. 
c230: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
c240: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
c250: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
c260: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c270: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
c280: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
c290: 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79   );.    .    zTy
c2a0: 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c  pe = azType[pCol
c2b0: 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c  ->affinity - SQL
c2c0: 49 54 45 5f 41 46 46 5f 54 45 58 54 5d 3b 0a 20  ITE_AFF_TEXT];. 
c2d0: 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33     len = sqlite3
c2e0: 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b  Strlen30(zType);
c2f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f  .    assert( pCo
c300: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
c310: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 0a 20 20  ITE_AFF_NONE .  
c320: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f            || pCo
c330: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c  l->affinity==sql
c340: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
c350: 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a 20 20  (zType, 0) );.  
c360: 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b    memcpy(&zStmt[
c370: 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b  k], zType, len);
c380: 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20  .    k += len;. 
c390: 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20     assert( k<=n 
c3a0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
c3b0: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
c3c0: 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20  zStmt[k], "%s", 
c3d0: 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  zEnd);.  return 
c3e0: 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zStmt;.}../*.** 
c3f0: 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65 78 20  Resize an Index 
c400: 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 4e  object to hold N
c410: 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e 20   columns total. 
c420: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
c430: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
c440: 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  and SQLITE_NOMEM
c450: 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   on an OOM error
c460: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c470: 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63  resizeIndexObjec
c480: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  t(sqlite3 *db, I
c490: 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20  ndex *pIdx, int 
c4a0: 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74  N){.  char *zExt
c4b0: 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  ra;.  int nByte;
c4c0: 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f  .  if( pIdx->nCo
c4d0: 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72 6e  lumn>=N ) return
c4e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
c4f0: 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73 52 65  sert( pIdx->isRe
c500: 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 42  sized==0 );.  nB
c510: 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28 63 68  yte = (sizeof(ch
c520: 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 31  ar*) + sizeof(i1
c530: 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45 78  6) + 1)*N;.  zEx
c540: 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tra = sqlite3DbM
c550: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
c560: 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45 78 74  yte);.  if( zExt
c570: 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ra==0 ) return S
c580: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
c590: 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49  emcpy(zExtra, pI
c5a0: 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65  dx->azColl, size
c5b0: 6f 66 28 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e  of(char*)*pIdx->
c5c0: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78  nColumn);.  pIdx
c5d0: 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72  ->azColl = (char
c5e0: 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78  **)zExtra;.  zEx
c5f0: 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68  tra += sizeof(ch
c600: 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79  ar*)*N;.  memcpy
c610: 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61  (zExtra, pIdx->a
c620: 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28  iColumn, sizeof(
c630: 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75  i16)*pIdx->nColu
c640: 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43  mn);.  pIdx->aiC
c650: 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45  olumn = (i16*)zE
c660: 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b  xtra;.  zExtra +
c670: 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b  = sizeof(i16)*N;
c680: 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61  .  memcpy(zExtra
c690: 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  , pIdx->aSortOrd
c6a0: 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  er, pIdx->nColum
c6b0: 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72  n);.  pIdx->aSor
c6c0: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 7a 45  tOrder = (u8*)zE
c6d0: 78 74 72 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43  xtra;.  pIdx->nC
c6e0: 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64  olumn = N;.  pId
c6f0: 78 2d 3e 69 73 52 65 73 69 7a 65 64 20 3d 20 31  x->isResized = 1
c700: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
c710: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  E_OK;.}../*.** E
c720: 73 74 69 6d 61 74 65 20 74 68 65 20 74 6f 74 61  stimate the tota
c730: 6c 20 72 6f 77 20 77 69 64 74 68 20 66 6f 72 20  l row width for 
c740: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  a table..*/.stat
c750: 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65  ic void estimate
c760: 54 61 62 6c 65 57 69 64 74 68 28 54 61 62 6c 65  TableWidth(Table
c770: 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e 73 69 67   *pTab){.  unsig
c780: 6e 65 64 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a  ned wTable = 0;.
c790: 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a    const Column *
c7a0: 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69  pTabCol;.  int i
c7b0: 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e  ;.  for(i=pTab->
c7c0: 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54  nCol, pTabCol=pT
c7d0: 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69  ab->aCol; i>0; i
c7e0: 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a  --, pTabCol++){.
c7f0: 20 20 20 20 77 54 61 62 6c 65 20 2b 3d 20 70 54      wTable += pT
c800: 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20  abCol->szEst;.  
c810: 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50  }.  if( pTab->iP
c820: 4b 65 79 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b  Key<0 ) wTable++
c830: 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52  ;.  pTab->szTabR
c840: 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
c850: 73 74 28 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a  st(wTable*4);.}.
c860: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
c870: 74 68 65 20 61 76 65 72 61 67 65 20 73 69 7a 65  the average size
c880: 20 6f 66 20 61 20 72 6f 77 20 66 6f 72 20 61 6e   of a row for an
c890: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
c8a0: 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65 49  c void estimateI
c8b0: 6e 64 65 78 57 69 64 74 68 28 49 6e 64 65 78 20  ndexWidth(Index 
c8c0: 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e  *pIdx){.  unsign
c8d0: 65 64 20 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ed wIndex = 0;. 
c8e0: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
c8f0: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70  Column *aCol = p
c900: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
c910: 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  l;.  for(i=0; i<
c920: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
c930: 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20 78 20 3d  ++){.    i16 x =
c940: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
c950: 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
c960: 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  x<pIdx->pTable->
c970: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64  nCol );.    wInd
c980: 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20  ex += x<0 ? 1 : 
c990: 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c  aCol[pIdx->aiCol
c9a0: 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20  umn[i]].szEst;. 
c9b0: 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a 49 64 78   }.  pIdx->szIdx
c9c0: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
c9d0: 45 73 74 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d  Est(wIndex*4);.}
c9e0: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65  ../* Return true
c9f0: 20 69 66 20 76 61 6c 75 65 20 78 20 69 73 20 66   if value x is f
ca00: 6f 75 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 20  ound any of the 
ca10: 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69  first nCol entri
ca20: 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f  es of aiCol[].*/
ca30: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 43  .static int hasC
ca40: 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20  olumn(const i16 
ca50: 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c  *aiCol, int nCol
ca60: 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c  , int x){.  whil
ca70: 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20  e( nCol-- > 0 ) 
ca80: 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b  if( x==*(aiCol++
ca90: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
caa0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
cab0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
cac0: 72 75 6e 73 20 61 74 20 74 68 65 20 65 6e 64 20  runs at the end 
cad0: 6f 66 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  of parsing a CRE
cae0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
caf0: 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61 73 20  ent that.** has 
cb00: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
cb10: 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6a 6f 62  clause.  The job
cb20: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
cb30: 20 69 73 20 74 6f 20 63 6f 6e 76 65 72 74 20 62   is to convert b
cb40: 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20  oth.** internal 
cb50: 73 63 68 65 6d 61 20 64 61 74 61 20 73 74 72 75  schema data stru
cb60: 63 74 75 72 65 73 20 61 6e 64 20 74 68 65 20 67  ctures and the g
cb70: 65 6e 65 72 61 74 65 64 20 56 44 42 45 20 63 6f  enerated VDBE co
cb80: 64 65 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a  de so that they.
cb90: 2a 2a 20 61 72 65 20 61 70 70 72 6f 70 72 69 61  ** are appropria
cba0: 74 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54  te for a WITHOUT
cbb0: 20 52 4f 57 49 44 20 74 61 62 6c 65 20 69 6e 73   ROWID table ins
cbc0: 74 65 61 64 20 6f 66 20 61 20 72 6f 77 69 64 20  tead of a rowid 
cbd0: 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65  table..** Change
cbe0: 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a  s include:.**.**
cbf0: 20 20 20 20 20 28 31 29 20 20 43 6f 6e 76 65 72       (1)  Conver
cc00: 74 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 54  t the OP_CreateT
cc10: 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f  able into an OP_
cc20: 43 72 65 61 74 65 49 6e 64 65 78 2e 20 20 54 68  CreateIndex.  Th
cc30: 65 72 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  ere is.**       
cc40: 20 20 20 6e 6f 20 72 6f 77 69 64 20 62 74 72 65     no rowid btre
cc50: 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  e for a WITHOUT 
cc60: 52 4f 57 49 44 2e 20 20 49 6e 73 74 65 61 64 2c  ROWID.  Instead,
cc70: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a   the canonical.*
cc80: 2a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20  *          data 
cc90: 73 74 6f 72 61 67 65 20 69 73 20 61 20 63 6f 76  storage is a cov
cca0: 65 72 69 6e 67 20 69 6e 64 65 78 20 62 74 72 65  ering index btre
ccb0: 65 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 42  e..**     (2)  B
ccc0: 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69  ypass the creati
ccd0: 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  on of the sqlite
cce0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e  _master table en
ccf0: 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  try.**          
cd00: 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59 20  for the PRIMARY 
cd10: 4b 45 59 20 61 73 20 74 68 65 20 74 68 65 20 70  KEY as the the p
cd20: 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
cd30: 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20   is now.**      
cd40: 20 20 20 20 69 64 65 6e 74 69 66 69 65 64 20 62      identified b
cd50: 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  y the sqlite_mas
cd60: 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79 20  ter table entry 
cd70: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  of the table its
cd80: 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20  elf..**     (3) 
cd90: 20 53 65 74 20 74 68 65 20 49 6e 64 65 78 2e 74   Set the Index.t
cda0: 6e 75 6d 20 6f 66 20 74 68 65 20 50 52 49 4d 41  num of the PRIMA
cdb0: 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a  RY KEY Index obj
cdc0: 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  ect in the.**   
cdd0: 20 20 20 20 20 20 20 73 63 68 65 6d 61 20 74 6f         schema to
cde0: 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 72   the rootpage fr
cdf0: 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  om the main tabl
ce00: 65 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53  e..**     (4)  S
ce10: 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  et all columns o
ce20: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
ce30: 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  Y schema object 
ce40: 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a  to be NOT NULL..
ce50: 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64 64 20  **     (5)  Add 
ce60: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
ce70: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
ce80: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
ce90: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f  t.**          so
cea0: 20 74 68 61 74 20 74 68 65 20 50 52 49 4d 41 52   that the PRIMAR
ceb0: 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72  Y KEY is a cover
cec0: 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20  ing index.  The 
ced0: 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20  surplus.**      
cee0: 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20      columns are 
cef0: 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e  part of KeyInfo.
cf00: 6e 58 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20  nXField and are 
cf10: 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  not used for.** 
cf20: 20 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67           sorting
cf30: 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e   or lookup or un
cf40: 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e  iqueness checks.
cf50: 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65 70  .**     (6)  Rep
cf60: 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64 20 74  lace the rowid t
cf70: 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d  ail on all autom
cf80: 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74  atically generat
cf90: 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20  ed UNIQUE.**    
cfa0: 20 20 20 20 20 20 69 6e 64 69 63 65 73 20 77 69        indices wi
cfb0: 74 68 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  th the PRIMARY K
cfc0: 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73  EY columns..*/.s
cfd0: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 76 65  tatic void conve
cfe0: 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64  rtToWithoutRowid
cff0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
d000: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
d010: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  ){.  Index *pIdx
d020: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a  ;.  Index *pPk;.
d030: 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e 74    int nPk;.  int
d040: 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33   i, j;.  sqlite3
d050: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d060: 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  b;.  Vdbe *v = p
d070: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20  Parse->pVdbe;.. 
d080: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
d090: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 6f  OP_CreateTable o
d0a0: 70 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64  pcode that would
d0b0: 20 6e 6f 72 6d 61 6c 6c 79 20 63 72 65 61 74 65   normally create
d0c0: 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6f 74 2d 70   the.  ** root-p
d0d0: 61 67 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c  age for the tabl
d0e0: 65 20 69 6e 74 6f 20 61 20 4f 50 5f 43 72 65 61  e into a OP_Crea
d0f0: 74 65 49 6e 64 65 78 20 6f 70 63 6f 64 65 2e 20  teIndex opcode. 
d100: 20 54 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   The index.  ** 
d110: 63 72 65 61 74 65 64 20 77 69 6c 6c 20 62 65 63  created will bec
d120: 6f 6d 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ome the PRIMARY 
d130: 4b 45 59 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a  KEY index..  */.
d140: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64    if( pParse->ad
d150: 64 72 43 72 54 61 62 20 29 7b 0a 20 20 20 20 61  drCrTab ){.    a
d160: 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 20 20  ssert( v );.    
d170: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
d180: 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72  (v, pParse->addr
d190: 43 72 54 61 62 29 2d 3e 6f 70 63 6f 64 65 20 3d  CrTab)->opcode =
d1a0: 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 3b   OP_CreateIndex;
d1b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 79 70 61 73  .  }..  /* Bypas
d1c0: 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  s the creation o
d1d0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
d1e0: 59 20 62 74 72 65 65 20 61 6e 64 20 74 68 65 20  Y btree and the 
d1f0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
d200: 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a  ** table entry..
d210: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
d220: 65 2d 3e 61 64 64 72 53 6b 69 70 50 4b 20 29 7b  e->addrSkipPK ){
d230: 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 20 29  .    assert( v )
d240: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d250: 65 47 65 74 4f 70 28 76 2c 20 70 50 61 72 73 65  eGetOp(v, pParse
d260: 2d 3e 61 64 64 72 53 6b 69 70 50 4b 29 2d 3e 6f  ->addrSkipPK)->o
d270: 70 63 6f 64 65 20 3d 20 4f 50 5f 47 6f 74 6f 3b  pcode = OP_Goto;
d280: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
d290: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
d2a0: 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66  Y index.  Or, if
d2b0: 20 74 68 69 73 20 74 61 62 6c 65 20 77 61 73 20   this table was 
d2c0: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
d2d0: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
d2e0: 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63 72  RY KEY table, cr
d2f0: 65 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d 41  eate a new PRIMA
d300: 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20  RY KEY index. . 
d310: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   */.  if( pTab->
d320: 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20  iPKey>=0 ){.    
d330: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
d340: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
d350: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
d360: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29  nd(pParse, 0, 0)
d370: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
d380: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
d390: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61   pList->a[0].zNa
d3a0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
d3b0: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
d3c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3e0: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61           pTab->a
d3f0: 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d  Col[pTab->iPKey]
d400: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69  .zName);.    pLi
d410: 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  st->a[0].sortOrd
d420: 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b  er = pParse->iPk
d430: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 61  SortOrder;.    a
d440: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
d450: 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62 20 29  NewTable==pTab )
d460: 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69  ;.    pPk = sqli
d470: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
d480: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
d490: 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79  pList, pTab->key
d4a0: 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Conf, 0, 0, 0, 0
d4b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 6b 3d 3d  );.    if( pPk==
d4c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
d4d0: 70 50 6b 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d  pPk->autoIndex =
d4e0: 20 32 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50   2;.    pTab->iP
d4f0: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  Key = -1;.  }els
d500: 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c  e{.    pPk = sql
d510: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
d520: 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 0a 20  dex(pTab);.  }. 
d530: 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e 67   pPk->isCovering
d540: 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
d550: 70 50 6b 21 3d 30 20 29 3b 0a 20 20 6e 50 6b 20  pPk!=0 );.  nPk 
d560: 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a  = pPk->nKeyCol;.
d570: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
d580: 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  every column of 
d590: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d5a0: 69 73 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20  is NOT NULL */. 
d5b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b   for(i=0; i<nPk;
d5c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 54 61 62 2d   i++){.    pTab-
d5d0: 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69 43 6f 6c  >aCol[pPk->aiCol
d5e0: 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 20  umn[i]].notNull 
d5f0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 50 6b 2d 3e  = 1;.  }.  pPk->
d600: 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b  uniqNotNull = 1;
d610: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20  ..  /* The root 
d620: 70 61 67 65 20 6f 66 20 74 68 65 20 50 52 49 4d  page of the PRIM
d630: 41 52 59 20 4b 45 59 20 69 73 20 74 68 65 20 74  ARY KEY is the t
d640: 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 20 2a  able root page *
d650: 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20  /.  pPk->tnum = 
d660: 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f  pTab->tnum;..  /
d670: 2a 20 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d  * Update the in-
d680: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
d690: 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e 49  ation of all UNI
d6a0: 51 55 45 20 69 6e 64 69 63 65 73 20 62 79 20 63  QUE indices by c
d6b0: 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20 74  onverting.  ** t
d6c0: 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 63  he final rowid c
d6d0: 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f  olumn into one o
d6e0: 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f  r more columns o
d6f0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
d700: 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  Y..  */.  for(pI
d710: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
d720: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
d730: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
d740: 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 70 49 64  t n;.    if( pId
d750: 78 2d 3e 61 75 74 6f 49 6e 64 65 78 3d 3d 32 20  x->autoIndex==2 
d760: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
d770: 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b  for(i=n=0; i<nPk
d780: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
d790: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64  ( !hasColumn(pId
d7a0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64  x->aiColumn, pId
d7b0: 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d  x->nKeyCol, pPk-
d7c0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20  >aiColumn[i]) ) 
d7d0: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n++;.    }.    i
d7e0: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
d7f0: 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69   /* This index i
d800: 73 20 61 20 73 75 70 65 72 73 65 74 20 6f 66 20  s a superset of 
d810: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
d820: 2a 2f 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 6e  */.      pIdx->n
d830: 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e  Column = pIdx->n
d840: 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f  KeyCol;.      co
d850: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
d860: 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65    if( resizeInde
d870: 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64 78  xObject(db, pIdx
d880: 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b  , pIdx->nKeyCol+
d890: 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  n) ) return;.   
d8a0: 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78   for(i=0, j=pIdx
d8b0: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b  ->nKeyCol; i<nPk
d8c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
d8d0: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64  ( !hasColumn(pId
d8e0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64  x->aiColumn, pId
d8f0: 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d  x->nKeyCol, pPk-
d900: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b  >aiColumn[i]) ){
d910: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
d920: 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b  iColumn[j] = pPk
d930: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
d940: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
d950: 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a  oll[j] = pPk->az
d960: 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Coll[i];.       
d970: 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j++;.      }.  
d980: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
d990: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70  pIdx->nColumn>=p
d9a0: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29  Idx->nKeyCol+n )
d9b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
d9c0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  dx->nColumn>=j )
d9d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
d9e0: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
d9f0: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
da00: 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a   KEY index.  */.
da10: 20 20 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d 3e    if( nPk<pTab->
da20: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  nCol ){.    if( 
da30: 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63  resizeIndexObjec
da40: 74 28 64 62 2c 20 70 50 6b 2c 20 70 54 61 62 2d  t(db, pPk, pTab-
da50: 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 3b  >nCol) ) return;
da60: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d  .    for(i=0, j=
da70: 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  nPk; i<pTab->nCo
da80: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
da90: 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50  f( !hasColumn(pP
daa0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20  k->aiColumn, j, 
dab0: 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  i) ){.        as
dac0: 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f  sert( j<pPk->nCo
dad0: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
dae0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  pPk->aiColumn[j]
daf0: 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 50   = i;.        pP
db00: 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 22  k->azColl[j] = "
db10: 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20  BINARY";.       
db20: 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j++;.      }.  
db30: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
db40: 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20  pPk->nColumn==j 
db50: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
db60: 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a  Tab->nCol==j );.
db70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b    }else{.    pPk
db80: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62  ->nColumn = pTab
db90: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ->nCol;.  }.}../
dba0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
dbb0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  e is called to r
dbc0: 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20  eport the final 
dbd0: 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ")" that termina
dbe0: 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20  tes.** a CREATE 
dbf0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
dc00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
dc10: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
dc20: 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75  other action rou
dc30: 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20  tines have been 
dc40: 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61  building.** is a
dc50: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65  dded to the inte
dc60: 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73  rnal hash tables
dc70: 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  , assuming no er
dc80: 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63  rors have.** occ
dc90: 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  urred..**.** An 
dca0: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61  entry for the ta
dcb0: 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74  ble is made in t
dcc0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
dcd0: 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a  on disk, unless.
dce0: 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  ** this is a tem
dcf0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20  porary table or 
dd00: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
dd10: 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74  .  When db->init
dd20: 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d  .busy==1.** it m
dd30: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
dd40: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
dd50: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
dd60: 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63  use we just.** c
dd70: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20  onnected to the 
dd80: 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61  database or beca
dd90: 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  use the sqlite_m
dda0: 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a  aster table has.
ddb0: 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e  ** recently chan
ddc0: 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72  ged, so the entr
ddd0: 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  y for this table
dde0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
ddf0: 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  in.** the sqlite
de00: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
de10: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
de20: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
de30: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
de40: 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74  pSelect argument
de50: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
de60: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
de70: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20   routine.** was 
de80: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
de90: 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74   a table generat
dea0: 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43  ed from a .** "C
deb0: 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20  REATE TABLE ... 
dec0: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  AS SELECT ..." s
ded0: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63  tatement.  The c
dee0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a  olumn names of.*
def0: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
df00: 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72  will match the r
df10: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
df20: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
df30: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
df40: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
df50: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
df60: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
df70: 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20    Token *pCons, 
df80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
df90: 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72   ',' token after
dfa0: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
dfb0: 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   defn. */.  Toke
dfc0: 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20  n *pEnd,        
dfd0: 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20 62      /* The ')' b
dfe0: 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e  efore options in
dff0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
e000: 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70 74  E */.  u8 tabOpt
e010: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
e020: 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f 70  * Extra table op
e030: 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30  tions. Usually 0
e040: 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  . */.  Select *p
e050: 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f  Select         /
e060: 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20  * Select from a 
e070: 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53  "CREATE ... AS S
e080: 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54  ELECT" */.){.  T
e090: 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20  able *p;        
e0a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e0b0: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
e0c0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
e0d0: 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20  rse->db; /* The 
e0e0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
e0f0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ion */.  int iDb
e100: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e110: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
e120: 6e 20 77 68 69 63 68 20 74 68 65 20 74 61 62 6c  n which the tabl
e130: 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64  e lives */.  Ind
e140: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
e150: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70         /* An imp
e160: 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68  lied index of th
e170: 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66  e table */..  if
e180: 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53  ( (pEnd==0 && pS
e190: 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 64 62 2d  elect==0) || db-
e1a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
e1b0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
e1c0: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
e1d0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
e1e0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  p==0 ) return;..
e1f0: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
e200: 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65  nit.busy || !pSe
e210: 6c 65 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  lect );..  /* If
e220: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
e230: 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73  sy is 1 it means
e240: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
e250: 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a  the SQL off the.
e260: 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73    ** "sqlite_mas
e270: 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f  ter" or "sqlite_
e280: 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62  temp_master" tab
e290: 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a  le on the disk..
e2a0: 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77    ** So do not w
e2b0: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
e2c0: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
e2d0: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
e2e0: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
e2f0: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
e300: 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  e db->init.newTn
e310: 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20  um field.  (The 
e320: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
e330: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
e340: 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74  n put there by t
e350: 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20  he sqliteOpenCb 
e360: 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20  routine.).  */. 
e370: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
e380: 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75  sy ){.    p->tnu
e390: 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
e3a0: 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tnum;.  }..  /* 
e3b0: 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69  Special processi
e3c0: 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  ng for WITHOUT R
e3d0: 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20  OWID Tables */. 
e3e0: 20 69 66 28 20 74 61 62 4f 70 74 73 20 26 20 54   if( tabOpts & T
e3f0: 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29  F_WithoutRowid )
e400: 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61  {.    if( (p->ta
e410: 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
e420: 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20  increment) ){.  
e430: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e440: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
e450: 20 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52 45        "AUTOINCRE
e460: 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  MENT not allowed
e470: 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49   on WITHOUT ROWI
e480: 44 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20  D tables");.    
e490: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
e4a0: 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46      if( (p->tabF
e4b0: 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69  lags & TF_HasPri
e4c0: 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20  maryKey)==0 ){. 
e4d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
e4e0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50 52  rMsg(pParse, "PR
e4f0: 49 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69 6e  IMARY KEY missin
e500: 67 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c 20  g on table %s", 
e510: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  p->zName);.    }
e520: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74  else{.      p->t
e530: 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69  abFlags |= TF_Wi
e540: 74 68 6f 75 74 52 6f 77 69 64 3b 0a 20 20 20 20  thoutRowid;.    
e550: 20 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f    convertToWitho
e560: 75 74 52 6f 77 69 64 54 61 62 6c 65 28 70 50 61  utRowidTable(pPa
e570: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  rse, p);.    }. 
e580: 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   }..  iDb = sqli
e590: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
e5a0: 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
e5b0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
e5c0: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f  E_OMIT_CHECK.  /
e5d0: 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20  * Resolve names 
e5e0: 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e  in all CHECK con
e5f0: 73 74 72 61 69 6e 74 20 65 78 70 72 65 73 73 69  straint expressi
e600: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
e610: 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20  p->pCheck ){.   
e620: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
e630: 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61  elfReference(pPa
e640: 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65  rse, p, NC_IsChe
e650: 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b  ck, 0, p->pCheck
e660: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
e670: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
e680: 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a  _OMIT_CHECK) */.
e690: 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74  .  /* Estimate t
e6a0: 68 65 20 61 76 65 72 61 67 65 20 72 6f 77 20 73  he average row s
e6b0: 69 7a 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ize for the tabl
e6c0: 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d  e and for all im
e6d0: 70 6c 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f  plied indices */
e6e0: 0a 20 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65  .  estimateTable
e6f0: 57 69 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28  Width(p);.  for(
e700: 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20  pIdx=p->pIndex; 
e710: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
e720: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74  >pNext){.    est
e730: 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28  imateIndexWidth(
e740: 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pIdx);.  }..  /*
e750: 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69   If not initiali
e760: 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74  zing, then creat
e770: 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74  e a record for t
e780: 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a  he new table.  *
e790: 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  * in the SQLITE_
e7a0: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20  MASTER table of 
e7b0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
e7c0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
e7d0: 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74  is a TEMPORARY t
e7e0: 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20  able, write the 
e7f0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61  entry into the a
e800: 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69  uxiliary.  ** fi
e810: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
e820: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
e830: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
e840: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
e850: 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  busy ){.    int 
e860: 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  n;.    Vdbe *v;.
e870: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
e880: 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72      /* "view" or
e890: 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20   "table" */.    
e8a0: 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20  char *zType2;   
e8b0: 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41  /* "VIEW" or "TA
e8c0: 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  BLE" */.    char
e8d0: 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54   *zStmt;    /* T
e8e0: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
e8f0: 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54  E TABLE or CREAT
e900: 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
e910: 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c   */..    v = sql
e920: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
e930: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  se);.    if( NEV
e940: 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
e950: 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  n;..    sqlite3V
e960: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
e970: 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20  Close, 0);..    
e980: 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69  /* .    ** Initi
e990: 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20  alize zType for 
e9a0: 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20  the new view or 
e9b0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
e9c0: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
e9d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
e9e0: 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20  A regular table 
e9f0: 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  */.      zType =
ea00: 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20   "table";.      
ea10: 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22  zType2 = "TABLE"
ea20: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
ea30: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d  _OMIT_VIEW.    }
ea40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
ea50: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a   view */.      z
ea60: 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20  Type = "view";. 
ea70: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56       zType2 = "V
ea80: 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20  IEW";.#endif.   
ea90: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
eaa0: 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54  is is a CREATE T
eab0: 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43  ABLE xx AS SELEC
eac0: 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74  T ..., execute t
ead0: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a  he SELECT.    **
eae0: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f   statement to po
eaf0: 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74  pulate the new t
eb00: 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70  able. The root-p
eb10: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
eb20: 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61  he.    ** new ta
eb30: 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69 73 74  ble is in regist
eb40: 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  er pParse->regRo
eb50: 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ot..    **.    *
eb60: 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43  * Once the SELEC
eb70: 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
eb80: 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63   by sqlite3Selec
eb90: 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a  t(), it is in a.
eba0: 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20      ** suitable 
ebb0: 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66  state to query f
ebc0: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
ebd0: 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f  mes and types to
ebe0: 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20   be used.    ** 
ebf0: 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  by the new table
ec00: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
ec10: 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77  A shared-cache w
ec20: 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74  rite-lock is not
ec30: 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69   required to wri
ec40: 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61  te to the new ta
ec50: 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61  ble,.    ** as a
ec60: 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73   schema-lock mus
ec70: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
ec80: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20  een obtained to 
ec90: 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65  create it. Since
eca0: 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61  .    ** a schema
ecb0: 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61  -lock excludes a
ecc0: 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ll other databas
ecd0: 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69  e users, the wri
ece0: 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20  te-lock would.  
ecf0: 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e    ** be redundan
ed00: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
ed10: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
ed20: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
ed30: 73 74 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  st;.      Table 
ed40: 2a 70 53 65 6c 54 61 62 3b 0a 0a 20 20 20 20 20  *pSelTab;..     
ed50: 20 61 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e   assert(pParse->
ed60: 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20  nTab==1);.      
ed70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ed80: 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74  3(v, OP_OpenWrit
ed90: 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65  e, 1, pParse->re
eda0: 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20  gRoot, iDb);.   
edb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
edc0: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
edd0: 5f 50 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20  _P2ISREG);.     
ede0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
edf0: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
ee00: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
ee10: 64 65 73 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c  dest, SRT_Table,
ee20: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
ee30: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
ee40: 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29   pSelect, &dest)
ee50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ee60: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
ee70: 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  Close, 1);.     
ee80: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
ee90: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
eea0: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
eeb0: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
eec0: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
eed0: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ct);.        if(
eee0: 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65   pSelTab==0 ) re
eef0: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  turn;.        as
ef00: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30  sert( p->aCol==0
ef10: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   );.        p->n
ef20: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
ef30: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  Col;.        p->
ef40: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
ef50: 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53  aCol;.        pS
ef60: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
ef70: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
ef80: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
ef90: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
efa0: 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54  eTable(db, pSelT
efb0: 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ab);.      }.   
efc0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75   }..    /* Compu
efd0: 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  te the complete 
efe0: 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
eff0: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  TE statement */.
f000: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20      if( pSelect 
f010: 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  ){.      zStmt =
f020: 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74   createTableStmt
f030: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c  (db, p);.    }el
f040: 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  se{.      Token 
f050: 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f 70 74 73  *pEnd2 = tabOpts
f060: 20 3f 20 26 70 50 61 72 73 65 2d 3e 73 4c 61 73   ? &pParse->sLas
f070: 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20  tToken : pEnd;. 
f080: 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70       n = (int)(p
f090: 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65  End2->z - pParse
f0a0: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b  ->sNameToken.z);
f0b0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64 32  .      if( pEnd2
f0c0: 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20  ->z[0]!=';' ) n 
f0d0: 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20  += pEnd2->n;.   
f0e0: 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
f0f0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20  e3MPrintf(db, . 
f100: 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
f110: 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65   %s %.*s", zType
f120: 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e  2, n, pParse->sN
f130: 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20  ameToken.z.     
f140: 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   );.    }..    /
f150: 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65  * A slot for the
f160: 20 72 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65   record has alre
f170: 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
f180: 65 64 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a  ed in the .    *
f190: 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  * SQLITE_MASTER 
f1a0: 74 61 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20  table.  We just 
f1b0: 6e 65 65 64 20 74 6f 20 75 70 64 61 74 65 20 74  need to update t
f1c0: 68 61 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c  hat slot with al
f1d0: 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66  l.    ** the inf
f1e0: 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63  ormation we've c
f1f0: 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f  ollected..    */
f200: 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
f210: 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
f220: 20 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51        "UPDATE %Q
f230: 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 20 22  .%s ".         "
f240: 53 45 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e  SET type='%s', n
f250: 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65  ame=%Q, tbl_name
f260: 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25  =%Q, rootpage=#%
f270: 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20  d, sql=%Q ".    
f280: 20 20 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d     "WHERE rowid=
f290: 23 25 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e  #%d",.      db->
f2a0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
f2b0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
f2c0: 29 2c 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a  ),.      zType,.
f2d0: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
f2e0: 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a        p->zName,.
f2f0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
f300: 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74  gRoot,.      zSt
f310: 6d 74 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65  mt,.      pParse
f320: 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29  ->regRowid.    )
f330: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
f340: 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a  ree(db, zStmt);.
f350: 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
f360: 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
f370: 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
f380: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
f390: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20  NCREMENT.    /* 
f3a0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
f3b0: 77 65 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74  we need to creat
f3c0: 65 20 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75  e an sqlite_sequ
f3d0: 65 6e 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20  ence table for. 
f3e0: 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72     ** keeping tr
f3f0: 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65  ack of autoincre
f400: 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a  ment keys..    *
f410: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 61 62  /.    if( p->tab
f420: 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
f430: 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  ncrement ){.    
f440: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
f450: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20  >aDb[iDb];.     
f460: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f470: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
f480: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
f490: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53       if( pDb->pS
f4a0: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d  chema->pSeqTab==
f4b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
f4c0: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
f4d0: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
f4e0: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
f4f0: 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
f500: 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20  ce(name,seq)",. 
f510: 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e           pDb->zN
f520: 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ame.        );. 
f530: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
f540: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61  dif..    /* Repa
f550: 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74  rse everything t
f560: 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74  o update our int
f570: 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63  ernal data struc
f580: 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c  tures */.    sql
f590: 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65  ite3VdbeAddParse
f5a0: 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c  SchemaOp(v, iDb,
f5b0: 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  .           sqli
f5c0: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
f5d0: 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41 4e  tbl_name='%q' AN
f5e0: 44 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72  D type!='trigger
f5f0: 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  '", p->zName));.
f600: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74    }...  /* Add t
f610: 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20  he table to the 
f620: 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
f630: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
f640: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
f650: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
f660: 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  sy ){.    Table 
f670: 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d  *pOld;.    Schem
f680: 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e  a *pSchema = p->
f690: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73  pSchema;.    ass
f6a0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
f6b0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
f6c0: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  iDb, 0) );.    p
f6d0: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
f6e0: 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61  hInsert(&pSchema
f6f0: 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ->tblHash, p->zN
f700: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f720: 20 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33    sqlite3Strlen3
f730: 30 28 70 2d 3e 7a 4e 61 6d 65 29 2c 70 29 3b 0a  0(p->zName),p);.
f740: 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a      if( pOld ){.
f750: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
f760: 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c  =pOld );  /* Mal
f770: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
f780: 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68  iled inside Hash
f790: 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20  Insert() */.    
f7a0: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
f7b0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ed = 1;.      re
f7c0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
f7d0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
f7e0: 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 66  e = 0;.    db->f
f7f0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
f800: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23  nternChanges;..#
f810: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f820: 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
f830: 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63    if( !p->pSelec
f840: 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t ){.      const
f850: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28   char *zName = (
f860: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61  const char *)pPa
f870: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
f880: 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61  z;.      int nNa
f890: 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  me;.      assert
f8a0: 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70 43  ( !pSelect && pC
f8b0: 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20  ons && pEnd );. 
f8c0: 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e       if( pCons->
f8d0: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  z==0 ){.        
f8e0: 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20  pCons = pEnd;.  
f8f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d      }.      nNam
f900: 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73 74  e = (int)((const
f910: 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a   char *)pCons->z
f920: 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20   - zName);.     
f930: 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74   p->addColOffset
f940: 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55   = 13 + sqlite3U
f950: 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65  tf8CharLen(zName
f960: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , nName);.    }.
f970: 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69  #endif.  }.}..#i
f980: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f990: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65  T_VIEW./*.** The
f9a0: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
f9b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  is routine in or
f9c0: 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20  der to create a 
f9d0: 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64  new VIEW.*/.void
f9e0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69   sqlite3CreateVi
f9f0: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
fa00: 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rse,     /* The 
fa10: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
fa20: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67  */.  Token *pBeg
fa30: 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  in,     /* The C
fa40: 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
fa50: 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74   begins the stat
fa60: 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
fa70: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
fa80: 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
fa90: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
faa0: 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
fab0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
fac0: 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
fad0: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
fae0: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
faf0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
fb00: 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c  lect,   /* A SEL
fb10: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
fb20: 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
fb30: 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20  he new view */. 
fb40: 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20   int isTemp,    
fb50: 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20      /* TRUE for 
fb60: 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77  a TEMPORARY view
fb70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
fb80: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70           /* Supp
fb90: 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61  ress error messa
fba0: 67 65 73 20 69 66 20 56 49 45 57 20 61 6c 72 65  ges if VIEW alre
fbb0: 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
fbc0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
fbd0: 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt n;.  const ch
fbe0: 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73  ar *z;.  Token s
fbf0: 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73  End;.  DbFixer s
fc00: 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  Fix;.  Token *pN
fc10: 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
fc20: 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Db;.  sqlite3 *d
fc30: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
fc40: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
fc50: 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c  Var>0 ){.    sql
fc60: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
fc70: 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73  rse, "parameters
fc80: 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
fc90: 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20   in views");.   
fca0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
fcb0: 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74  lete(db, pSelect
fcc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
fcd0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72   }.  sqlite3Star
fce0: 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  tTable(pParse, p
fcf0: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69  Name1, pName2, i
fd00: 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45  sTemp, 1, 0, noE
fd10: 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73  rr);.  p = pPars
fd20: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
fd30: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72  if( p==0 || pPar
fd40: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
fd50: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
fd60: 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29  ete(db, pSelect)
fd70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
fd80: 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61  }.  sqlite3TwoPa
fd90: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
fda0: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
fdb0: 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20  pName);.  iDb = 
fdc0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
fdd0: 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68  ndex(db, p->pSch
fde0: 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ema);.  sqlite3F
fdf0: 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
fe00: 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65 77  arse, iDb, "view
fe10: 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  ", pName);.  if(
fe20: 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63   sqlite3FixSelec
fe30: 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74  t(&sFix, pSelect
fe40: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
fe50: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
fe60: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72   pSelect);.    r
fe70: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
fe80: 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
fe90: 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43  the entire SELEC
fea0: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
feb0: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
fec0: 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c  w..  ** This wil
fed0: 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20  l force all the 
fee0: 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c  Expr.token.z val
fef0: 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ues to be dynami
ff00: 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  cally.  ** alloc
ff10: 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  ated rather than
ff20: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e   point to the in
ff30: 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69  put string - whi
ff40: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  ch means that.  
ff50: 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72  ** they will per
ff60: 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63  sist after the c
ff70: 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  urrent sqlite3_e
ff80: 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72  xec() call retur
ff90: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53  ns..  */.  p->pS
ffa0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
ffb0: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53 65  electDup(db, pSe
ffc0: 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52 45  lect, EXPRDUP_RE
ffd0: 44 55 43 45 29 3b 0a 20 20 73 71 6c 69 74 65 33  DUCE);.  sqlite3
ffe0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
fff0: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28   pSelect);.  if(
10000 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
10010 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
10020 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 2d 3e  .  }.  if( !db->
10030 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
10040 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
10050 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
10060 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e, p);.  }..  /*
10070 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20   Locate the end 
10080 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49  of the CREATE VI
10090 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d  EW statement.  M
100a0 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74  ake sEnd point t
100b0 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a  o.  ** the end..
100c0 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50    */.  sEnd = pP
100d0 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
100e0 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 73  ;.  if( ALWAYS(s
100f0 45 6e 64 2e 7a 5b 30 5d 21 3d 30 29 20 26 26 20  End.z[0]!=0) && 
10100 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
10110 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
10120 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
10130 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
10140 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70  (int)(sEnd.z - p
10150 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 7a 20 3d  Begin->z);.  z =
10160 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68   pBegin->z;.  wh
10170 69 6c 65 28 20 41 4c 57 41 59 53 28 6e 3e 30 29  ile( ALWAYS(n>0)
10180 20 26 26 20 73 71 6c 69 74 65 33 49 73 73 70 61   && sqlite3Isspa
10190 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d  ce(z[n-1]) ){ n-
101a0 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20  -; }.  sEnd.z = 
101b0 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e  &z[n-1];.  sEnd.
101c0 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65  n = 1;..  /* Use
101d0 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
101e0 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69  () to add the vi
101f0 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45  ew to the SQLITE
10200 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f  _MASTER table */
10210 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  .  sqlite3EndTab
10220 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73  le(pParse, 0, &s
10230 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  End, 0, 0);.  re
10240 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  turn;.}.#endif /
10250 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
10260 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  EW */..#if !defi
10270 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
10280 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
10290 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
102a0 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a  RTUALTABLE)./*.*
102b0 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75  * The Table stru
102c0 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20  cture pTable is 
102d0 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20  really a VIEW.  
102e0 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65  Fill in the name
102f0 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  s of.** the colu
10300 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20  mns of the view 
10310 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74  in the pTable st
10320 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e  ructure.  Return
10330 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   the number.** o
10340 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e  f errors.  If an
10350 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c   error is seen l
10360 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
10370 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
10380 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  >zErrMsg..*/.int
10390 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
103a0 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65  olumnNames(Parse
103b0 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
103c0 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c  *pTable){.  Tabl
103d0 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a  e *pSelTab;   /*
103e0 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72   A fake table fr
103f0 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20  om which we get 
10400 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
10410 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
10420 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66  ;     /* Copy of
10430 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74   the SELECT that
10440 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
10450 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  view */.  int nE
10460 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  rr = 0;     /* N
10470 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
10480 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20  encountered */. 
10490 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
104a0 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c     /* Temporaril
104b0 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62  y holds the numb
104c0 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73  er of cursors as
104d0 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  signed */.  sqli
104e0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
104f0 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61  ->db;  /* Databa
10500 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f  se connection fo
10510 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20  r malloc errors 
10520 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 41 75 74 68  */.  int (*xAuth
10530 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
10540 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
10550 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ar*,const char*,
10560 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a 20  const char*);.. 
10570 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20   assert( pTable 
10580 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
10590 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
105a0 41 42 4c 45 0a 20 20 69 66 28 20 73 71 6c 69 74  ABLE.  if( sqlit
105b0 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63  e3VtabCallConnec
105c0 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  t(pParse, pTable
105d0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
105e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
105f0 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  }.  if( IsVirtua
10600 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65 74 75  l(pTable) ) retu
10610 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  rn 0;.#endif..#i
10620 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10630 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f  T_VIEW.  /* A po
10640 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e  sitive nCol mean
10650 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61  s the columns na
10660 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65  mes for this vie
10670 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61  w are.  ** alrea
10680 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20  dy known..  */. 
10690 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
106a0 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  l>0 ) return 0;.
106b0 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65  .  /* A negative
106c0 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69   nCol is a speci
106d0 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e  al marker meanin
106e0 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75  g that we are cu
106f0 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79  rrently.  ** try
10700 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74  ing to compute t
10710 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  he column names.
10720 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68    If we enter th
10730 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a  is routine with.
10740 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20    ** a negative 
10750 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  nCol, it means t
10760 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73  wo or more views
10770 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69   form a loop, li
10780 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20  ke this:.  **.  
10790 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
107a0 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54  EW one AS SELECT
107b0 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a   * FROM two;.  *
107c0 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
107d0 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20  W two AS SELECT 
107e0 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a  * FROM one;.  **
107f0 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20  .  ** Actually, 
10800 74 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20  the error above 
10810 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72  is now caught pr
10820 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20  ior to reaching 
10830 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a  this point..  **
10840 20 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69   But the followi
10850 6e 67 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c  ng test is still
10860 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74   important as it
10870 20 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20   does come up.  
10880 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ** in the follow
10890 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ing:.  ** .  ** 
108a0 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
108b0 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20   main.ex1(a);.  
108c0 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 45  **     CREATE TE
108d0 4d 50 20 56 49 45 57 20 65 78 31 20 41 53 20 53  MP VIEW ex1 AS S
108e0 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31  ELECT a FROM ex1
108f0 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43  ;.  **     SELEC
10900 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78  T * FROM temp.ex
10910 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  1;.  */.  if( pT
10920 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a  able->nCol<0 ){.
10930 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10940 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
10950 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72  w %s is circular
10960 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61  ly defined", pTa
10970 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  ble->zName);.   
10980 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
10990 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
109a0 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f  >nCol>=0 );..  /
109b0 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
109c0 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77   far, it means w
109d0 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74  e need to comput
109e0 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  e the table name
109f0 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  s..  ** Note tha
10a00 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  t the call to sq
10a10 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
10a20 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78  Select() will ex
10a30 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a  pand any.  ** "*
10a40 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  " elements in th
10a50 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66  e results set of
10a60 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69   the view and wi
10a70 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72  ll assign cursor
10a80 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c  s.  ** to the el
10a90 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52  ements of the FR
10aa0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20  OM clause.  But 
10ab0 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  we do not want t
10ac0 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a  hese changes.  *
10ad0 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e  * to be permanen
10ae0 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75  t.  So the compu
10af0 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f  tation is done o
10b00 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  n a copy of the 
10b10 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74  SELECT.  ** stat
10b20 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
10b30 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a  es the view..  *
10b40 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  /.  assert( pTab
10b50 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20  le->pSelect );. 
10b60 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53   pSel = sqlite3S
10b70 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61  electDup(db, pTa
10b80 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29  ble->pSelect, 0)
10b90 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a  ;.  if( pSel ){.
10ba0 20 20 20 20 75 38 20 65 6e 61 62 6c 65 4c 6f 6f      u8 enableLoo
10bb0 6b 61 73 69 64 65 20 3d 20 64 62 2d 3e 6c 6f 6f  kaside = db->loo
10bc0 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3b  kaside.bEnabled;
10bd0 0a 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d  .    n = pParse-
10be0 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74  >nTab;.    sqlit
10bf0 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
10c00 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70  ursors(pParse, p
10c10 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20  Sel->pSrc);.    
10c20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d  pTable->nCol = -
10c30 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  1;.    db->looka
10c40 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20  side.bEnabled = 
10c50 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
10c60 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
10c70 54 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d  TION.    xAuth =
10c80 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20   db->xAuth;.    
10c90 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20  db->xAuth = 0;. 
10ca0 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
10cb0 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
10cc0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
10cd0 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75  el);.    db->xAu
10ce0 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73  th = xAuth;.#els
10cf0 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20  e.    pSelTab = 
10d00 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
10d10 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
10d20 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20   pSel);.#endif. 
10d30 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
10d40 2e 62 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62  .bEnabled = enab
10d50 6c 65 4c 6f 6f 6b 61 73 69 64 65 3b 0a 20 20 20  leLookaside;.   
10d60 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
10d70 6e 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54  n;.    if( pSelT
10d80 61 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ab ){.      asse
10d90 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  rt( pTable->aCol
10da0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61  ==0 );.      pTa
10db0 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c  ble->nCol = pSel
10dc0 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
10dd0 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
10de0 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
10df0 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43       pSelTab->nC
10e00 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53  ol = 0;.      pS
10e10 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
10e20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
10e30 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53  leteTable(db, pS
10e40 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 61 73  elTab);.      as
10e50 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
10e60 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
10e70 20 30 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63 68   0, pTable->pSch
10e80 65 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 70 54  ema) );.      pT
10e90 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 66  able->pSchema->f
10ea0 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73  lags |= DB_Unres
10eb0 65 74 56 69 65 77 73 3b 0a 20 20 20 20 7d 65 6c  etViews;.    }el
10ec0 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65  se{.      pTable
10ed0 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
10ee0 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a    nErr++;.    }.
10ef0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
10f00 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
10f10 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  );.  } else {.  
10f20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65    nErr++;.  }.#e
10f30 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
10f40 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65  MIT_VIEW */.  re
10f50 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23  turn nErr;  .}.#
10f60 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
10f70 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
10f80 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
10f90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
10fa0 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69  UALTABLE) */..#i
10fb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10fc0 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65  T_VIEW./*.** Cle
10fd0 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
10fe0 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56  mes from every V
10ff0 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20  IEW in database 
11000 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  idx..*/.static v
11010 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
11020 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  setAll(sqlite3 *
11030 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20  db, int idx){.  
11040 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61  HashElem *i;.  a
11050 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
11060 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
11070 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a 20 20 69  , idx, 0) );.  i
11080 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  f( !DbHasPropert
11090 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
110a0 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65  resetViews) ) re
110b0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71  turn;.  for(i=sq
110c0 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
110d0 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68  b->aDb[idx].pSch
110e0 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69  ema->tblHash); i
110f0 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  ;i=sqliteHashNex
11100 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  t(i)){.    Table
11110 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
11120 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
11130 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
11140 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
11150 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d  eDeleteColumnNam
11160 65 73 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20  es(db, pTab);.  
11170 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d      pTab->aCol =
11180 20 30 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   0;.      pTab->
11190 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  nCol = 0;.    }.
111a0 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f    }.  DbClearPro
111b0 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
111c0 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b  B_UnresetViews);
111d0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
111e0 65 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  e sqliteViewRese
111f0 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66  tAll(A,B).#endif
11200 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
11210 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  VIEW */../*.** T
11220 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11230 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44  called by the VD
11240 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  BE to adjust the
11250 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
11260 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69  .** used by SQLi
11270 74 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65  te when the btre
11280 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20  e layer moves a 
11290 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e  table root page.
112a0 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67   The.** root-pag
112b0 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
112c0 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73  index in databas
112d0 65 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65  e iDb has change
112e0 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20  d from iFrom.** 
112f0 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69  to iTo..**.** Ti
11300 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68 65  cket #1728:  The
11310 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69   symbol table mi
11320 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69  ght still contai
11330 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  n information.**
11340 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f   on tables and/o
11350 72 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 61  r indices that a
11360 72 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f  re the process o
11370 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e  f being deleted.
11380 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75  .** If you are u
11390 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74  nlucky, one of t
113a0 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64  hose deleted ind
113b0 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d  ices or tables m
113c0 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65  ight.** have the
113d0 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e   same rootpage n
113e0 75 6d 62 65 72 20 61 73 20 74 68 65 20 72 65 61  umber as the rea
113f0 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  l table or index
11400 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e   that is.** bein
11410 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20  g moved.  So we 
11420 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72  cannot stop sear
11430 63 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20  ching after the 
11440 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20  first match .** 
11450 62 65 63 61 75 73 65 20 74 68 65 20 66 69 72 73  because the firs
11460 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65  t match might be
11470 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
11480 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a  deleted indices.
11490 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64  ** or tables and
114a0 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69   not the table/i
114b0 6e 64 65 78 20 74 68 61 74 20 69 73 20 61 63 74  ndex that is act
114c0 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65  ually being move
114d0 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f  d..** We must co
114e0 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75  ntinue looping u
114f0 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20  ntil all tables 
11500 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74 68  and indices with
11510 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46  .** rootpage==iF
11520 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f  rom have been co
11530 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76 65 20  nverted to have 
11540 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54  a rootpage of iT
11550 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  o.** in order to
11560 20 62 65 20 63 65 72 74 61 69 6e 20 74 68 61 74   be certain that
11570 20 77 65 20 67 6f 74 20 74 68 65 20 72 69 67 68   we got the righ
11580 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  t one..*/.#ifnde
11590 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
115a0 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71  TOVACUUM.void sq
115b0 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76  lite3RootPageMov
115c0 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ed(sqlite3 *db, 
115d0 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 46 72  int iDb, int iFr
115e0 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20  om, int iTo){.  
115f0 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b  HashElem *pElem;
11600 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a  .  Hash *pHash;.
11610 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73    Db *pDb;..  as
11620 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
11630 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
11640 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 44   iDb, 0) );.  pD
11650 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
11660 5d 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44  ];.  pHash = &pD
11670 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
11680 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ash;.  for(pElem
11690 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
116a0 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  (pHash); pElem; 
116b0 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
116c0 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
116d0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
116e0 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
116f0 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
11700 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Tab->tnum==iFrom
11710 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
11720 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
11730 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20  }.  }.  pHash = 
11740 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  &pDb->pSchema->i
11750 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  dxHash;.  for(pE
11760 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
11770 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
11780 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
11790 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
117a0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
117b0 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
117c0 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
117d0 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pIdx->tnum==iF
117e0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64  rom ){.      pId
117f0 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  x->tnum = iTo;. 
11800 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
11810 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63  f../*.** Write c
11820 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65  ode to erase the
11830 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
11840 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f  -page iTable fro
11850 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a  m database iDb..
11860 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f  ** Also write co
11870 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  de to modify the
11880 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
11890 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61  able and interna
118a0 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61  l schema.** if a
118b0 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e   root-page of an
118c0 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
118d0 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
118e0 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a  e-layer whilst.*
118f0 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65  * erasing iTable
11900 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65   (this can happe
11910 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76  n with an auto-v
11920 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e  acuum database).
11930 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
11940 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
11950 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
11960 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20  int iTable, int 
11970 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  iDb){.  Vdbe *v 
11980 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
11990 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
119a0 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
119b0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
119c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
119d0 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  Op3(v, OP_Destro
119e0 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69  y, iTable, r1, i
119f0 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61  Db);.  sqlite3Ma
11a00 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
11a10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11a20 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
11a30 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73   /* OP_Destroy s
11a40 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65  tores an in inte
11a50 67 65 72 20 72 31 2e 20 49 66 20 74 68 69 73 20  ger r1. If this 
11a60 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20  integer.  ** is 
11a70 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
11a80 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  t is the root pa
11a90 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74  ge number of a t
11aa0 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20  able moved to.  
11ab0 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62  ** location iTab
11ac0 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
11ad0 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20  g code modifies 
11ae0 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
11af0 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20  r table to.  ** 
11b00 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20  reflect this..  
11b10 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e  **.  ** The "#NN
11b20 4e 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73  N" in the SQL is
11b30 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74   a special const
11b40 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ant that means w
11b50 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20  hatever value.  
11b60 2a 2a 20 69 73 20 69 6e 20 72 65 67 69 73 74 65  ** is in registe
11b70 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d  r NNN.  See gram
11b80 6d 61 72 20 72 75 6c 65 73 20 61 73 73 6f 63 69  mar rules associ
11b90 61 74 65 64 20 77 69 74 68 20 74 68 65 20 54 4b  ated with the TK
11ba0 5f 52 45 47 49 53 54 45 52 0a 20 20 2a 2a 20 74  _REGISTER.  ** t
11bb0 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69 74 69 6f  oken for additio
11bc0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
11bd0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e  .  */.  sqlite3N
11be0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
11bf0 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45  e, .     "UPDATE
11c00 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70   %Q.%s SET rootp
11c10 61 67 65 3d 25 64 20 57 48 45 52 45 20 23 25 64  age=%d WHERE #%d
11c20 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25   AND rootpage=#%
11c30 64 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d  d",.     pParse-
11c40 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
11c50 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
11c60 45 28 69 44 62 29 2c 20 69 54 61 62 6c 65 2c 20  E(iDb), iTable, 
11c70 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a  r1, r1);.#endif.
11c80 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
11c90 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
11ca0 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  r1);.}../*.** Wr
11cb0 69 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f  ite VDBE code to
11cc0 20 65 72 61 73 65 20 74 61 62 6c 65 20 70 54 61   erase table pTa
11cd0 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69  b and all associ
11ce0 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20  ated indices on 
11cf0 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f  disk..** Code to
11d00 20 75 70 64 61 74 65 20 74 68 65 20 73 71 6c 69   update the sqli
11d10 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73  te_master tables
11d20 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
11d30 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73  hema definitions
11d40 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f  .** in case a ro
11d50 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e  ot-page belongin
11d60 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62  g to another tab
11d70 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74  le is moved by t
11d80 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a  he btree layer.*
11d90 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20  * is also added 
11da0 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
11db0 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
11dc0 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
11dd0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
11de0 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73  estroyTable(Pars
11df0 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
11e00 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20   *pTab){.#ifdef 
11e10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
11e20 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a  VACUUM.  Index *
11e30 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 44 62 20  pIdx;.  int iDb 
11e40 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
11e50 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
11e60 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
11e70 29 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  );.  destroyRoot
11e80 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 54 61  Page(pParse, pTa
11e90 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  b->tnum, iDb);. 
11ea0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
11eb0 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
11ec0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
11ed0 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
11ee0 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 64  Page(pParse, pId
11ef0 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
11f00 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66   }.#else.  /* If
11f10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61   the database ma
11f20 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d  y be auto-vacuum
11f30 20 63 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c   capable (if SQL
11f40 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
11f50 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  UUM.  ** is not 
11f60 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69  defined), then i
11f70 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
11f80 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f  o call OP_Destro
11f90 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61  y on the.  ** ta
11fa0 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f  ble and index ro
11fb0 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65  ot-pages in orde
11fc0 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  r, starting with
11fd0 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79   the numerically
11fe0 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72   .  ** largest r
11ff0 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e  oot-page number.
12000 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   This guarantees
12010 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68   that none of th
12020 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a  e root-pages.  *
12030 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65  * to be destroye
12040 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62  d is relocated b
12050 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f  y an earlier OP_
12060 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66  Destroy. i.e. if
12070 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77   the.  ** follow
12080 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a  ing were coded:.
12090 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73    **.  ** OP_Des
120a0 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e  troy 4 0.  ** ..
120b0 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f  ..  ** OP_Destro
120c0 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20  y 5 0.  **.  ** 
120d0 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20  and root page 5 
120e0 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74  happened to be t
120f0 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
12100 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74  page number in t
12110 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
12120 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65  , then root page
12130 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65   5 would be move
12140 64 20 74 6f 20 70 61 67 65 20 34 20 62 79 20 74  d to page 4 by t
12150 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73  he .  ** "OP_Des
12160 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65  troy 4 0" opcode
12170 2e 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74  . The subsequent
12180 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30   "OP_Destroy 5 0
12190 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a  " would hit.  **
121a0 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67   a free-list pag
121b0 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54  e..  */.  int iT
121c0 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b  ab = pTab->tnum;
121d0 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65  .  int iDestroye
121e0 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28  d = 0;..  while(
121f0 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20   1 ){.    Index 
12200 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69  *pIdx;.    int i
12210 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20  Largest = 0;..  
12220 20 20 69 66 28 20 69 44 65 73 74 72 6f 79 65 64    if( iDestroyed
12230 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73  ==0 || iTab<iDes
12240 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20  troyed ){.      
12250 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b  iLargest = iTab;
12260 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
12270 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
12280 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
12290 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
122a0 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78   int iIdx = pIdx
122b0 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73  ->tnum;.      as
122c0 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68  sert( pIdx->pSch
122d0 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
122e0 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ma );.      if( 
122f0 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c  (iDestroyed==0 |
12300 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79  | (iIdx<iDestroy
12310 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61  ed)) && iIdx>iLa
12320 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  rgest ){.       
12330 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78   iLargest = iIdx
12340 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12350 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73 74      if( iLargest
12360 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
12370 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  urn;.    }else{.
12380 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
12390 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
123a0 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
123b0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
123c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
123d0 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61  Db>=0 && iDb<pPa
123e0 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a  rse->db->nDb );.
123f0 20 20 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f        destroyRoo
12400 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c  tPage(pParse, iL
12410 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20  argest, iDb);.  
12420 20 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d      iDestroyed =
12430 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d   iLargest;.    }
12440 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
12450 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72  *.** Remove entr
12460 69 65 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  ies from the sql
12470 69 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73  ite_statN tables
12480 20 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c   (for N in (1,2,
12490 33 29 29 0a 2a 2a 20 61 66 74 65 72 20 61 20 44  3)).** after a D
124a0 52 4f 50 20 49 4e 44 45 58 20 6f 72 20 44 52 4f  ROP INDEX or DRO
124b0 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e  P TABLE command.
124c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
124d0 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74  sqlite3ClearStat
124e0 54 61 62 6c 65 73 28 0a 20 20 50 61 72 73 65 20  Tables(.  Parse 
124f0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
12500 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
12510 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
12520 20 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20   iDb,           
12530 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
12540 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
12550 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
12560 65 2c 20 20 20 20 20 2f 2a 20 22 69 64 78 22 20  e,     /* "idx" 
12570 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f  or "tbl" */.  co
12580 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
12590 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
125a0 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 2a  index or table *
125b0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
125c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
125d0 61 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ame = pParse->db
125e0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
125f0 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d  ;.  for(i=1; i<=
12600 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  4; i++){.    cha
12610 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 20 20 20  r zTab[24];.    
12620 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
12630 28 73 69 7a 65 6f 66 28 7a 54 61 62 29 2c 7a 54  (sizeof(zTab),zT
12640 61 62 2c 22 73 71 6c 69 74 65 5f 73 74 61 74 25  ab,"sqlite_stat%
12650 64 22 2c 69 29 3b 0a 20 20 20 20 69 66 28 20 73  d",i);.    if( s
12660 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
12670 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62  pParse->db, zTab
12680 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b 0a 20 20  , zDbName) ){.  
12690 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
126a0 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
126b0 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
126c0 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
126d0 25 73 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20  %s=%Q",.        
126e0 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a  zDbName, zTab, z
126f0 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20  Type, zName.    
12700 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d    );.    }.  }.}
12710 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
12720 20 63 6f 64 65 20 74 6f 20 64 72 6f 70 20 61 20   code to drop a 
12730 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
12740 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61  qlite3CodeDropTa
12750 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
12760 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
12770 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 73 56  int iDb, int isV
12780 69 65 77 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  iew){.  Vdbe *v;
12790 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
127a0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54   pParse->db;.  T
127b0 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
127c0 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64  ;.  Db *pDb = &d
127d0 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
127e0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
127f0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
12800 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
12810 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
12820 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
12830 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 1, iDb);..#if
12840 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12850 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
12860 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
12870 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
12880 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
12890 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a  OP_VBegin);.  }.
128a0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f  #endif..  /* Dro
128b0 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61  p all triggers a
128c0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
128d0 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
128e0 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a  ropped. Code.  *
128f0 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  * is generated t
12900 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73  o remove entries
12910 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73   from sqlite_mas
12920 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20  ter and/or.  ** 
12930 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
12940 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  er if required..
12950 20 20 2a 2f 0a 20 20 70 54 72 69 67 67 65 72 20    */.  pTrigger 
12960 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72  = sqlite3Trigger
12970 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61  List(pParse, pTa
12980 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72  b);.  while( pTr
12990 69 67 67 65 72 20 29 7b 0a 20 20 20 20 61 73 73  igger ){.    ass
129a0 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70  ert( pTrigger->p
129b0 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
129c0 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20  chema || .      
129d0 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68    pTrigger->pSch
129e0 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
129f0 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73  pSchema );.    s
12a00 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65  qlite3DropTrigge
12a10 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72  rPtr(pParse, pTr
12a20 69 67 67 65 72 29 3b 0a 20 20 20 20 70 54 72 69  igger);.    pTri
12a30 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d  gger = pTrigger-
12a40 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66  >pNext;.  }..#if
12a50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12a60 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
12a70 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65   /* Remove any e
12a80 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71  ntries of the sq
12a90 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
12aa0 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
12ab0 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62  ith.  ** the tab
12ac0 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
12ad0 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62  . This is done b
12ae0 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20  efore the table 
12af0 69 73 20 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20  is dropped.  ** 
12b00 61 74 20 74 68 65 20 62 74 72 65 65 20 6c 65 76  at the btree lev
12b10 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  el, in case the 
12b20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
12b30 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20  table needs to. 
12b40 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65   ** move as a re
12b50 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70  sult of the drop
12b60 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20   (can happen in 
12b70 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
12b80 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  )..  */.  if( pT
12b90 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
12ba0 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  F_Autoincrement 
12bb0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  ){.    sqlite3Ne
12bc0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
12bd0 2c 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20  ,.      "DELETE 
12be0 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73  FROM %Q.sqlite_s
12bf0 65 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61  equence WHERE na
12c00 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 70 44  me=%Q",.      pD
12c10 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  b->zName, pTab->
12c20 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d  zName.    );.  }
12c30 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72  .#endif..  /* Dr
12c40 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41  op all SQLITE_MA
12c50 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69  STER table and i
12c60 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61  ndex entries tha
12c70 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20  t refer to the. 
12c80 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70   ** table. The p
12c90 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70  rogram name loop
12ca0 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61  s through the ma
12cb0 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64  ster table and d
12cc0 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65 76 65 72  eletes.  ** ever
12cd0 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72  y row that refer
12ce0 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20  s to a table of 
12cf0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
12d00 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20   the one being. 
12d10 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69   ** dropped. Tri
12d20 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65  ggers are handle
12d30 64 20 73 65 70 61 72 61 74 65 6c 79 20 62 65 63  d separately bec
12d40 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63  ause a trigger c
12d50 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74  an be.  ** creat
12d60 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64  ed in the temp d
12d70 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66  atabase that ref
12d80 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69  ers to a table i
12d90 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64  n another.  ** d
12da0 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
12db0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
12dc0 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
12dd0 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
12de0 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e  Q.%s WHERE tbl_n
12df0 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21  ame=%Q and type!
12e00 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20  ='trigger'",.   
12e10 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53     pDb->zName, S
12e20 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
12e30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
12e40 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26    if( !isView &&
12e50 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
12e60 29 20 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79  ) ){.    destroy
12e70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
12e80 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ab);.  }..  /* R
12e90 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
12ea0 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74  entry from SQLit
12eb0 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  e's internal sch
12ec0 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20  ema and modify. 
12ed0 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63   ** the schema c
12ee0 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  ookie..  */.  if
12ef0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
12f00 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
12f10 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
12f20 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20  _VDestroy, iDb, 
12f30 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
12f40 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  e, 0);.  }.  sql
12f50 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
12f60 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20  , OP_DropTable, 
12f70 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  iDb, 0, 0, pTab-
12f80 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71  >zName, 0);.  sq
12f90 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
12fa0 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
12fb0 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65    sqliteViewRese
12fc0 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d  tAll(db, iDb);.}
12fd0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
12fe0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
12ff0 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
13000 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74   a DROP TABLE st
13010 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d  atement..** pNam
13020 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
13030 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
13040 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69   dropped..*/.voi
13050 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62  d sqlite3DropTab
13060 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
13070 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
13080 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e  , int isView, in
13090 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c  t noErr){.  Tabl
130a0 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20  e *pTab;.  Vdbe 
130b0 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
130c0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
130d0 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
130e0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
130f0 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
13100 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
13110 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
13120 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
13130 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
13140 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69  ->nSrc==1 );.  i
13150 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73  f( noErr ) db->s
13160 75 70 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20  uppressErr++;.  
13170 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f  pTab = sqlite3Lo
13180 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50  cateTableItem(pP
13190 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20 26 70  arse, isView, &p
131a0 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69  Name->a[0]);.  i
131b0 66 28 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73  f( noErr ) db->s
131c0 75 70 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20  uppressErr--;.. 
131d0 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a   if( pTab==0 ){.
131e0 20 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20      if( noErr ) 
131f0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
13200 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61  yNamedSchema(pPa
13210 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  rse, pName->a[0]
13220 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
13230 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
13240 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62  table;.  }.  iDb
13250 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
13260 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
13270 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73  ->pSchema);.  as
13280 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
13290 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  iDb<db->nDb );..
132a0 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20    /* If pTab is 
132b0 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  a virtual table,
132c0 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c   call ViewGetCol
132d0 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e  umnNames() to en
132e0 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20  sure.  ** it is 
132f0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
13300 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
13310 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74  l(pTab) && sqlit
13320 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
13330 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
13340 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  b) ){.    goto e
13350 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
13360 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
13370 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
13380 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e  ATION.  {.    in
13390 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t code;.    cons
133a0 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53  t char *zTab = S
133b0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
133c0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
133d0 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
133e0 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
133f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
13400 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  2 = 0;.    if( s
13410 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
13420 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
13430 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20  ELETE, zTab, 0, 
13440 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74  zDb)){.      got
13450 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
13460 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
13470 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20   isView ){.     
13480 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
13490 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
134a0 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
134b0 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56  LITE_DROP_TEMP_V
134c0 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
134d0 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
134e0 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45   SQLITE_DROP_VIE
134f0 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  W;.      }.#ifnd
13500 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
13510 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
13520 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72 74  }else if( IsVirt
13530 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
13540 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
13550 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20  _DROP_VTABLE;.  
13560 20 20 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69      zArg2 = sqli
13570 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
13580 20 70 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e   pTab)->pMod->zN
13590 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ame;.#endif.    
135a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
135b0 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
135c0 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
135d0 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
135e0 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
135f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13600 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
13610 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b  LITE_DROP_TABLE;
13620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13630 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
13640 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
13650 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  code, pTab->zNam
13660 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29  e, zArg2, zDb) )
13670 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
13680 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
13690 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
136a0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
136b0 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
136c0 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
136d0 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
136e0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
136f0 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
13700 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73  }.#endif.  if( s
13710 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
13720 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
13730 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
13740 20 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e    && sqlite3StrN
13750 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
13760 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 22 2c  , "sqlite_stat",
13770 20 31 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 73   11)!=0 ){.    s
13780 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13790 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
137a0 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70   may not be drop
137b0 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ped", pTab->zNam
137c0 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
137d0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
137e0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
137f0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
13800 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42   Ensure DROP TAB
13810 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f  LE is not used o
13820 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52  n a view, and DR
13830 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75  OP VIEW is not u
13840 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61  sed.  ** on a ta
13850 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
13860 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
13870 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
13880 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13890 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
138a0 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c  ROP TABLE to del
138b0 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70  ete table %s", p
138c0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
138d0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
138e0 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  table;.  }.  if(
138f0 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62   !isView && pTab
13900 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
13910 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13920 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
13930 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74  OP VIEW to delet
13940 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62  e view %s", pTab
13950 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
13960 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
13970 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
13980 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
13990 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
139a0 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
139b0 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a  master table.  *
139c0 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  * on disk..  */.
139d0 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
139e0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
139f0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
13a00 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
13a10 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
13a20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  1, iDb);.    sql
13a30 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62  ite3ClearStatTab
13a40 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c  les(pParse, iDb,
13a50 20 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e   "tbl", pTab->zN
13a60 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
13a70 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61  3FkDropTable(pPa
13a80 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62  rse, pName, pTab
13a90 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  );.    sqlite3Co
13aa0 64 65 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72  deDropTable(pPar
13ab0 73 65 2c 20 70 54 61 62 2c 20 69 44 62 2c 20 69  se, pTab, iDb, i
13ac0 73 56 69 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69  sView);.  }..exi
13ad0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20  t_drop_table:.  
13ae0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
13af0 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b  lete(db, pName);
13b00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
13b10 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
13b20 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
13b30 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20   foreign key on 
13b40 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72  the table.** cur
13b50 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
13b60 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f  struction.  pFro
13b70 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20  mCol determines 
13b80 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a  which columns.**
13b90 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
13ba0 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74  table point to t
13bb0 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20  he foreign key. 
13bc0 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20   If pFromCol==0 
13bd0 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20  then.** connect 
13be0 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c  the key to the l
13bf0 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72  ast column inser
13c00 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65  ted.  pTo is the
13c10 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20   name of.** the 
13c20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64 20 74  table referred t
13c30 6f 20 28 61 2e 6b 2e 61 20 74 68 65 20 22 70 61  o (a.k.a the "pa
13c40 72 65 6e 74 22 20 74 61 62 6c 65 29 2e 20 20 70  rent" table).  p
13c50 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 0a  ToCol is a list.
13c60 2a 2a 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  ** of tables in 
13c70 74 68 65 20 70 61 72 65 6e 74 20 70 54 6f 20 74  the parent pTo t
13c80 61 62 6c 65 2e 20 20 66 6c 61 67 73 20 63 6f 6e  able.  flags con
13c90 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66  tains all.** inf
13ca0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
13cb0 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  he conflict reso
13cc0 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
13cd0 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69  s specified.** i
13ce0 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c  n the ON DELETE,
13cf0 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f   ON UPDATE and O
13d00 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73  N INSERT clauses
13d10 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20  ..**.** An FKey 
13d20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
13d30 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74  ated and added t
13d40 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
13d50 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63  ently.** under c
13d60 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74  onstruction in t
13d70 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  he pParse->pNewT
13d80 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a  able field..**.*
13d90 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  * The foreign ke
13da0 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d  y is set for IMM
13db0 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e  EDIATE processin
13dc0 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74  g.  A subsequent
13dd0 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69   call.** to sqli
13de0 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
13df0 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67  ey() might chang
13e00 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52  e this to DEFERR
13e10 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ED..*/.void sqli
13e20 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e  te3CreateForeign
13e30 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
13e40 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
13e50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
13e60 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46  /.  ExprList *pF
13e70 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75  romCol,  /* Colu
13e80 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c  mns in this tabl
13e90 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  e that point to 
13ea0 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
13eb0 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20   Token *pTo,    
13ec0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
13ed0 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
13ee0 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
13ef0 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f  pToCol,    /* Co
13f00 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68  lumns in the oth
13f10 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  er table */.  in
13f20 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
13f30 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72     /* Conflict r
13f40 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
13f50 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71  thms. */.){.  sq
13f60 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
13f70 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20  se->db;.#ifndef 
13f80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
13f90 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a  IGN_KEY.  FKey *
13fa0 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65  pFKey = 0;.  FKe
13fb0 79 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61  y *pNextTo;.  Ta
13fc0 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d  ble *p = pParse-
13fd0 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e  >pNewTable;.  in
13fe0 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69  t nByte;.  int i
13ff0 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  ;.  int nCol;.  
14000 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65  char *z;..  asse
14010 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20  rt( pTo!=0 );.  
14020 69 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44  if( p==0 || IN_D
14030 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f  ECLARE_VTAB ) go
14040 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28  to fk_end;.  if(
14050 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
14060 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
14070 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66  ->nCol-1;.    if
14080 28 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29 20  ( NEVER(iCol<0) 
14090 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20  ) goto fk_end;. 
140a0 20 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26     if( pToCol &&
140b0 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
140c0 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  1 ){.      sqlit
140d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
140e0 65 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20  e, "foreign key 
140f0 6f 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20  on %s".         
14100 22 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e  " should referen
14110 63 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75  ce only one colu
14120 6d 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c  mn of table %T",
14130 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  .         p->aCo
14140 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70  l[iCol].zName, p
14150 54 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  To);.      goto 
14160 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20  fk_end;.    }.  
14170 20 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65    nCol = 1;.  }e
14180 6c 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26  lse if( pToCol &
14190 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21  & pToCol->nExpr!
141a0 3d 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72  =pFromCol->nExpr
141b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
141c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
141d0 20 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20          "number 
141e0 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f  of columns in fo
141f0 72 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e  reign key does n
14200 6f 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d  ot match the num
14210 62 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20  ber of ".       
14220 20 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65   "columns in the
14230 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
14240 65 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  e");.    goto fk
14250 5f 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _end;.  }else{. 
14260 20 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43     nCol = pFromC
14270 6f 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20  ol->nExpr;.  }. 
14280 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
14290 2a 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d  *pFKey) + (nCol-
142a0 31 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d  1)*sizeof(pFKey-
142b0 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d  >aCol[0]) + pTo-
142c0 3e 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54  >n + 1;.  if( pT
142d0 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28  oCol ){.    for(
142e0 69 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e  i=0; i<pToCol->n
142f0 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
14300 20 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74    nByte += sqlit
14310 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f  e3Strlen30(pToCo
14320 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b  l->a[i].zName) +
14330 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
14340 70 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44  pFKey = sqlite3D
14350 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
14360 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70  nByte );.  if( p
14370 46 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67  FKey==0 ){.    g
14380 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a  oto fk_end;.  }.
14390 20 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d    pFKey->pFrom =
143a0 20 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65   p;.  pFKey->pNe
143b0 78 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65  xtFrom = p->pFKe
143c0 79 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  y;.  z = (char*)
143d0 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f  &pFKey->aCol[nCo
143e0 6c 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f  l];.  pFKey->zTo
143f0 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a   = z;.  memcpy(z
14400 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e  , pTo->z, pTo->n
14410 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d  );.  z[pTo->n] =
14420 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71   0;.  sqlite3Deq
14430 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20  uote(z);.  z += 
14440 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65  pTo->n+1;.  pFKe
14450 79 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a  y->nCol = nCol;.
14460 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
14470 30 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e  0 ){.    pFKey->
14480 61 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[0].iFrom = 
14490 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c  p->nCol-1;.  }el
144a0 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  se{.    for(i=0;
144b0 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
144c0 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
144d0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
144e0 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nCol; j++){.    
144f0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
14500 74 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a  trICmp(p->aCol[j
14510 5d 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f  ].zName, pFromCo
14520 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  l->a[i].zName)==
14530 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
14540 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46  FKey->aCol[i].iF
14550 72 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  rom = j;.       
14560 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14570 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14580 20 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c    if( j>=p->nCol
14590 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
145a0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
145b0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  se, .          "
145c0 75 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c  unknown column \
145d0 22 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e  "%s\" in foreign
145e0 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22   key definition"
145f0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  , .          pFr
14600 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  omCol->a[i].zNam
14610 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
14620 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d   fk_end;.      }
14630 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
14640 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66   pToCol ){.    f
14650 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
14660 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
14670 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
14680 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  n30(pToCol->a[i]
14690 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  .zName);.      p
146a0 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43  FKey->aCol[i].zC
146b0 6f 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65  ol = z;.      me
146c0 6d 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e  mcpy(z, pToCol->
146d0 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a  a[i].zName, n);.
146e0 20 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a        z[n] = 0;.
146f0 20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a        z += n+1;.
14700 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
14710 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
14720 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74  0;.  pFKey->aAct
14730 69 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c  ion[0] = (u8)(fl
14740 61 67 73 20 26 20 30 78 66 66 29 3b 20 20 20 20  ags & 0xff);    
14750 20 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45          /* ON DE
14760 4c 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20  LETE action */. 
14770 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b   pFKey->aAction[
14780 31 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73  1] = (u8)((flags
14790 20 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b   >> 8 ) & 0xff);
147a0 20 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45      /* ON UPDATE
147b0 20 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73   action */..  as
147c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
147d0 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
147e0 20 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 20   0, p->pSchema) 
147f0 29 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20 28  );.  pNextTo = (
14800 46 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48 61  FKey *)sqlite3Ha
14810 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63  shInsert(&p->pSc
14820 68 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20  hema->fkeyHash, 
14830 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54  .      pFKey->zT
14840 6f 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  o, sqlite3Strlen
14850 33 30 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2c 20  30(pFKey->zTo), 
14860 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20  (void *)pFKey.  
14870 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f  );.  if( pNextTo
14880 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 64  ==pFKey ){.    d
14890 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
148a0 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  = 1;.    goto fk
148b0 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _end;.  }.  if( 
148c0 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61  pNextTo ){.    a
148d0 73 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e  ssert( pNextTo->
148e0 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20  pPrevTo==0 );.  
148f0 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f    pFKey->pNextTo
14900 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20   = pNextTo;.    
14910 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f  pNextTo->pPrevTo
14920 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20   = pFKey;.  }.. 
14930 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72   /* Link the for
14940 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20  eign key to the 
14950 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73  table as the las
14960 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70  t step..  */.  p
14970 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b  ->pFKey = pFKey;
14980 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66  .  pFKey = 0;..f
14990 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33  k_end:.  sqlite3
149a0 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79  DbFree(db, pFKey
149b0 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  );.#endif /* !de
149c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
149d0 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a  T_FOREIGN_KEY) *
149e0 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  /.  sqlite3ExprL
149f0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46  istDelete(db, pF
14a00 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  romCol);.  sqlit
14a10 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
14a20 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a  (db, pToCol);.}.
14a30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
14a40 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
14a50 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20  en an INITIALLY 
14a60 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49  IMMEDIATE or INI
14a70 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a  TIALLY DEFERRED.
14a80 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65  ** clause is see
14a90 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66  n as part of a f
14aa0 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e  oreign key defin
14ab0 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65  ition.  The isDe
14ac0 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65  ferred.** parame
14ad0 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49  ter is 1 for INI
14ae0 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20  TIALLY DEFERRED 
14af0 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41  and 0 for INITIA
14b00 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a  LLY IMMEDIATE..*
14b10 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f  * The behavior o
14b20 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
14b30 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65  tly created fore
14b40 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73  ign key is adjus
14b50 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
14b60 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ly..*/.void sqli
14b70 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
14b80 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ey(Parse *pParse
14b90 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64  , int isDeferred
14ba0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
14bb0 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
14bc0 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  EY.  Table *pTab
14bd0 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b  ;.  FKey *pFKey;
14be0 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70  .  if( (pTab = p
14bf0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
14c00 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d  )==0 || (pFKey =
14c10 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30   pTab->pFKey)==0
14c20 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
14c30 65 72 74 28 20 69 73 44 65 66 65 72 72 65 64 3d  ert( isDeferred=
14c40 3d 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64  =0 || isDeferred
14c50 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d  ==1 ); /* EV: R-
14c60 33 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20  30323-21917 */. 
14c70 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
14c80 65 64 20 3d 20 28 75 38 29 69 73 44 65 66 65 72  ed = (u8)isDefer
14c90 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  red;.#endif.}../
14ca0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
14cb0 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61  de that will era
14cc0 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e  se and refill in
14cd0 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73  dex *pIdx.  This
14ce0 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69   is.** used to i
14cf0 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c  nitialize a newl
14d00 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 20  y created index 
14d10 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  or to recompute 
14d20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
14d30 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65  f an index in re
14d40 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e  sponse to a REIN
14d50 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  DEX command..**.
14d60 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67  ** if memRootPag
14d70 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76  e is not negativ
14d80 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  e, it means that
14d90 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65   the index is ne
14da0 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20  wly.** created. 
14db0 20 54 68 65 20 72 65 67 69 73 74 65 72 20 73 70   The register sp
14dc0 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f  ecified by memRo
14dd0 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  otPage contains 
14de0 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
14df0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
14e00 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f  ndex.  If memRoo
14e10 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76  tPage is negativ
14e20 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69  e, then.** the i
14e30 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
14e40 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  sts and must be 
14e50 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 62  cleared before b
14e60 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e  eing refilled an
14e70 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61  d.** the root pa
14e80 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
14e90 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20   index is taken 
14ea0 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  from pIndex->tnu
14eb0 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
14ec0 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49  d sqlite3RefillI
14ed0 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
14ee0 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  se, Index *pInde
14ef0 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61  x, int memRootPa
14f00 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ge){.  Table *pT
14f10 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
14f20 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62  ble;  /* The tab
14f30 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65 78  le that is index
14f40 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ed */.  int iTab
14f50 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
14f60 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  +;     /* Btree 
14f70 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
14f80 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49  pTab */.  int iI
14f90 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  dx = pParse->nTa
14fa0 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65  b++;     /* Btre
14fb0 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f  e cursor used fo
14fc0 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  r pIndex */.  in
14fd0 74 20 69 53 6f 72 74 65 72 3b 20 20 20 20 20 20  t iSorter;      
14fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14ff0 43 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79  Cursor opened by
15000 20 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66 20   OpenSorter (if 
15010 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74  in use) */.  int
15020 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20   addr1;         
15030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
15040 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66  ddress of top of
15050 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61   loop */.  int a
15060 64 64 72 32 3b 20 20 20 20 20 20 20 20 20 20 20  ddr2;           
15070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
15080 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20  ress to jump to 
15090 66 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74 69  for next iterati
150a0 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d  on */.  int tnum
150b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
150c0 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
150d0 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  age of index */.
150e0 20 20 69 6e 74 20 69 50 61 72 74 49 64 78 4c 61    int iPartIdxLa
150f0 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  bel;            
15100 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73   /* Jump to this
15110 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70 20 61   label to skip a
15120 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a   row */.  Vdbe *
15130 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
15140 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
15150 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
15160 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
15170 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ine */.  KeyInfo
15180 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20   *pKey;         
15190 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e          /* KeyIn
151a0 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a  fo for index */.
151b0 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b    int regRecord;
151c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151d0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
151e0 64 69 6e 67 20 61 73 73 65 6d 62 6c 69 65 64 20  ding assemblied 
151f0 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
15200 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
15210 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
15220 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
15230 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
15240 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
15250 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
15260 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  db, pIndex->pSch
15270 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ema);..#ifndef S
15280 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
15290 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73  RIZATION.  if( s
152a0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
152b0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
152c0 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e  EINDEX, pIndex->
152d0 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20  zName, 0,.      
152e0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
152f0 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75  me ) ){.    retu
15300 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
15310 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77    /* Require a w
15320 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
15330 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72   table to perfor
15340 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  m this operation
15350 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62   */.  sqlite3Tab
15360 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
15370 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
15380 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  1, pTab->zName);
15390 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
153a0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
153b0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
153c0 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  urn;.  if( memRo
153d0 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  otPage>=0 ){.   
153e0 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50   tnum = memRootP
153f0 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
15400 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d    tnum = pIndex-
15410 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65  >tnum;.  }.  pKe
15420 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  y = sqlite3KeyIn
15430 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
15440 2c 20 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a  , pIndex);..  /*
15450 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72   Open the sorter
15460 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72   cursor if we ar
15470 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f  e to use one. */
15480 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61  .  iSorter = pPa
15490 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
154a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
154b0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  (v, OP_SorterOpe
154c0 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 30  n, iSorter, 0, 0
154d0 2c 20 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20  , (char*).      
154e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
154f0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28  lite3KeyInfoRef(
15500 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46  pKey), P4_KEYINF
15510 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  O);..  /* Open t
15520 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74  he table. Loop t
15530 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20  hrough all rows 
15540 6f 66 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e  of the table, in
15550 73 65 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20  serting index.  
15560 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20  ** records into 
15570 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20  the sorter. */. 
15580 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c   sqlite3OpenTabl
15590 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20  e(pParse, iTab, 
155a0 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70  iDb, pTab, OP_Op
155b0 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31  enRead);.  addr1
155c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
155d0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
155e0 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 72  d, iTab, 0);.  r
155f0 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74  egRecord = sqlit
15600 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
15610 72 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  rse);..  sqlite3
15620 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
15630 28 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69  (pParse,pIndex,i
15640 54 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c  Tab,regRecord,0,
15650 26 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30  &iPartIdxLabel,0
15660 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ,0);.  sqlite3Vd
15670 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
15680 6f 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f  orterInsert, iSo
15690 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29  rter, regRecord)
156a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
156b0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69  esolveLabel(v, i
156c0 50 61 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a 20  PartIdxLabel);. 
156d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
156e0 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69  p2(v, OP_Next, i
156f0 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20  Tab, addr1+1);. 
15700 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
15710 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
15720 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
15730 65 3c 30 20 29 20 73 71 6c 69 74 65 33 56 64 62  e<0 ) sqlite3Vdb
15740 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
15750 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b  ear, tnum, iDb);
15760 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15770 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp4(v, OP_OpenW
15780 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d  rite, iIdx, tnum
15790 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20  , iDb, .        
157a0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
157b0 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  r *)pKey, P4_KEY
157c0 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33  INFO);.  sqlite3
157d0 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
157e0 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28  OPFLAG_BULKCSR|(
157f0 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29  (memRootPage>=0)
15800 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3a  ?OPFLAG_P2ISREG:
15810 30 29 29 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20  0));..  addr1 = 
15820 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15830 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f  2(v, OP_SorterSo
15840 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 30 29 3b  rt, iSorter, 0);
15850 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 21  .  assert( pKey!
15860 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
15870 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
15880 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 69 66 28 20  ->nErr );.  if( 
15890 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
158a0 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 70 4b 65 79  =OE_None && pKey
158b0 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  !=0 ){.    int j
158c0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
158d0 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
158e0 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  3;.    sqlite3Vd
158f0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
15900 6f 74 6f 2c 20 30 2c 20 6a 32 29 3b 0a 20 20 20  oto, 0, j2);.   
15910 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33   addr2 = sqlite3
15920 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
15930 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
15940 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
15950 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65  OP_SorterCompare
15960 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72  , iSorter, j2, r
15970 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20  egRecord,.      
15980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15990 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20     pKey->nField 
159a0 2d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  - pIndex->nKeyCo
159b0 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 55  l);.    sqlite3U
159c0 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28  niqueConstraint(
159d0 70 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74  pParse, OE_Abort
159e0 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 65 6c  , pIndex);.  }el
159f0 73 65 7b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  se{.    addr2 = 
15a00 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
15a10 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20  ntAddr(v);.  }. 
15a20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15a30 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44  p2(v, OP_SorterD
15a40 61 74 61 2c 20 69 53 6f 72 74 65 72 2c 20 72 65  ata, iSorter, re
15a50 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69  gRecord);.  sqli
15a60 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
15a70 20 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69   OP_IdxInsert, i
15a80 49 64 78 2c 20 72 65 67 52 65 63 6f 72 64 2c 20  Idx, regRecord, 
15a90 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
15aa0 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
15ab0 4c 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c  LAG_USESEEKRESUL
15ac0 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  T);.  sqlite3Rel
15ad0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
15ae0 73 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  se, regRecord);.
15af0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15b00 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
15b10 4e 65 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61  Next, iSorter, a
15b20 64 64 72 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  ddr2);.  sqlite3
15b30 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
15b40 61 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74  addr1);..  sqlit
15b50 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
15b60 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b  OP_Close, iTab);
15b70 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15b80 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
15b90 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74  , iIdx);.  sqlit
15ba0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
15bb0 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65  OP_Close, iSorte
15bc0 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  r);.}../*.** All
15bd0 6f 63 61 74 65 20 68 65 61 70 20 73 70 61 63 65  ocate heap space
15be0 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65   to hold an Inde
15bf0 78 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43  x object with nC
15c00 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a  ol columns..**.*
15c10 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 61  * Increase the a
15c20 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74  llocation size t
15c30 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74  o provide an ext
15c40 72 61 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  ra nExtra bytes.
15c50 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69  ** of 8-byte ali
15c60 67 6e 65 64 20 73 70 61 63 65 20 61 66 74 65 72  gned space after
15c70 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
15c80 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a  t and return a.*
15c90 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  * pointer to thi
15ca0 73 20 65 78 74 72 61 20 73 70 61 63 65 20 69 6e  s extra space in
15cb0 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e   *ppExtra..*/.In
15cc0 64 65 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f  dex *sqlite3Allo
15cd0 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  cateIndexObject(
15ce0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
15cf0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
15d00 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
15d10 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20  /.  i16 nCol,   
15d20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
15d30 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  l number of colu
15d40 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
15d50 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
15d60 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ,          /* Nu
15d70 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
15d80 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20   extra space to 
15d90 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
15da0 2a 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20  **ppExtra       
15db0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
15dc0 65 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20  e "extra" space 
15dd0 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
15de0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
15df0 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20  Allocated index 
15e00 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
15e10 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
15e20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
15e30 63 65 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a  ce for Index obj
15e40 65 63 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a  ect + arrays */.
15e50 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
15e60 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29  8(sizeof(Index))
15e70 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
15e80 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  /* Index structu
15e90 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  re  */.         
15ea0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63   ROUND8(sizeof(c
15eb0 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20  har*)*nCol) +   
15ec0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
15ed0 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20  zColl     */.   
15ee0 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69         ROUND8(si
15ef0 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 28 6e  zeof(tRowcnt)*(n
15f00 43 6f 6c 2b 31 29 20 2b 20 20 20 20 2f 2a 20 49  Col+1) +    /* I
15f10 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 20 20 20  ndex.aiRowEst   
15f20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
15f30 20 20 20 20 73 69 7a 65 6f 66 28 69 31 36 29 2a      sizeof(i16)*
15f40 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20  nCol +          
15f50 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c    /* Index.aiCol
15f60 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  umn   */.       
15f70 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
15f80 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20  (u8)*nCol);     
15f90 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
15fa0 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20  .aSortOrder */. 
15fb0 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61   p = sqlite3DbMa
15fc0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
15fd0 74 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20  te + nExtra);.  
15fe0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61  if( p ){.    cha
15ff0 72 20 2a 70 45 78 74 72 61 20 3d 20 28 28 63 68  r *pExtra = ((ch
16000 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73 69  ar*)p)+ROUND8(si
16010 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20  zeof(Index));.  
16020 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63    p->azColl = (c
16030 68 61 72 2a 2a 29 70 45 78 74 72 61 3b 20 20 20  har**)pExtra;   
16040 20 20 20 70 45 78 74 72 61 20 2b 3d 20 52 4f 55     pExtra += ROU
16050 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  ND8(sizeof(char*
16060 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e  )*nCol);.    p->
16070 61 69 52 6f 77 45 73 74 20 3d 20 28 74 52 6f 77  aiRowEst = (tRow
16080 63 6e 74 2a 29 70 45 78 74 72 61 3b 20 20 70 45  cnt*)pExtra;  pE
16090 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 74  xtra += sizeof(t
160a0 52 6f 77 63 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29  Rowcnt)*(nCol+1)
160b0 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d  ;.    p->aiColum
160c0 6e 20 3d 20 28 69 31 36 2a 29 70 45 78 74 72 61  n = (i16*)pExtra
160d0 3b 20 20 20 20 20 20 70 45 78 74 72 61 20 2b 3d  ;      pExtra +=
160e0 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f   sizeof(i16)*nCo
160f0 6c 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f  l;.    p->aSortO
16100 72 64 65 72 20 3d 20 28 75 38 2a 29 70 45 78 74  rder = (u8*)pExt
16110 72 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75  ra;.    p->nColu
16120 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70  mn = nCol;.    p
16130 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c  ->nKeyCol = nCol
16140 20 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45 78 74   - 1;.    *ppExt
16150 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29 20  ra = ((char*)p) 
16160 2b 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72  + nByte;.  }.  r
16170 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
16180 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69  * Create a new i
16190 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20  ndex for an SQL 
161a0 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70  table.  pName1.p
161b0 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d  Name2 is the nam
161c0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a  e of the index .
161d0 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20  ** and pTblList 
161e0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
161f0 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
16200 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
16210 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62   Both will .** b
16220 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69  e NULL for a pri
16230 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69  mary key or an i
16240 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65  ndex that is cre
16250 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  ated to satisfy 
16260 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73  a.** UNIQUE cons
16270 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62  traint.  If pTab
16280 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72  le and pIndex ar
16290 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72  e NULL, use pPar
162a0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a  se->pNewTable.**
162b0 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f   as the table to
162c0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50   be indexed.  pP
162d0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
162e0 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  is a table that 
162f0 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  is.** currently 
16300 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
16310 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41  d by a CREATE TA
16320 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
16330 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20  *.** pList is a 
16340 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
16350 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
16360 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55  pList will be NU
16370 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  LL if this.** is
16380 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
16390 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61  r unique-constra
163a0 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  int on the most 
163b0 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64  recent column ad
163c0 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61  ded.** to the ta
163d0 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
163e0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
163f0 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
16400 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
16410 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
16420 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
16430 20 74 6f 20 74 68 65 20 6e 65 77 20 49 6e 64 65   to the new Inde
16440 78 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20  x.** structure. 
16450 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
16460 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
16470 79 4b 65 79 28 29 20 74 6f 20 6d 61 72 6b 20 74  yKey() to mark t
16480 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74  he index.** as t
16490 68 65 20 74 61 62 6c 65 73 20 70 72 69 6d 61 72  he tables primar
164a0 79 20 6b 65 79 20 28 49 6e 64 65 78 2e 61 75 74  y key (Index.aut
164b0 6f 49 6e 64 65 78 3d 3d 32 29 2e 0a 2a 2f 0a 49  oIndex==2)..*/.I
164c0 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 43 72 65  ndex *sqlite3Cre
164d0 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ateIndex(.  Pars
164e0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
164f0 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * All informatio
16500 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72  n about this par
16510 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
16520 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69  Name1,     /* Fi
16530 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65  rst part of inde
16540 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
16550 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
16560 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53  pName2,     /* S
16570 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e  econd part of in
16580 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
16590 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69   NULL */.  SrcLi
165a0 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a  st *pTblName, /*
165b0 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   Table to index.
165c0 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   Use pParse->pNe
165d0 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20  wTable if 0 */. 
165e0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
165f0 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66  ,   /* A list of
16600 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
16610 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
16620 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f  onError,       /
16630 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49  * OE_Abort, OE_I
16640 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63  gnore, OE_Replac
16650 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f  e, or OE_None */
16660 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
16670 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
16680 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
16690 65 67 69 6e 73 20 74 68 69 73 20 73 74 61 74 65  egins this state
166a0 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ment */.  Expr *
166b0 70 50 49 57 68 65 72 65 2c 20 20 20 20 2f 2a 20  pPIWhere,    /* 
166c0 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72  WHERE clause for
166d0 20 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73   partial indices
166e0 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
166f0 64 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74  der,     /* Sort
16700 20 6f 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72   order of primar
16710 79 20 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74  y key when pList
16720 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  ==NULL */.  int 
16730 69 66 4e 6f 74 45 78 69 73 74 20 20 20 20 20 2f  ifNotExist     /
16740 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20  * Omit error if 
16750 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
16760 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  ists */.){.  Ind
16770 65 78 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20  ex *pRet = 0;   
16780 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
16790 72 65 74 75 72 6e 20 2a 2f 0a 20 20 54 61 62 6c  return */.  Tabl
167a0 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
167b0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
167c0 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64  indexed */.  Ind
167d0 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20  ex *pIndex = 0; 
167e0 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
167f0 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  o be created */.
16800 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
16810 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  0;     /* Name o
16820 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  f the index */. 
16830 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
16840 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16850 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
16860 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20   zName */.  int 
16870 69 2c 20 6a 3b 0a 20 20 44 62 46 69 78 65 72 20  i, j;.  DbFixer 
16880 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  sFix;        /* 
16890 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61  For assigning da
168a0 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20  tabase names to 
168b0 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  pTable */.  int 
168c0 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20  sortOrderMask;  
168d0 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44   /* 1 to honor D
168e0 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30  ESC in index.  0
168f0 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20   to ignore. */. 
16900 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
16910 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20  Parse->db;.  Db 
16920 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
16930 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69    /* The specifi
16940 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  c table containi
16950 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20 64  ng the indexed d
16960 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
16970 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
16980 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
16990 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
169a0 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
169b0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
169c0 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e  me = 0;    /* Un
169d0 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f  qualified name o
169e0 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63  f the index to c
169f0 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  reate */.  struc
16a00 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
16a10 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46  *pListItem; /* F
16a20 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
16a30 70 4c 69 73 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  pList */.  const
16a40 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c   Column *pTabCol
16a50 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
16a60 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74   column in the t
16a70 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  able */.  int nE
16a80 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20  xtra = 0;       
16a90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
16aa0 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
16ab0 72 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20  r zExtra[] */.  
16ac0 69 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20  int nExtraCol;  
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ae0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
16af0 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64  tra columns need
16b00 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  ed */.  char *zE
16b10 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20  xtra = 0;       
16b20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
16b30 61 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68  a space after th
16b40 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  e Index object *
16b50 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d  /.  Index *pPk =
16b60 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d   0;      /* PRIM
16b70 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f  ARY KEY index fo
16b80 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
16b90 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 61 73 73  tables */..  ass
16ba0 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
16bb0 72 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  r==0 );      /* 
16bc0 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  Never called wit
16bd0 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a  h prior errors *
16be0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
16bf0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44  ocFailed || IN_D
16c00 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20  ECLARE_VTAB ){. 
16c10 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
16c20 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
16c30 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
16c40 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
16c50 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
16c60 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
16c70 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
16c80 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
16c90 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
16ca0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52  o be indexed.  R
16cb0 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e  eturn early if n
16cc0 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
16cd0 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
16ce0 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20   ){..    /* Use 
16cf0 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64  the two-part ind
16d00 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  ex name to deter
16d10 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73  mine the databas
16d20 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61  e .    ** to sea
16d30 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c  rch for the tabl
16d40 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62  e. 'Fix' the tab
16d50 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20  le name to this 
16d60 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  db.    ** before
16d70 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20   looking up the 
16d80 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
16d90 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
16da0 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20   && pName2 );.  
16db0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
16dc0 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
16dd0 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
16de0 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
16df0 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f  if( iDb<0 ) goto
16e00 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
16e10 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
16e20 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e  pName && pName->
16e30 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  z );..#ifndef SQ
16e40 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42  LITE_OMIT_TEMPDB
16e50 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
16e60 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e  ndex name was un
16e70 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b  qualified, check
16e80 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20   if the table.  
16e90 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74    ** is a temp t
16ea0 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74  able. If so, set
16eb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
16ec0 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68   1. Do not do th
16ed0 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69  is.    ** if ini
16ee0 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61  tialising a data
16ef0 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20  base schema..   
16f00 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d   */.    if( !db-
16f10 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
16f20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
16f30 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28  e3SrcListLookup(
16f40 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65  pParse, pTblName
16f50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61  );.      if( pNa
16f60 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61  me2->n==0 && pTa
16f70 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65  b && pTab->pSche
16f80 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
16f90 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
16fa0 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20    iDb = 1;.     
16fb0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
16fc0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 49  .    sqlite3FixI
16fd0 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
16fe0 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c  e, iDb, "index",
16ff0 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
17000 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
17010 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61  st(&sFix, pTblNa
17020 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  me) ){.      /* 
17030 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73  Because the pars
17040 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54  er constructs pT
17050 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69  blName from a si
17060 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c  ngle identifier,
17070 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
17080 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20  3FixSrcList can 
17090 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20  never fail. */. 
170a0 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
170b0 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
170c0 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
170d0 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
170e0 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b  0, &pTblName->a[
170f0 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0]);.    assert(
17100 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
17110 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20  d==0 || pTab==0 
17120 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
17130 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
17140 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
17150 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64   if( iDb==1 && d
17160 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
17170 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema!=pTab->pSche
17180 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ma ){.      sqli
17190 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
171a0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
171b0 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61  "cannot create a
171c0 20 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e   TEMP index on n
171d0 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22  on-TEMP table \"
171e0 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\"",.         
171f0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
17200 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
17210 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
17220 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73    }.    if( !Has
17230 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 50  Rowid(pTab) ) pP
17240 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
17250 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
17260 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
17270 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
17280 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
17290 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Start==0 );.    
172a0 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
172b0 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66  NewTable;.    if
172c0 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65  ( !pTab ) goto e
172d0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
172e0 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
172f0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
17300 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
17310 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d  ma);.  }.  pDb =
17320 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
17330 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21  .  assert( pTab!
17340 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
17350 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
17360 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
17370 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
17380 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
17390 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26   7)==0 .       &
173a0 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
173b0 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37  p(&pTab->zName[7
173c0 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29  ],"altertab_",9)
173d0 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
173e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
173f0 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
17400 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
17410 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
17420 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
17430 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
17440 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17450 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70  MIT_VIEW.  if( p
17460 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
17470 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
17480 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
17490 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ws may not be in
174a0 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74  dexed");.    got
174b0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
174c0 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  dex;.  }.#endif.
174d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
174e0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
174f0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
17500 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
17510 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
17520 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74  arse, "virtual t
17530 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
17540 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
17550 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
17560 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
17570 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  if..  /*.  ** Fi
17580 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
17590 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  he index.  Make 
175a0 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
175b0 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65  t already anothe
175c0 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  r.  ** index or 
175d0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
175e0 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a  ame name.  .  **
175f0 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
17600 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64    If we are read
17610 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ing the names of
17620 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63   permanent indic
17630 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  es from the.  **
17640 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
17650 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f  able (because so
17660 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
17670 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68   changed the sch
17680 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e  ema) and.  ** on
17690 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e  e of the index n
176a0 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69  ames collides wi
176b0 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  th the name of a
176c0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
176d0 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20   or.  ** index, 
176e0 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e  then we will con
176f0 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73  tinue to process
17700 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a   this index..  *
17710 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d  *.  ** If pName=
17720 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  =0 it means that
17730 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61   we are.  ** dea
17740 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d  ling with a prim
17750 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55  ary key or UNIQU
17760 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57  E constraint.  W
17770 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74  e have to invent
17780 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61   our.  ** own na
17790 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  me..  */.  if( p
177a0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  Name ){.    zNam
177b0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
177c0 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
177d0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  me);.    if( zNa
177e0 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
177f0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
17800 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
17810 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69  e->z!=0 );.    i
17820 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
17830 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
17840 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61  Name(pParse, zNa
17850 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  me) ){.      got
17860 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
17870 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
17880 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
17890 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  y ){.      if( s
178a0 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
178b0 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30  db, zName, 0)!=0
178c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
178d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
178e0 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
178f0 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61  ready a table na
17900 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
17910 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
17920 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
17930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17940 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
17950 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
17960 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d  e, pDb->zName)!=
17970 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
17980 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20  ifNotExist ){.  
17990 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
179a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
179b0 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20  ndex %s already 
179c0 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b  exists", zName);
179d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
179e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
179f0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
17a00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
17a10 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
17a20 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
17a30 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
17a40 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
17a50 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ex;.    }.  }els
17a60 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  e{.    int n;.  
17a70 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a    Index *pLoop;.
17a80 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54      for(pLoop=pT
17a90 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b  ab->pIndex, n=1;
17aa0 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
17ab0 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29  oop->pNext, n++)
17ac0 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  {}.    zName = s
17ad0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
17ae0 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
17af0 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62  dex_%s_%d", pTab
17b00 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ->zName, n);.   
17b10 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
17b20 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
17b30 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
17b40 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
17b50 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69  heck for authori
17b60 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  zation to create
17b70 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   an index..  */.
17b80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17b90 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
17ba0 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  N.  {.    const 
17bb0 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d  char *zDb = pDb-
17bc0 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  >zName;.    if( 
17bd0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
17be0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
17bf0 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
17c00 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44  ABLE(iDb), 0, zD
17c10 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
17c20 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
17c30 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  ex;.    }.    i 
17c40 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
17c50 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21  INDEX;.    if( !
17c60 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
17c70 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49  Db==1 ) i = SQLI
17c80 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
17c90 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
17ca0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
17cb0 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c  Parse, i, zName,
17cc0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
17cd0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
17ce0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
17cf0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
17d00 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  ndif..  /* If pL
17d10 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73  ist==0, it means
17d20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
17d30 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65  s called to make
17d40 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20   a primary.  ** 
17d50 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  key out of the l
17d60 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
17d70 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
17d80 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
17d90 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65  ..  ** So create
17da0 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20   a fake list to 
17db0 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20  simulate this.. 
17dc0 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
17dd0 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
17de0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
17df0 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
17e00 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
17e10 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
17e20 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
17e30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30  ;.    pList->a[0
17e40 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
17e50 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65  3DbStrDup(pParse
17e60 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
17e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
17e90 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
17ea0 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col-1].zName);. 
17eb0 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73     pList->a[0].s
17ec0 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 73  ortOrder = (u8)s
17ed0 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
17ee0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
17ef0 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ow many bytes of
17f00 20 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69   space are requi
17f10 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70  red to store exp
17f20 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65  licitly.  ** spe
17f30 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  cified collation
17f40 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e   sequence names.
17f50 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
17f60 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
17f70 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
17f80 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  *pExpr = pList->
17f90 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
17fa0 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20  if( pExpr ){.   
17fb0 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
17fc0 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
17fd0 20 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   );.      nExtra
17fe0 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33   += (1 + sqlite3
17ff0 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e  Strlen30(pExpr->
18000 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20  u.zToken));.    
18010 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a  }.  }..  /* .  *
18020 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  * Allocate the i
18030 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
18040 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20  .  */.  nName = 
18050 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
18060 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61  zName);.  nExtra
18070 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d  Col = pPk ? pPk-
18080 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20  >nKeyCol : 1;.  
18090 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
180a0 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a  AllocateIndexObj
180b0 65 63 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e  ect(db, pList->n
180c0 45 78 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c  Expr + nExtraCol
180d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
180e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180f0 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20          nName + 
18100 6e 45 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78  nExtra + 1, &zEx
18110 74 72 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tra);.  if( db->
18120 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
18130 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
18140 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
18150 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
18160 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
18170 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 29  Index->aiRowEst)
18180 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   );.  assert( EI
18190 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
181a0 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  NT(pIndex->azCol
181b0 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  l) );.  pIndex->
181c0 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a  zName = zExtra;.
181d0 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d    zExtra += nNam
181e0 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28  e + 1;.  memcpy(
181f0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a  pIndex->zName, z
18200 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a  Name, nName+1);.
18210 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
18220 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65   = pTab;.  pInde
18230 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38  x->onError = (u8
18240 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64  )onError;.  pInd
18250 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  ex->uniqNotNull 
18260 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  = onError!=OE_No
18270 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75  ne;.  pIndex->au
18280 74 6f 49 6e 64 65 78 20 3d 20 28 75 38 29 28 70  toIndex = (u8)(p
18290 4e 61 6d 65 3d 3d 30 29 3b 0a 20 20 70 49 6e 64  Name==0);.  pInd
182a0 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62  ex->pSchema = db
182b0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
182c0 6d 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 4b  ma;.  pIndex->nK
182d0 65 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e  eyCol = pList->n
182e0 45 78 70 72 3b 0a 20 20 69 66 28 20 70 50 49 57  Expr;.  if( pPIW
182f0 68 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  here ){.    sqli
18300 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65  te3ResolveSelfRe
18310 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20  ference(pParse, 
18320 70 54 61 62 2c 20 4e 43 5f 50 61 72 74 49 64 78  pTab, NC_PartIdx
18330 2c 20 70 50 49 57 68 65 72 65 2c 20 30 29 3b 0a  , pPIWhere, 0);.
18340 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 50 61 72      pIndex->pPar
18350 74 49 64 78 57 68 65 72 65 20 3d 20 70 50 49 57  tIdxWhere = pPIW
18360 68 65 72 65 3b 0a 20 20 20 20 70 50 49 57 68 65  here;.    pPIWhe
18370 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  re = 0;.  }.  as
18380 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
18390 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
183a0 20 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20 2f   iDb, 0) );..  /
183b0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
183c0 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f  f we should hono
183d0 72 20 44 45 53 43 20 72 65 71 75 65 73 74 73 20  r DESC requests 
183e0 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  on index columns
183f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d  .  */.  if( pDb-
18400 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66  >pSchema->file_f
18410 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20  ormat>=4 ){.    
18420 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20  sortOrderMask = 
18430 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44  -1;   /* Honor D
18440 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  ESC */.  }else{.
18450 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73      sortOrderMas
18460 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e  k = 0;    /* Ign
18470 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a  ore DESC */.  }.
18480 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e  .  /* Scan the n
18490 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75  ames of the colu
184a0 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  mns of the table
184b0 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61   to be indexed a
184c0 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65  nd.  ** load the
184d0 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20   column indices 
184e0 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73  into the Index s
184f0 74 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72  tructure.  Repor
18500 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20  t an error.  ** 
18510 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73  if any column is
18520 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2a   not found..  **
18530 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 20 41 64 64  .  ** TODO:  Add
18540 20 61 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20   a test to make 
18550 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73 61  sure that the sa
18560 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74  me column is not
18570 20 6e 61 6d 65 64 0a 20 20 2a 2a 20 6d 6f 72 65   named.  ** more
18580 20 74 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69   than once withi
18590 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78  n the same index
185a0 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73  .  Only the firs
185b0 74 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 20 20  t instance of.  
185c0 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69  ** the column wi
185d0 6c 6c 20 65 76 65 72 20 62 65 20 75 73 65 64 20  ll ever be used 
185e0 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72  by the optimizer
185f0 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 75 73 69  .  Note that usi
18600 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  ng the.  ** same
18610 20 63 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74 68 61   column more tha
18620 6e 20 6f 6e 63 65 20 63 61 6e 6e 6f 74 20 62 65  n once cannot be
18630 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
18640 65 20 74 68 61 74 20 77 6f 75 6c 64 20 0a 20 20  e that would .  
18650 2a 2a 20 62 72 65 61 6b 20 62 61 63 6b 77 61 72  ** break backwar
18660 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
18670 20 2d 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62   - it needs to b
18680 65 20 61 20 77 61 72 6e 69 6e 67 2e 0a 20 20 2a  e a warning..  *
18690 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69  /.  for(i=0, pLi
186a0 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b  stItem=pList->a;
186b0 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
186c0 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b   i++, pListItem+
186d0 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
186e0 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70  ar *zColName = p
186f0 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b  ListItem->zName;
18700 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65 73 74  .    int request
18710 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  edSortOrder;.   
18720 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20   char *zColl;   
18730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18740 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  /* Collation seq
18750 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20  uence name */.. 
18760 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62     for(j=0, pTab
18770 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20  Col=pTab->aCol; 
18780 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
18790 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20  +, pTabCol++){. 
187a0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
187b0 53 74 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65  StrICmp(zColName
187c0 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65  , pTabCol->zName
187d0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
187e0 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70    }.    if( j>=p
187f0 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
18800 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
18810 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
18820 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75  e %s has no colu
18830 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20  mn named %s",.  
18840 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
18850 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  e, zColName);.  
18860 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
18870 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
18880 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18890 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
188a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
188b0 62 2d 3e 6e 43 6f 6c 3c 3d 30 78 37 66 66 66 20  b->nCol<=0x7fff 
188c0 26 26 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a  && j<=0x7fff );.
188d0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
188e0 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a  lumn[i] = (i16)j
188f0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49  ;.    if( pListI
18900 74 65 6d 2d 3e 70 45 78 70 72 20 29 7b 0a 20 20  tem->pExpr ){.  
18910 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20      int nColl;. 
18920 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69       assert( pLi
18930 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f  stItem->pExpr->o
18940 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p==TK_COLLATE );
18950 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
18960 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
18970 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
18980 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   nColl = sqlite3
18990 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20  Strlen30(zColl) 
189a0 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  + 1;.      asser
189b0 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c  t( nExtra>=nColl
189c0 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
189d0 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20  (zExtra, zColl, 
189e0 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43  nColl);.      zC
189f0 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20  oll = zExtra;.  
18a00 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43      zExtra += nC
18a10 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  oll;.      nExtr
18a20 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20  a -= nColl;.    
18a30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f  }else{.      zCo
18a40 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ll = pTab->aCol[
18a50 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].zColl;.      
18a60 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f  if( !zColl ) zCo
18a70 6c 6c 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20  ll = "BINARY";. 
18a80 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62     }.    if( !db
18a90 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21  ->init.busy && !
18aa0 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
18ab0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
18ac0 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ll) ){.      got
18ad0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18ae0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
18af0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
18b00 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65   = zColl;.    re
18b10 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
18b20 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f   = pListItem->so
18b30 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72  rtOrder & sortOr
18b40 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e  derMask;.    pIn
18b50 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
18b60 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73 74  i] = (u8)request
18b70 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  edSortOrder;.   
18b80 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b   if( pTab->aCol[
18b90 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 20  j].notNull==0 ) 
18ba0 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e  pIndex->uniqNotN
18bb0 75 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ull = 0;.  }.  i
18bc0 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 66 6f  f( pPk ){.    fo
18bd0 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b  r(j=0; j<pPk->nK
18be0 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  eyCol; j++){.   
18bf0 20 20 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d 3e     int x = pPk->
18c00 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
18c10 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e     if( hasColumn
18c20 28 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  (pIndex->aiColum
18c30 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  n, pIndex->nKeyC
18c40 6f 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20 20 20  ol, x) ){.      
18c50 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d    pIndex->nColum
18c60 6e 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73  n--; .      }els
18c70 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  e{.        pInde
18c80 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
18c90 20 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   x;.        pInd
18ca0 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20  ex->azColl[i] = 
18cb0 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a  pPk->azColl[j];.
18cc0 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
18cd0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
18ce0 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  pPk->aSortOrder[
18cf0 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b  j];.        i++;
18d00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18d10 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49     assert( i==pI
18d20 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  ndex->nColumn );
18d30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
18d40 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
18d50 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70 49 6e 64  ] = -1;.    pInd
18d60 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20  ex->azColl[i] = 
18d70 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 20 20  "BINARY";.  }.  
18d80 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f  sqlite3DefaultRo
18d90 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 20 20  wEst(pIndex);.  
18da0 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  if( pParse->pNew
18db0 54 61 62 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d  Table==0 ) estim
18dc0 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49  ateIndexWidth(pI
18dd0 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54  ndex);..  if( pT
18de0 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
18df0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Table ){.    /* 
18e00 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
18e10 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
18e20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61  create an automa
18e30 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20  tic index as a. 
18e40 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20     ** result of 
18e50 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
18e60 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f   UNIQUE clause o
18e70 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  n a column defin
18e80 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a  ition, or.    **
18e90 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
18ea0 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
18eb0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f  following the co
18ec0 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73  lumn definitions
18ed0 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e  ..    ** i.e. on
18ee0 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e of:.    **.   
18ef0 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
18f00 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59   t(x PRIMARY KEY
18f10 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45  , y);.    ** CRE
18f20 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79  ATE TABLE t(x, y
18f30 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b  , UNIQUE(x, y));
18f40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
18f50 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b  ither way, check
18f60 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74   to see if the t
18f70 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
18f80 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20   such an index. 
18f90 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f  If.    ** so, do
18fa0 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74  n't bother creat
18fb0 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68  ing this one. Th
18fc0 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20  is only applies 
18fd0 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61  to.    ** automa
18fe0 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20  tically created 
18ff0 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63  indices. Users c
19000 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69  an do as they wi
19010 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65  sh with.    ** e
19020 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e  xplicit indices.
19030 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
19040 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49  wo UNIQUE or PRI
19050 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
19060 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65  ints are conside
19070 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20  red equivalent. 
19080 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20     ** (and thus 
19090 73 75 70 70 72 65 73 73 69 6e 67 20 74 68 65 20  suppressing the 
190a0 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e  second one) even
190b0 20 69 66 20 74 68 65 79 20 68 61 76 65 20 64 69   if they have di
190c0 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73  fferent.    ** s
190d0 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20  ort orders..    
190e0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
190f0 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  re are different
19100 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
19110 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65 20 63  nces or if the c
19120 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a  olumns of.    **
19130 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
19140 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65 72 65  occur in differe
19150 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20  nt orders, then 
19160 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  the constraints 
19170 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69  are.    ** consi
19180 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20 61  dered distinct a
19190 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69  nd both result i
191a0 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63  n separate indic
191b0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49  es..    */.    I
191c0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
191d0 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
191e0 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
191f0 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
19200 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
19210 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
19220 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
19230 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
19240 74 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64  t( pIdx->autoInd
19250 65 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ex );.      asse
19260 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  rt( pIndex->onEr
19270 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
19280 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
19290 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78  >nKeyCol!=pIndex
192a0 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74  ->nKeyCol ) cont
192b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
192c0 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65  k=0; k<pIdx->nKe
192d0 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  yCol; k++){.    
192e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
192f0 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  z1;.        cons
19300 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20  t char *z2;.    
19310 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
19320 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65  Column[k]!=pInde
19330 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29  x->aiColumn[k] )
19340 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
19350 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  z1 = pIdx->azCol
19360 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32  l[k];.        z2
19370 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
19380 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[k];.        if
19390 28 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69  ( z1!=z2 && sqli
193a0 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
193b0 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  2) ) break;.    
193c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d    }.      if( k=
193d0 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pIdx->nKeyCol )
193e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
193f0 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e  dx->onError!=pIn
19400 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a  dex->onError ){.
19410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
19420 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65  s constraint cre
19430 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e  ates the same in
19440 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75  dex as a previou
19450 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
19460 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66  onstraint specif
19470 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e  ied somewhere in
19480 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
19490 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  E statement..   
194a0 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
194b0 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43  r the ON CONFLIC
194c0 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69  T clauses are di
194d0 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68  fferent. If both
194e0 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
194f0 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61   ** constraint a
19500 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
19510 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74  equivalent const
19520 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69  raint have expli
19530 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  cit.          **
19540 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
19550 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20  uses this is an 
19560 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
19570 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  , use the.      
19580 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c      ** explicitl
19590 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61  y specified beha
195a0 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  vior for the ind
195b0 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ex..          */
195c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
195d0 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  (pIdx->onError==
195e0 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49  OE_Default || pI
195f0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
19600 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20  E_Default) ){.  
19610 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19620 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
19630 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
19640 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20     "conflicting 
19650 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
19660 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20  ses specified", 
19670 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
19680 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
19690 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
196a0 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
196b0 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45         pIdx->onE
196c0 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  rror = pIndex->o
196d0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  nError;.        
196e0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
196f0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
19700 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
19710 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19720 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e  .  /* Link the n
19730 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  ew Index structu
19740 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20  re to its table 
19750 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72  and to the other
19760 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  .  ** in-memory 
19770 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
19780 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  res. .  */.  if(
19790 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
197a0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  {.    Index *p;.
197b0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
197c0 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
197d0 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78  ld(db, 0, pIndex
197e0 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
197f0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
19800 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d  hInsert(&pIndex-
19810 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
19820 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  h, .            
19830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
19840 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 71 6c  ndex->zName, sql
19850 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 49 6e  ite3Strlen30(pIn
19860 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20  dex->zName),.   
19870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19880 20 20 20 20 20 20 20 70 49 6e 64 65 78 29 3b 0a         pIndex);.
19890 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
198a0 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49     assert( p==pI
198b0 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  ndex );  /* Mall
198c0 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
198d0 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d  led */.      db-
198e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
198f0 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  1;.      goto ex
19900 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19910 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66  .    }.    db->f
19920 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
19930 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
19940 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
19950 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  0 ){.      pInde
19960 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  x->tnum = db->in
19970 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20  it.newTnum;.    
19980 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
19990 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69  his is the initi
199a0 61 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  al CREATE INDEX 
199b0 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52  statement (or CR
199c0 45 41 54 45 20 54 41 42 4c 45 20 69 66 20 74 68  EATE TABLE if th
199d0 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20  e.  ** index is 
199e0 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78  an implied index
199f0 20 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72   for a UNIQUE or
19a00 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
19a10 73 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20  straint) then.  
19a20 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f 20  ** emit code to 
19a30 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  allocate the ind
19a40 65 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64  ex rootpage on d
19a50 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20  isk and make an 
19a60 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 74  entry for.  ** t
19a70 68 65 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20  he index in the 
19a80 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
19a90 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ble and populate
19aa0 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 0a   the index with.
19ab0 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 42    ** content.  B
19ac0 75 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  ut, do not do th
19ad0 69 73 20 69 66 20 77 65 20 61 72 65 20 73 69 6d  is if we are sim
19ae0 70 6c 79 20 72 65 61 64 69 6e 67 20 74 68 65 20  ply reading the 
19af0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
19b00 2a 2a 20 74 61 62 6c 65 20 74 6f 20 70 61 72 73  ** table to pars
19b10 65 20 74 68 65 20 73 63 68 65 6d 61 2c 20 6f 72  e the schema, or
19b20 20 69 66 20 74 68 69 73 20 69 6e 64 65 78 20 69   if this index i
19b30 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
19b40 59 20 69 6e 64 65 78 0a 20 20 2a 2a 20 6f 66 20  Y index.  ** of 
19b50 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
19b60 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  table..  **.  **
19b70 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   If pTblName==0 
19b80 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e  it means this in
19b90 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64  dex is generated
19ba0 20 61 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50   as an implied P
19bb0 52 49 4d 41 52 59 20 4b 45 59 0a 20 20 2a 2a 20  RIMARY KEY.  ** 
19bc0 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20  or UNIQUE index 
19bd0 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
19be0 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69  E statement.  Si
19bf0 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  nce the table.  
19c00 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
19c10 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e   created, it con
19c20 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e  tains no data an
19c30 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74  d the index init
19c40 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
19c50 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70  step can be skip
19c60 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ped..  */.  else
19c70 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
19c80 72 3d 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69  r==0 && (HasRowi
19c90 64 28 70 54 61 62 29 20 7c 7c 20 70 54 62 6c 4e  d(pTab) || pTblN
19ca0 61 6d 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 56  ame!=0) ){.    V
19cb0 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
19cc0 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74   *zStmt;.    int
19cd0 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
19ce0 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d  ->nMem;..    v =
19cf0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
19d00 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
19d10 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69   v==0 ) goto exi
19d20 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19d30 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
19d40 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
19d50 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a   the index.    *
19d60 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  /.    sqlite3Beg
19d70 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
19d80 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
19d90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
19da0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72  eAddOp2(v, OP_Cr
19db0 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20  eateIndex, iDb, 
19dc0 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  iMem);..    /* G
19dd0 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65  ather the comple
19de0 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
19df0 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
19e00 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a  ement into.    *
19e10 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69  * the zStmt vari
19e20 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  able.    */.    
19e30 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
19e40 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74      int n = (int
19e50 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54  )(pParse->sLastT
19e60 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e  oken.z - pName->
19e70 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61  z) + pParse->sLa
19e80 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20  stToken.n;.     
19e90 20 69 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d   if( pName->z[n-
19ea0 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20  1]==';' ) n--;. 
19eb0 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20       /* A named 
19ec0 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78  index with an ex
19ed0 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e  plicit CREATE IN
19ee0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  DEX statement */
19ef0 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73  .      zStmt = s
19f00 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
19f10 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e 44 45  , "CREATE%s INDE
19f20 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20  X %.*s",.       
19f30 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e   onError==OE_Non
19f40 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55  e ? "" : " UNIQU
19f50 45 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29  E", n, pName->z)
19f60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19f70 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74     /* An automat
19f80 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64  ic index created
19f90 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45   by a PRIMARY KE
19fa0 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  Y or UNIQUE cons
19fb0 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20  traint */.      
19fc0 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  /* zStmt = sqlit
19fd0 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a  e3MPrintf(""); *
19fe0 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  /.      zStmt = 
19ff0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
1a000 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e   Add an entry in
1a010 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66   sqlite_master f
1a020 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20  or this index.  
1a030 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
1a040 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
1a050 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e  se, .        "IN
1a060 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20  SERT INTO %Q.%s 
1a070 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25  VALUES('index',%
1a080 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a  Q,%Q,#%d,%Q);",.
1a090 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b          db->aDb[
1a0a0 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
1a0b0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
1a0c0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
1a0d0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54  Name,.        pT
1a0e0 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
1a0f0 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20     iMem,.       
1a100 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20   zStmt.    );.  
1a110 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1a120 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20  db, zStmt);..   
1a130 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64   /* Fill the ind
1a140 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64  ex with data and
1a150 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68   reparse the sch
1a160 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f  ema. Code an OP_
1a170 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f  Expire.    ** to
1a180 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
1a190 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61  pre-compiled sta
1a1a0 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a  tements..    */.
1a1b0 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
1a1c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1a1d0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
1a1e0 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65  rse, pIndex, iMe
1a1f0 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
1a200 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
1a210 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
1a220 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a230 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c  ParseSchemaOp(v,
1a240 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 73   iDb,.         s
1a250 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
1a260 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44  , "name='%q' AND
1a270 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20   type='index'", 
1a280 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b  pIndex->zName));
1a290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1a2a0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45  beAddOp1(v, OP_E
1a2b0 78 70 69 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d  xpire, 0);.    }
1a2c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  .  }..  /* When 
1a2d0 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20  adding an index 
1a2e0 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69  to the list of i
1a2f0 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62  ndices for a tab
1a300 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75  le, make.  ** su
1a310 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c  re all indices l
1a320 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63  abeled OE_Replac
1a330 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c  e come after all
1a340 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20   those labeled. 
1a350 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20   ** OE_Ignore.  
1a360 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
1a370 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63  y for the correc
1a380 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65  t constraint che
1a390 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69  ck.  ** processi
1a3a0 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65  ng (in sqlite3Ge
1a3b0 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74  nerateConstraint
1a3c0 43 68 65 63 6b 73 28 29 29 20 61 73 20 70 61 72  Checks()) as par
1a3d0 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45  t of.  ** UPDATE
1a3e0 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74   and INSERT stat
1a3f0 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20  ements.  .  */. 
1a400 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
1a410 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d  sy || pTblName==
1a420 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45  0 ){.    if( onE
1a430 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
1a440 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
1a450 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
1a460 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e  pTab->pIndex->on
1a470 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
1a480 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  e){.      pIndex
1a490 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e  ->pNext = pTab->
1a4a0 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54  pIndex;.      pT
1a4b0 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
1a4c0 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dex;.    }else{.
1a4d0 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74        Index *pOt
1a4e0 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  her = pTab->pInd
1a4f0 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ex;.      while(
1a500 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26   pOther->pNext &
1a510 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d  & pOther->pNext-
1a520 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70  >onError!=OE_Rep
1a530 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lace ){.        
1a540 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d  pOther = pOther-
1a550 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
1a560 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
1a570 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  ext = pOther->pN
1a580 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65  ext;.      pOthe
1a590 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  r->pNext = pInde
1a5a0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65  x;.    }.    pRe
1a5b0 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  t = pIndex;.    
1a5c0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
1a5d0 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
1a5e0 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
1a5f0 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
1a600 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  ex:.  if( pIndex
1a610 20 29 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c   ) freeIndex(db,
1a620 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69   pIndex);.  sqli
1a630 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1a640 2c 20 70 50 49 57 68 65 72 65 29 3b 0a 20 20 73  , pPIWhere);.  s
1a650 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
1a660 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
1a670 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
1a680 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c  tDelete(db, pTbl
1a690 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
1a6a0 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
1a6b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
1a6c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20  ;.}../*.** Fill 
1a6d0 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45  the Index.aiRowE
1a6e0 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20  st[] array with 
1a6f0 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74  default informat
1a700 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f  ion - informatio
1a710 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20  n.** to be used 
1a720 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74  when we have not
1a730 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45   run the ANALYZE
1a740 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
1a750 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73  aiRowEst[0] is s
1a760 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69  uppose to contai
1a770 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1a780 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
1a790 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20  index..** Since 
1a7a0 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20  we do not know, 
1a7b0 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e  guess 1 million.
1a7c0 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73    aiRowEst[1] is
1a7d0 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
1a7e0 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
1a7f0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1a800 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e  le that match an
1a810 79 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c  y particular val
1a820 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72  ue of the.** fir
1a830 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
1a840 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73   index.  aiRowEs
1a850 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[2] is an estim
1a860 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
1a870 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61  r.** of rows tha
1a880 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
1a890 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74  icular combiniat
1a8a0 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74  ion of the first
1a8b0 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66   2 columns.** of
1a8c0 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64   the index.  And
1a8d0 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d   so forth.  It m
1a8e0 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 74 68  ust always be th
1a8f0 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a  e case that.*.**
1a900 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77             aiRow
1a910 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74  Est[N]<=aiRowEst
1a920 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20  [N-1].**        
1a930 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d     aiRowEst[N]>=
1a940 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72  1.**.** Apart fr
1a950 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76 65  om that, we have
1a960 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e   little to go on
1a970 20 62 65 73 69 64 65 73 20 69 6e 74 75 69 74 69   besides intuiti
1a980 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20  on as to.** how 
1a990 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c  aiRowEst[] shoul
1a9a0 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  d be initialized
1a9b0 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67  .  The numbers g
1a9c0 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a  enerated here.**
1a9d0 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79   are based on ty
1a9e0 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75  pical values fou
1a9f0 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64  nd in actual ind
1aa00 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ices..*/.void sq
1aa10 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45  lite3DefaultRowE
1aa20 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  st(Index *pIdx){
1aa30 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 20 3d 20  .  tRowcnt *a = 
1aa40 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a  pIdx->aiRowEst;.
1aa50 20 20 69 6e 74 20 69 3b 0a 20 20 74 52 6f 77 63    int i;.  tRowc
1aa60 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  nt n;.  assert( 
1aa70 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d  a!=0 );.  a[0] =
1aa80 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e   pIdx->pTable->n
1aa90 52 6f 77 45 73 74 3b 0a 20 20 69 66 28 20 61 5b  RowEst;.  if( a[
1aaa0 30 5d 3c 31 30 20 29 20 61 5b 30 5d 20 3d 20 31  0]<10 ) a[0] = 1
1aab0 30 3b 0a 20 20 6e 20 3d 20 31 30 3b 0a 20 20 66  0;.  n = 10;.  f
1aac0 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 49 64 78 2d  or(i=1; i<=pIdx-
1aad0 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nKeyCol; i++){.
1aae0 20 20 20 20 61 5b 69 5d 20 3d 20 6e 3b 0a 20 20      a[i] = n;.  
1aaf0 20 20 69 66 28 20 6e 3e 35 20 29 20 6e 2d 2d 3b    if( n>5 ) n--;
1ab00 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d  .  }.  if( pIdx-
1ab10 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
1ab20 65 20 29 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d  e ){.    a[pIdx-
1ab30 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20 31 3b 0a 20  >nKeyCol] = 1;. 
1ab40 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
1ab50 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72   routine will dr
1ab60 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e  op an existing n
1ab70 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69  amed index.  Thi
1ab80 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70  s routine.** imp
1ab90 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50  lements the DROP
1aba0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
1abb0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1abc0 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65  3DropIndex(Parse
1abd0 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
1abe0 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66  t *pName, int if
1abf0 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78  Exists){.  Index
1ac00 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65   *pIndex;.  Vdbe
1ac10 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
1ac20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1ac30 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61  .  int iDb;..  a
1ac40 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1ac50 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e  Err==0 );   /* N
1ac60 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68  ever called with
1ac70 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f   prior errors */
1ac80 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1ac90 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
1aca0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1acb0 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  dex;.  }.  asser
1acc0 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
1acd0 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  1 );.  if( SQLIT
1ace0 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
1acf0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
1ad00 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
1ad10 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
1ad20 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
1ad30 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
1ad40 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
1ad50 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
1ad60 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
1ad70 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
1ad80 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73     if( !ifExists
1ad90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ada0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1adb0 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
1adc0 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29  : %S", pName, 0)
1add0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ade0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
1adf0 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
1ae00 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61  pParse, pName->a
1ae10 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
1ae20 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
1ae30 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
1ae40 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  1;.    goto exit
1ae50 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
1ae60 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61  .  if( pIndex->a
1ae70 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  utoIndex ){.    
1ae80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1ae90 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61  pParse, "index a
1aea0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55  ssociated with U
1aeb0 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f  NIQUE ".      "o
1aec0 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  r PRIMARY KEY co
1aed0 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20  nstraint cannot 
1aee0 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b  be dropped", 0);
1aef0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1af00 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1af10 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
1af20 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
1af30 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
1af40 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1af50 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
1af60 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
1af70 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
1af80 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61  OP_INDEX;.    Ta
1af90 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64  ble *pTab = pInd
1afa0 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20  ex->pTable;.    
1afb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
1afc0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
1afd0 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
1afe0 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
1aff0 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a  EMA_TABLE(iDb);.
1b000 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
1b010 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1b020 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
1b030 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b  zTab, 0, zDb) ){
1b040 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1b050 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
1b060 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54   }.    if( !OMIT
1b070 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29  _TEMPDB && iDb )
1b080 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
1b090 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ROP_TEMP_INDEX;.
1b0a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
1b0b0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1b0c0 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a   code, pIndex->z
1b0d0 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
1b0e0 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
1b0f0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1b100 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
1b110 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65  .#endif..  /* Ge
1b120 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72  nerate code to r
1b130 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
1b140 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  and from the mas
1b150 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76  ter table */.  v
1b160 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1b170 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1b180 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
1b190 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
1b1a0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
1b1b0 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
1b1c0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
1b1d0 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c  rse,.       "DEL
1b1e0 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
1b1f0 48 45 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44  HERE name=%Q AND
1b200 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a   type='index'",.
1b210 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
1b220 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
1b230 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 49  A_TABLE(iDb), pI
1b240 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  ndex->zName.    
1b250 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c  );.    sqlite3Cl
1b260 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50  earStatTables(pP
1b270 61 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78 22  arse, iDb, "idx"
1b280 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29  , pIndex->zName)
1b290 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  ;.    sqlite3Cha
1b2a0 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
1b2b0 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74  , iDb);.    dest
1b2c0 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
1b2d0 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  se, pIndex->tnum
1b2e0 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
1b2f0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1b300 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69   OP_DropIndex, i
1b310 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78  Db, 0, 0, pIndex
1b320 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ->zName, 0);.  }
1b330 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  ..exit_drop_inde
1b340 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  x:.  sqlite3SrcL
1b350 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e  istDelete(db, pN
1b360 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ame);.}../*.** p
1b370 41 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74  Array is a point
1b380 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f  er to an array o
1b390 66 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68 20  f objects. Each 
1b3a0 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a  object in the.**
1b3b0 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72   array is szEntr
1b3c0 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  y bytes in size.
1b3d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73   This routine us
1b3e0 65 73 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c  es sqlite3DbReal
1b3f0 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65  loc().** to exte
1b400 6e 64 20 74 68 65 20 61 72 72 61 79 20 73 6f 20  nd the array so 
1b410 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 70  that there is sp
1b420 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f 62  ace for a new ob
1b430 6a 65 63 74 20 61 74 20 74 68 65 20 65 6e 64 2e  ject at the end.
1b440 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
1b450 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1b460 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f  led, *pnEntry co
1b470 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72 72 65  ntains the curre
1b480 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68  nt size of.** th
1b490 65 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74 72  e array (in entr
1b4a0 69 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c  ies - so the all
1b4b0 6f 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e  ocation is ((*pn
1b4c0 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72 79  Entry) * szEntry
1b4d0 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f  ) bytes.** in to
1b4e0 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tal)..**.** If t
1b4f0 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73 20  he realloc() is 
1b500 73 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65 2e  successful (i.e.
1b510 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69   if no OOM condi
1b520 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74 68  tion occurs), th
1b530 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63  e.** space alloc
1b540 61 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77  ated for the new
1b550 20 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f 65   object is zeroe
1b560 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64 61  d, *pnEntry upda
1b570 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63  ted to.** reflec
1b580 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f  t the new size o
1b590 66 20 74 68 65 20 61 72 72 61 79 20 61 6e 64 20  f the array and 
1b5a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1b5b0 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a   new allocation.
1b5c0 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70 49  ** returned. *pI
1b5d0 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
1b5e0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65   index of the ne
1b5f0 77 20 61 72 72 61 79 20 65 6e 74 72 79 20 69 6e  w array entry in
1b600 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
1b610 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
1b620 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66 61  the realloc() fa
1b630 69 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73 65  ils, *pIdx is se
1b640 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72  t to -1, *pnEntr
1b650 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63  y remains.** unc
1b660 68 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f 70  hanged and a cop
1b670 79 20 6f 66 20 70 41 72 72 61 79 20 72 65 74 75  y of pArray retu
1b680 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  rned..*/.void *s
1b690 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
1b6a0 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ate(.  sqlite3 *
1b6b0 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  db,      /* Conn
1b6c0 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79  ection to notify
1b6d0 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   of malloc failu
1b6e0 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  res */.  void *p
1b6f0 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72  Array,     /* Ar
1b700 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
1b710 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f   Might be reallo
1b720 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  cated */.  int s
1b730 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20  zEntry,      /* 
1b740 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a  Size of each obj
1b750 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79  ect in the array
1b760 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74   */.  int *pnEnt
1b770 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ry,     /* Numbe
1b780 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72  r of objects cur
1b790 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f  rently in use */
1b7a0 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20  .  int *pIdx    
1b7b0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
1b7c0 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77  e index of a new
1b7d0 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b   slot here */.){
1b7e0 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e  .  char *z;.  in
1b7f0 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a  t n = *pnEntry;.
1b800 20 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31 29    if( (n & (n-1)
1b810 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )==0 ){.    int 
1b820 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20  sz = (n==0) ? 1 
1b830 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20  : 2*n;.    void 
1b840 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44  *pNew = sqlite3D
1b850 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72  bRealloc(db, pAr
1b860 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29  ray, sz*szEntry)
1b870 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d  ;.    if( pNew==
1b880 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78  0 ){.      *pIdx
1b890 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
1b8a0 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20  urn pArray;.    
1b8b0 7d 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20 70  }.    pArray = p
1b8c0 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28  New;.  }.  z = (
1b8d0 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20  char*)pArray;.  
1b8e0 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a  memset(&z[n * sz
1b8f0 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74  Entry], 0, szEnt
1b900 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 6e  ry);.  *pIdx = n
1b910 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a  ;.  ++*pnEntry;.
1b920 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b    return pArray;
1b930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
1b940 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
1b950 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69  o the given IdLi
1b960 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
1b970 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e  w IdList if.** n
1b980 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  eed be..**.** A 
1b990 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65  new IdList is re
1b9a0 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
1b9b0 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
1b9c0 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71  s..*/.IdList *sq
1b9d0 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
1b9e0 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  d(sqlite3 *db, I
1b9f0 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  dList *pList, To
1ba00 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
1ba10 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1ba20 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
1ba30 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
1ba40 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
1ba50 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
1ba60 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
1ba70 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1ba80 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c    pList->a = sql
1ba90 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74  ite3ArrayAllocat
1baa0 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20  e(.      db,.   
1bab0 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20     pList->a,.   
1bac0 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d     sizeof(pList-
1bad0 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26 70  >a[0]),.      &p
1bae0 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20  List->nId,.     
1baf0 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69   &i.  );.  if( i
1bb00 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
1bb10 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
1bb20 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65  , pList);.    re
1bb30 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
1bb40 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  ist->a[i].zName 
1bb50 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1bb60 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65  mToken(db, pToke
1bb70 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69  n);.  return pLi
1bb80 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  st;.}../*.** Del
1bb90 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a  ete an IdList..*
1bba0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64  /.void sqlite3Id
1bbb0 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74  ListDelete(sqlit
1bbc0 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a  e3 *db, IdList *
1bbd0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1bbe0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1bbf0 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
1bc00 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
1bc10 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  d; i++){.    sql
1bc20 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1bc30 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1bc40 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1bc50 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
1bc60 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->a);.  sqlite3D
1bc70 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29  bFree(db, pList)
1bc80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1bc90 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70  n the index in p
1bca0 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e  List of the iden
1bcb0 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64  tifier named zId
1bcc0 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20  .  Return -1.** 
1bcd0 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f  if not found..*/
1bce0 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69  .int sqlite3IdLi
1bcf0 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a  stIndex(IdList *
1bd00 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61  pList, const cha
1bd10 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
1bd20 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1bd30 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  =0 ) return -1;.
1bd40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1bd50 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
1bd60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1bd70 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69  rICmp(pList->a[i
1bd80 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d  ].zName, zName)=
1bd90 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  =0 ) return i;. 
1bda0 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
1bdb0 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20  }../*.** Expand 
1bdc0 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61  the space alloca
1bdd0 74 65 64 20 66 6f 72 20 74 68 65 20 67 69 76 65  ted for the give
1bde0 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74  n SrcList object
1bdf0 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20   by.** creating 
1be00 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73  nExtra new slots
1be10 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53   beginning at iS
1be20 74 61 72 74 2e 20 20 69 53 74 61 72 74 20 69 73  tart.  iStart is
1be30 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20   zero based..** 
1be40 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65  New slots are ze
1be50 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  roed..**.** For 
1be60 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65  example, suppose
1be70 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69   a SrcList initi
1be80 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77  ally contains tw
1be90 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a  o entries: A,B..
1bea0 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e  ** To append 3 n
1beb0 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20  ew entries onto 
1bec0 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73  the end, do this
1bed0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74  :.**.**    sqlit
1bee0 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65  e3SrcListEnlarge
1bef0 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33  (db, pSrclist, 3
1bf00 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65  , 2);.**.** Afte
1bf10 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65  r the call above
1bf20 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69   it would contai
1bf30 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e  n:  A, B, nil, n
1bf40 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74  il, nil..** If t
1bf50 68 65 20 69 53 74 61 72 74 20 61 72 67 75 6d 65  he iStart argume
1bf60 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e  nt had been 1 in
1bf70 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e  stead of 2, then
1bf80 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77   the result.** w
1bf90 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20  ould have been: 
1bfa0 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69   A, nil, nil, ni
1bfb0 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e  l, B.  To prepen
1bfc0 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c  d the new slots,
1bfd0 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20 76  .** the iStart v
1bfe0 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e  alue would be 0.
1bff0 20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68 65    The result the
1c000 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e  n would.** be: n
1c010 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c  il, nil, nil, A,
1c020 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d   B..**.** If a m
1c030 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1c040 20 66 61 69 6c 73 20 74 68 65 20 53 72 63 4c 69   fails the SrcLi
1c050 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e  st is unchanged.
1c060 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c    The.** db->mal
1c070 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 77  locFailed flag w
1c080 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 72  ill be set to tr
1c090 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  ue..*/.SrcList *
1c0a0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
1c0b0 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74 65 33  large(.  sqlite3
1c0c0 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 44   *db,       /* D
1c0d0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1c0e0 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
1c0f0 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  OOM errors */.  
1c100 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
1c110 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73     /* The SrcLis
1c120 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64  t to be enlarged
1c130 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
1c140 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  ,        /* Numb
1c150 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20  er of new slots 
1c160 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e  to add to pSrc->
1c170 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74  a[] */.  int iSt
1c180 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49  art         /* I
1c190 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b  ndex in pSrc->a[
1c1a0 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73  ] of first new s
1c1b0 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lot */.){.  int 
1c1c0 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20  i;..  /* Sanity 
1c1d0 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c  checking on call
1c1e0 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ing parameters *
1c1f0 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  /.  assert( iSta
1c200 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  rt>=0 );.  asser
1c210 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a  t( nExtra>=1 );.
1c220 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d    assert( pSrc!=
1c230 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1c240 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72  Start<=pSrc->nSr
1c250 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  c );..  /* Alloc
1c260 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ate additional s
1c270 70 61 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a  pace if needed *
1c280 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53  /.  if( pSrc->nS
1c290 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e  rc+nExtra>pSrc->
1c2a0 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72  nAlloc ){.    Sr
1c2b0 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20  cList *pNew;.   
1c2c0 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53   int nAlloc = pS
1c2d0 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b  rc->nSrc+nExtra;
1c2e0 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20  .    int nGot;. 
1c2f0 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
1c300 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
1c310 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Src,.           
1c320 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63      sizeof(*pSrc
1c330 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73  ) + (nAlloc-1)*s
1c340 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d  izeof(pSrc->a[0]
1c350 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ) );.    if( pNe
1c360 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  w==0 ){.      as
1c370 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
1c380 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
1c390 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20  return pSrc;.   
1c3a0 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e   }.    pSrc = pN
1c3b0 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28  ew;.    nGot = (
1c3c0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
1c3d0 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20  ize(db, pNew) - 
1c3e0 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73  sizeof(*pSrc))/s
1c3f0 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d  izeof(pSrc->a[0]
1c400 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e  )+1;.    pSrc->n
1c410 41 6c 6c 6f 63 20 3d 20 28 75 38 29 6e 47 6f 74  Alloc = (u8)nGot
1c420 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65  ;.  }..  /* Move
1c430 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20   existing slots 
1c440 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20  that come after 
1c450 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74  the newly insert
1c460 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75  ed slots.  ** ou
1c470 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a  t of the way */.
1c480 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
1c490 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b  rc-1; i>=iStart;
1c4a0 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d   i--){.    pSrc-
1c4b0 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70  >a[i+nExtra] = p
1c4c0 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20  Src->a[i];.  }. 
1c4d0 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 28   pSrc->nSrc += (
1c4e0 69 38 29 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a  i8)nExtra;..  /*
1c4f0 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20   Zero the newly 
1c500 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20  allocated slots 
1c510 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72  */.  memset(&pSr
1c520 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  c->a[iStart], 0,
1c530 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b   sizeof(pSrc->a[
1c540 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66  0])*nExtra);.  f
1c550 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69  or(i=iStart; i<i
1c560 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b  Start+nExtra; i+
1c570 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  +){.    pSrc->a[
1c580 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  i].iCursor = -1;
1c590 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72  .  }..  /* Retur
1c5a0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1c5b0 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c  he enlarged SrcL
1c5c0 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ist */.  return 
1c5d0 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pSrc;.}.../*.** 
1c5e0 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62  Append a new tab
1c5f0 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67  le name to the g
1c600 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43  iven SrcList.  C
1c610 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c  reate a new SrcL
1c620 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
1c630 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  e.  A new entry 
1c640 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  is created in th
1c650 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69  e SrcList even i
1c660 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c  f pTable is NULL
1c670 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73  ..**.** A SrcLis
1c680 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
1c690 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  r NULL if there 
1c6a0 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  is an OOM error.
1c6b0 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a    The returned.*
1c6c0 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  * SrcList might 
1c6d0 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
1c6e0 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
1c6f0 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20  was input or it 
1c700 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65  might be.** a ne
1c710 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f  w one.  If an OO
1c720 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  M error does occ
1c730 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72  urs, then the pr
1c740 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69  ior value of pLi
1c750 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e  st.** that is in
1c760 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
1c770 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63  ine is automatic
1c780 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a  ally freed..**.*
1c790 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69  * If pDatabase i
1c7a0 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d  s not null, it m
1c7b0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61  eans that the ta
1c7c0 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f  ble has an optio
1c7d0 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
1c7e0 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69  name prefix.  Li
1c7f0 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62  ke this:  "datab
1c800 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65  ase.table".  The
1c810 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f   pDatabase.** po
1c820 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c  ints to the tabl
1c830 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70  e name and the p
1c840 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  Table points to 
1c850 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1c860 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73  e..** The SrcLis
1c870 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c  t.a[].zName fiel
1c880 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  d is filled with
1c890 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
1c8a0 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63  which might.** c
1c8b0 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20  ome from pTable 
1c8c0 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73  (if pDatabase is
1c8d0 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70   NULL) or from p
1c8e0 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53  Database.  .** S
1c8f0 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61  rcList.a[].zData
1c900 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77  base is filled w
1c910 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
1c920 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   name from pTabl
1c930 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55  e,.** or with NU
1c940 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73  LL if no databas
1c950 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  e is specified..
1c960 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
1c970 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69  ords, if call li
1c980 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1c990 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1c9a0 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
1c9b0 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,0);.**.** Then
1c9c0 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61   B is a table na
1c9d0 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  me and the datab
1c9e0 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70  ase name is unsp
1c9f0 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c  ecified.  If cal
1ca00 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73  led.** like this
1ca10 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1ca20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1ca30 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a  pend(D,A,B,C);.*
1ca40 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74  *.** Then C is t
1ca50 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
1ca60 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62  d B is the datab
1ca70 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20  ase name.  If C 
1ca80 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68  is defined.** th
1ca90 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20  en so is B.  In 
1caa0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20  other words, we 
1cab0 6e 65 76 65 72 20 68 61 76 65 20 61 20 63 61 73  never have a cas
1cac0 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  e where:.**.**  
1cad0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1cae0 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
1caf0 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68  0,C);.**.** Both
1cb00 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74   pTable and pDat
1cb10 61 62 61 73 65 20 61 72 65 20 61 73 73 75 6d 65  abase are assume
1cb20 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20  d to be quoted. 
1cb30 20 54 68 65 79 20 61 72 65 20 64 65 71 75 6f 74   They are dequot
1cb40 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69  ed.** before bei
1cb50 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ng added to the 
1cb60 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c  SrcList..*/.SrcL
1cb70 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
1cb80 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c  istAppend(.  sql
1cb90 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1cba0 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74   /* Connection t
1cbb0 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c  o notify of mall
1cbc0 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20  oc failures */. 
1cbd0 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c   SrcList *pList,
1cbe0 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74       /* Append t
1cbf0 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20  o this SrcList. 
1cc00 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e  NULL creates a n
1cc10 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  ew SrcList */.  
1cc20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
1cc30 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
1cc40 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65  append */.  Toke
1cc50 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20 20  n *pDatabase    
1cc60 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20 74  /* Database of t
1cc70 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  he table */.){. 
1cc80 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1cc90 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
1cca0 73 73 65 72 74 28 20 70 44 61 74 61 62 61 73 65  ssert( pDatabase
1ccb0 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30  ==0 || pTable!=0
1ccc0 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68   );  /* Cannot h
1ccd0 61 76 65 20 43 20 77 69 74 68 6f 75 74 20 42 20  ave C without B 
1cce0 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
1ccf0 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
1cd00 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1cd10 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1cd20 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
1cd30 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1cd40 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69  eturn 0;.    pLi
1cd50 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
1cd60 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71    }.  pList = sq
1cd70 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
1cd80 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31  rge(db, pList, 1
1cd90 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a  , pList->nSrc);.
1cda0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1cdb0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
1cdc0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1cdd0 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
1cde0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1cdf0 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  .  pItem = &pLis
1ce00 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
1ce10 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61  -1];.  if( pData
1ce20 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73  base && pDatabas
1ce30 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  e->z==0 ){.    p
1ce40 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
1ce50 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  }.  if( pDatabas
1ce60 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a  e ){.    Token *
1ce70 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73  pTemp = pDatabas
1ce80 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  e;.    pDatabase
1ce90 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70   = pTable;.    p
1cea0 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20  Table = pTemp;. 
1ceb0 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   }.  pItem->zNam
1cec0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
1ced0 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61  romToken(db, pTa
1cee0 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a  ble);.  pItem->z
1cef0 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
1cf00 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1cf10 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  db, pDatabase);.
1cf20 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
1cf30 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
1cf40 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78  VdbeCursor index
1cf50 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20   numbers to all 
1cf60 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
1cf70 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
1cf80 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
1cf90 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
1cfa0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
1cfb0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1cfc0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1cfd0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1cfe0 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c   assert(pList ||
1cff0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1d000 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
1d010 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
1d020 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
1d030 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
1d040 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
1d050 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
1d060 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e   pItem->iCursor>
1d070 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1d080 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
1d090 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1d0a0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  +;.      if( pIt
1d0b0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
1d0c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1d0d0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
1d0e0 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  rs(pParse, pItem
1d0f0 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29  ->pSelect->pSrc)
1d100 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d110 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
1d120 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
1d130 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
1d140 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
1d150 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
1d160 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1d170 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
1d180 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
1d190 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1d1a0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1d1b0 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
1d1c0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1d1d0 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
1d1e0 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
1d1f0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
1d200 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
1d210 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1d220 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
1d230 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
1d240 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
1d250 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
1d260 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1d270 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1d280 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1d290 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65  db, pItem->zInde
1d2a0 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  x);.    sqlite3D
1d2b0 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
1d2c0 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
1d2d0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1d2e0 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
1d2f0 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
1d300 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1d310 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b  db, pItem->pOn);
1d320 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
1d330 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
1d340 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
1d350 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1d360 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
1d370 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1d380 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
1d390 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61 64  the parser to ad
1d3a0 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  d a new term to 
1d3b0 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20  the.** end of a 
1d3c0 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61  growing FROM cla
1d3d0 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70 61  use.  The "p" pa
1d3e0 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 70  rameter is the p
1d3f0 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52  art of.** the FR
1d400 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20 68  OM clause that h
1d410 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1d420 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70  constructed.  "p
1d430 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  " is NULL.** if 
1d440 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1d450 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52  t term of the FR
1d460 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62  OM clause.  pTab
1d470 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65  le and pDatabase
1d480 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65  .** are the name
1d490 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e   of the table an
1d4a0 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  d database named
1d4b0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1d4c0 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61  use term..** pDa
1d4d0 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69  tabase is NULL i
1d4e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  f the database n
1d4f0 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69 73  ame qualifier is
1d500 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a   missing - the.*
1d510 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49  * usual case.  I
1d520 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20 61  f the term has a
1d530 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c   alias, then pAl
1d540 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ias points to th
1d550 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e  e.** alias token
1d560 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 69  .  If the term i
1d570 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68  s a subquery, th
1d580 65 6e 20 70 53 75 62 71 75 65 72 79 20 69 73 20  en pSubquery is 
1d590 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  the.** SELECT st
1d5a0 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65  atement that the
1d5b0 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65   subquery encode
1d5c0 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20 61  s.  The pTable a
1d5d0 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20  nd.** pDatabase 
1d5e0 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e  parameters are N
1d5f0 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69  ULL for subqueri
1d600 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64  es.  The pOn and
1d610 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d   pUsing.** param
1d620 65 74 65 72 73 20 61 72 65 20 74 68 65 20 63 6f  eters are the co
1d630 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20  ntent of the ON 
1d640 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65  and USING clause
1d650 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
1d660 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68  a new SrcList wh
1d670 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74  ich encodes is t
1d680 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65  he FROM with the
1d690 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64   new.** term add
1d6a0 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  ed..*/.SrcList *
1d6b0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1d6c0 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20  pendFromTerm(.  
1d6d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
1d6e0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
1d6f0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1d700 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20  SrcList *p,     
1d710 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
1d720 65 66 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  eft part of the 
1d730 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65  FROM clause alre
1d740 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f  ady seen */.  To
1d750 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20  ken *pTable,    
1d760 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1d770 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64   the table to ad
1d780 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c  d to the FROM cl
1d790 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  ause */.  Token 
1d7a0 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20 20 20  *pDatabase,     
1d7b0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1d7c0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
1d7d0 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20  ning pTable */. 
1d7e0 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20   Token *pAlias, 
1d7f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1d800 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
1d810 6f 66 20 74 68 65 20 41 53 20 73 75 62 65 78 70  of the AS subexp
1d820 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c  ression */.  Sel
1d830 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20  ect *pSubquery, 
1d840 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65       /* A subque
1d850 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65  ry used in place
1d860 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   of a table name
1d870 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c   */.  Expr *pOn,
1d880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d890 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   The ON clause o
1d8a0 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64  f a join */.  Id
1d8b0 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20  List *pUsing    
1d8c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49        /* The USI
1d8d0 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  NG clause of a j
1d8e0 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  oin */.){.  stru
1d8f0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1d900 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65  *pItem;.  sqlite
1d910 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1d920 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20  db;.  if( !p && 
1d930 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20  (pOn || pUsing) 
1d940 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1d950 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1d960 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73  a JOIN clause is
1d970 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
1d980 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f   %s", .      (pO
1d990 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e  n ? "ON" : "USIN
1d9a0 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67  G").    );.    g
1d9b0 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f  oto append_from_
1d9c0 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d  error;.  }.  p =
1d9d0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1d9e0 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61  ppend(db, p, pTa
1d9f0 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b  ble, pDatabase);
1da00 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e  .  if( p==0 || N
1da10 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29  EVER(p->nSrc==0)
1da20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70   ){.    goto app
1da30 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a  end_from_error;.
1da40 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
1da50 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  ->a[p->nSrc-1];.
1da60 20 20 61 73 73 65 72 74 28 20 70 41 6c 69 61 73    assert( pAlias
1da70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c  !=0 );.  if( pAl
1da80 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49  ias->n ){.    pI
1da90 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
1daa0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1dab0 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a  en(db, pAlias);.
1dac0 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65    }.  pItem->pSe
1dad0 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72 79  lect = pSubquery
1dae0 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d  ;.  pItem->pOn =
1daf0 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70   pOn;.  pItem->p
1db00 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a  Using = pUsing;.
1db10 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70    return p;.. ap
1db20 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a  pend_from_error:
1db30 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
1db40 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1db50 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b  Delete(db, pOn);
1db60 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  .  sqlite3IdList
1db70 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e  Delete(db, pUsin
1db80 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  g);.  sqlite3Sel
1db90 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
1dba0 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75  ubquery);.  retu
1dbb0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
1dbc0 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  dd an INDEXED BY
1dbd0 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   or NOT INDEXED 
1dbe0 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f  clause to the mo
1dbf0 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
1dc00 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66  d .** element of
1dc10 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74   the source-list
1dc20 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
1dc30 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
1dc40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1dc50 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28  rcListIndexedBy(
1dc60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1dc70 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e  rcList *p, Token
1dc80 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20   *pIndexedBy){. 
1dc90 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 65   assert( pIndexe
1dca0 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  dBy!=0 );.  if( 
1dcb0 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e  p && ALWAYS(p->n
1dcc0 53 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73 74  Src>0) ){.    st
1dcd0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1dce0 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61  m *pItem = &p->a
1dcf0 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20  [p->nSrc-1];.   
1dd00 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1dd10 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 26 26  notIndexed==0 &&
1dd20 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d   pItem->zIndex==
1dd30 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
1dd40 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26  dexedBy->n==1 &&
1dd50 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20   !pIndexedBy->z 
1dd60 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e  ){.      /* A "N
1dd70 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75  OT INDEXED" clau
1dd80 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e  se was supplied.
1dd90 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20   See parse.y .  
1dda0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
1ddb0 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66   "indexed_opt" f
1ddc0 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20  or details. */. 
1ddd0 20 20 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74 49       pItem->notI
1dde0 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20  ndexed = 1;.    
1ddf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74  }else{.      pIt
1de00 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c  em->zIndex = sql
1de10 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1de20 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  n(pParse->db, pI
1de30 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d  ndexedBy);.    }
1de40 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  .  }.}../*.** Wh
1de50 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61  en building up a
1de60 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20   FROM clause in 
1de70 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20  the parser, the 
1de80 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  join operator.**
1de90 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74   is initially at
1dea0 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
1deb0 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74  ft operand.  But
1dec0 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
1ded0 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74  tor.** expects t
1dee0 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
1def0 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69   to be on the ri
1df00 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68  ght operand.  Th
1df10 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68  is routine.** Sh
1df20 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70  ifts all join op
1df30 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66  erators from lef
1df40 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61  t to right for a
1df50 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a  n entire FROM.**
1df60 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45   clause..**.** E
1df70 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20  xample: Suppose 
1df80 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65  the join is like
1df90 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1dfa0 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c         A natural
1dfb0 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a   cross join B.**
1dfc0 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72  .** The operator
1dfd0 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f   is "natural cro
1dfe0 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41  ss join".  The A
1dff0 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20   and B operands 
1e000 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  are stored.** in
1e010 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e   p->a[0] and p->
1e020 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65  a[1], respective
1e030 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  ly.  The parser 
1e040 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73  initially stores
1e050 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72   the.** operator
1e060 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72   with A.  This r
1e070 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68  outine shifts th
1e080 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72  at operator over
1e090 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73   to B..*/.void s
1e0a0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69  qlite3SrcListShi
1e0b0 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69  ftJoinType(SrcLi
1e0c0 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  st *p){.  if( p 
1e0d0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1e0e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 20 7c    assert( p->a |
1e0f0 7c 20 70 2d 3e 6e 53 72 63 3d 3d 30 20 29 3b 0a  | p->nSrc==0 );.
1e100 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72      for(i=p->nSr
1e110 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  c-1; i>0; i--){.
1e120 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f        p->a[i].jo
1e130 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d  intype = p->a[i-
1e140 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  1].jointype;.   
1e150 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a   }.    p->a[0].j
1e160 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d  ointype = 0;.  }
1e170 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
1e180 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
1e190 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
1e1a0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  inTransaction(Pa
1e1b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1e1c0 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65   type){.  sqlite
1e1d0 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
1e1e0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73  ;.  int i;..  as
1e1f0 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
1e200 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  );.  db = pParse
1e210 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
1e220 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28  db!=0 );./*  if(
1e230 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
1e240 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a  =0 ) return; */.
1e250 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1e260 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1e270 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
1e280 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30  N, "BEGIN", 0, 0
1e290 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
1e2a0 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
1e2b0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1e2c0 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65  );.  if( !v ) re
1e2d0 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65  turn;.  if( type
1e2e0 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b  !=TK_DEFERRED ){
1e2f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1e300 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
1e310 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1e320 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61  AddOp2(v, OP_Tra
1e330 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79  nsaction, i, (ty
1e340 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45  pe==TK_EXCLUSIVE
1e350 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  )+1);.      sqli
1e360 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
1e370 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  (v, i);.    }.  
1e380 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
1e390 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f  ddOp2(v, OP_Auto
1e3a0 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d  Commit, 0, 0);.}
1e3b0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
1e3c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
1e3d0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
1e3e0 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
1e3f0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
1e400 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65  Vdbe *v;..  asse
1e410 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
1e420 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1e430 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  e->db!=0 );.  if
1e440 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1e450 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1e460 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
1e470 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29  COMMIT", 0, 0) )
1e480 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
1e490 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  }.  v = sqlite3G
1e4a0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1e4b0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
1e4c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1e4d0 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
1e4e0 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  t, 1, 0);.  }.}.
1e4f0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
1e500 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
1e510 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
1e520 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e  lbackTransaction
1e530 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1e540 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
1e550 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
1e560 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1e570 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  arse->db!=0 );. 
1e580 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1e590 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1e5a0 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
1e5b0 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c  , "ROLLBACK", 0,
1e5c0 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
1e5d0 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c  n;.  }.  v = sql
1e5e0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1e5f0 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
1e600 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e610 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f  ddOp2(v, OP_Auto
1e620 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20  Commit, 1, 1);. 
1e630 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
1e640 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1e650 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
1e660 72 20 77 68 65 6e 20 69 74 20 70 61 72 73 65 73  r when it parses
1e670 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72   a command to cr
1e680 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65  eate,.** release
1e690 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20   or rollback an 
1e6a0 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a  SQL savepoint. .
1e6b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1e6c0 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a  avepoint(Parse *
1e6d0 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20  pParse, int op, 
1e6e0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
1e6f0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73   char *zName = s
1e700 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1e710 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
1e720 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
1e730 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ame ){.    Vdbe 
1e740 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
1e750 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66  dbe(pParse);.#if
1e760 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e770 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
1e780 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1e790 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b  char * const az[
1e7a0 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22  ] = { "BEGIN", "
1e7b0 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42  RELEASE", "ROLLB
1e7c0 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65  ACK" };.    asse
1e7d0 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42  rt( !SAVEPOINT_B
1e7e0 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e  EGIN && SAVEPOIN
1e7f0 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20  T_RELEASE==1 && 
1e800 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1e810 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a  CK==2 );.#endif.
1e820 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71      if( !v || sq
1e830 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1e840 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41  Parse, SQLITE_SA
1e850 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c  VEPOINT, az[op],
1e860 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20   zName, 0) ){.  
1e870 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1e880 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e  e(pParse->db, zN
1e890 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
1e8a0 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
1e8b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1e8c0 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c  v, OP_Savepoint,
1e8d0 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65   op, 0, 0, zName
1e8e0 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
1e8f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
1e900 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64   sure the TEMP d
1e910 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20  atabase is open 
1e920 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  and available fo
1e930 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a  r use.  Return.*
1e940 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
1e950 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61  errors.  Leave a
1e960 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
1e970 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  s in the pParse 
1e980 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
1e990 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d  t sqlite3OpenTem
1e9a0 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20  pDatabase(Parse 
1e9b0 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
1e9c0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1e9d0 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ->db;.  if( db->
1e9e0 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26  aDb[1].pBt==0 &&
1e9f0 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
1ea00 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  n ){.    int rc;
1ea10 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b  .    Btree *pBt;
1ea20 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
1ea30 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20  t int flags = . 
1ea40 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1ea50 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
1ea60 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
1ea70 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
1ea80 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1ea90 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
1eaa0 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
1eab0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
1eac0 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20  CLOSE |.        
1ead0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
1eae0 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d  MP_DB;..    rc =
1eaf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
1eb00 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64  n(db->pVfs, 0, d
1eb10 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61 67  b, &pBt, 0, flag
1eb20 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
1eb30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1eb40 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1eb50 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
1eb60 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
1eb70 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
1eb80 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
1eb90 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
1eba0 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a  orary tables");.
1ebb0 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
1ebc0 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
1ebd0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
1ebe0 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20   db->aDb[1].pBt 
1ebf0 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  = pBt;.    asser
1ec00 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  t( db->aDb[1].pS
1ec10 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28  chema );.    if(
1ec20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73   SQLITE_NOMEM==s
1ec30 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
1ec40 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e  geSize(pBt, db->
1ec50 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d 31  nextPagesize, -1
1ec60 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 64 62  , 0) ){.      db
1ec70 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
1ec80 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
1ec90 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
1eca0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1ecb0 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
1ecc0 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
1ecd0 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
1ece0 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61  a cookie and sta
1ecf0 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61  rt.** a read-tra
1ed00 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c  nsaction for all
1ed10 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20   named database 
1ed20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  files..**.** It 
1ed30 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  is important tha
1ed40 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f  t all schema coo
1ed50 6b 69 65 73 20 62 65 20 76 65 72 69 66 69 65 64  kies be verified
1ed60 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64   and all.** read
1ed70 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65   transactions be
1ed80 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
1ed90 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61  anything else ha
1eda0 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ppens in.** the 
1edb0 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42  VDBE program.  B
1edc0 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ut this routine 
1edd0 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66  can be called af
1ede0 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a  ter much other.*
1edf0 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20  * code has been 
1ee00 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68  generated.  So h
1ee10 65 72 65 20 69 73 20 77 68 61 74 20 77 65 20 64  ere is what we d
1ee20 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  o:.**.** The fir
1ee30 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75  st time this rou
1ee40 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1ee50 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f  we code an OP_Go
1ee60 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  to that.** will 
1ee70 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75  jump to a subrou
1ee80 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20  tine at the end 
1ee90 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20  of the program. 
1eea0 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f   Then we.** reco
1eeb0 72 64 20 65 76 65 72 79 20 64 61 74 61 62 61 73  rd every databas
1eec0 65 20 74 68 61 74 20 6e 65 65 64 73 20 69 74 73  e that needs its
1eed0 20 73 63 68 65 6d 61 20 76 65 72 69 66 69 65 64   schema verified
1eee0 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73   in the.** pPars
1eef0 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69  e->cookieMask fi
1ef00 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74  eld.  Later, aft
1ef10 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64  er all other cod
1ef20 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65  e has been.** ge
1ef30 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73 75 62  nerated, the sub
1ef40 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65  routine that doe
1ef50 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72  s the cookie ver
1ef60 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a  ifications and.*
1ef70 2a 20 73 74 61 72 74 73 20 74 68 65 20 74 72 61  * starts the tra
1ef80 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62  nsactions will b
1ef90 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20  e coded and the 
1efa0 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65  OP_Goto P2 value
1efb0 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  .** will be made
1efc0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
1efd0 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54  t subroutine.  T
1efe0 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66  he generation of
1eff0 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76   the.** cookie v
1f000 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72  erification subr
1f010 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70  outine code happ
1f020 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69  ens in sqlite3Fi
1f030 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a  nishCoding()..**
1f040 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65  .** If iDb<0 the
1f050 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f  n code the OP_Go
1f060 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20  to only - don't 
1f070 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69  set flag to veri
1f080 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61  fy the.** schema
1f090 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65   on any database
1f0a0 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20  s.  This can be 
1f0b0 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e  used to position
1f0c0 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20   the OP_Goto.** 
1f0d0 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64  early in the cod
1f0e0 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f  e, before we kno
1f0f0 77 20 69 66 20 61 6e 79 20 64 61 74 61 62 61 73  w if any databas
1f100 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65  e tables will be
1f110 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   used..*/.void s
1f120 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1f130 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
1f140 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
1f150 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
1f160 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
1f170 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
1f180 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1f190 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
1f1a0 20 20 69 66 28 20 70 54 6f 70 6c 65 76 65 6c 21    if( pToplevel!
1f1b0 3d 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 2f  =pParse ){.    /
1f1c0 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
1f1d0 20 74 61 6b 65 6e 20 69 66 20 61 20 74 72 69 67   taken if a trig
1f1e0 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
1f1f0 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 49 6e   being coded. In
1f200 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 61 73   this.    ** cas
1f210 65 2c 20 73 65 74 20 63 6f 6f 6b 69 65 47 6f 74  e, set cookieGot
1f220 6f 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  o to a non-zero 
1f230 76 61 6c 75 65 20 74 6f 20 73 68 6f 77 20 74 68  value to show th
1f240 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
1f250 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  .    ** has been
1f260 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 20 69 73   called. This is
1f270 20 75 73 65 64 20 62 79 20 74 68 65 20 73 71 6c   used by the sql
1f280 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73  ite3ExprCodeCons
1f290 74 61 6e 74 73 28 29 0a 20 20 20 20 2a 2a 20 66  tants().    ** f
1f2a0 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  unction. */.    
1f2b0 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
1f2c0 74 6f 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e  to = -1;.  }.#en
1f2d0 64 69 66 0a 20 20 69 66 28 20 70 54 6f 70 6c 65  dif.  if( pTople
1f2e0 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d  vel->cookieGoto=
1f2f0 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =0 ){.    Vdbe *
1f300 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1f310 62 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20  be(pToplevel);. 
1f320 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
1f330 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f  turn;  /* This o
1f340 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74  nly happens if t
1f350 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f 72  here was a prior
1f360 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 70 54   error */.    pT
1f370 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47  oplevel->cookieG
1f380 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62  oto = sqlite3Vdb
1f390 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1f3a0 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d  to, 0, 0)+1;.  }
1f3b0 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b  .  if( iDb>=0 ){
1f3c0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
1f3d0 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 64 62   = pToplevel->db
1f3e0 3b 0a 20 20 20 20 79 44 62 4d 61 73 6b 20 6d 61  ;.    yDbMask ma
1f3f0 73 6b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  sk;..    assert(
1f400 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
1f410 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
1f420 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20  aDb[iDb].pBt!=0 
1f430 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20  || iDb==1 );.   
1f440 20 61 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c   assert( iDb<SQL
1f450 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44  ITE_MAX_ATTACHED
1f460 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +2 );.    assert
1f470 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
1f480 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
1f490 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 61 73 6b  , 0) );.    mask
1f4a0 20 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c   = ((yDbMask)1)<
1f4b0 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70  <iDb;.    if( (p
1f4c0 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
1f4d0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20  Mask & mask)==0 
1f4e0 29 7b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76  ){.      pToplev
1f4f0 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c  el->cookieMask |
1f500 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 54  = mask;.      pT
1f510 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56  oplevel->cookieV
1f520 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e  alue[iDb] = db->
1f530 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
1f540 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b  ->schema_cookie;
1f550 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
1f560 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
1f570 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
1f580 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61  ite3OpenTempData
1f590 62 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b  base(pToplevel);
1f5a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f5b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61   }.}../*.** If a
1f5c0 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e  rgument zDb is N
1f5d0 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73  ULL, then call s
1f5e0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1f5f0 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63  Schema() for eac
1f600 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64  h .** attached d
1f610 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69  atabase. Otherwi
1f620 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f  se, invoke it fo
1f630 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  r the database n
1f640 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a  amed zDb only..*
1f650 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
1f660 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
1f670 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
1f680 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1f690 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
1f6a0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1f6b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1f6c0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
1f6d0 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44  i++){.    Db *pD
1f6e0 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
1f6f0 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
1f700 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d  t && (!zDb || 0=
1f710 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
1f720 7a 44 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29  zDb, pDb->zName)
1f730 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1f740 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
1f750 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20  ma(pParse, i);. 
1f760 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1f770 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
1f780 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72  code that prepar
1f790 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20  es for doing an 
1f7a0 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a  operation that.*
1f7b0 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  * might change t
1f7c0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
1f7d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f7e0 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61  starts a new tra
1f7f0 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61  nsaction if we a
1f800 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77  re not already w
1f810 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73  ithin.** a trans
1f820 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61  action.  If we a
1f830 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  re already withi
1f840 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
1f850 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69   then a checkpoi
1f860 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20  nt.** is set if 
1f870 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74  the setStatement
1f880 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72   parameter is tr
1f890 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e  ue.  A checkpoin
1f8a0 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
1f8b0 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e  et for operation
1f8c0 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69  s that might fai
1f8d0 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73  l (due to a cons
1f8e0 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a  traint) part of.
1f8f0 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75  ** the way throu
1f900 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c  gh and which wil
1f910 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73  l need to undo s
1f920 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f  ome writes witho
1f930 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20  ut having to.** 
1f940 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f  rollback the who
1f950 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  le transaction. 
1f960 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   For operations 
1f970 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72  where all constr
1f980 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20  aints.** can be 
1f990 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61  checked before a
1f9a0 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  ny changes are m
1f9b0 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ade to the datab
1f9c0 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72  ase, it is never
1f9d0 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  .** necessary to
1f9e0 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e   undo a write an
1f9f0 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  d the checkpoint
1fa00 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73   should not be s
1fa10 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
1fa20 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
1fa30 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
1fa40 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61  arse, int setSta
1fa50 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29  tement, int iDb)
1fa60 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
1fa70 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
1fa80 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
1fa90 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  se);.  sqlite3Co
1faa0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
1fab0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70  Parse, iDb);.  p
1fac0 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d  Toplevel->writeM
1fad0 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b  ask |= ((yDbMask
1fae0 29 31 29 3c 3c 69 44 62 3b 0a 20 20 70 54 6f 70  )1)<<iDb;.  pTop
1faf0 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72  level->isMultiWr
1fb00 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d  ite |= setStatem
1fb10 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ent;.}../*.** In
1fb20 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
1fb30 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e  statement curren
1fb40 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
1fb50 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69  uction might wri
1fb60 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  te.** more than 
1fb70 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70  one entry (examp
1fb80 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65  le: deleting one
1fb90 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74   row then insert
1fba0 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20  ing another,.** 
1fbb0 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70  inserting multip
1fbc0 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62  le rows in a tab
1fbd0 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67  le, or inserting
1fbe0 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78   a row and index
1fbf0 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66   entries.).** If
1fc00 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73   an abort occurs
1fc10 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74   after some of t
1fc20 68 65 73 65 20 77 72 69 74 65 73 20 68 61 76 65  hese writes have
1fc30 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e   completed, then
1fc40 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e   it will.** be n
1fc50 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f  ecessary to undo
1fc60 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77   the completed w
1fc70 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rites..*/.void s
1fc80 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65  qlite3MultiWrite
1fc90 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1fca0 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
1fcb0 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
1fcc0 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
1fcd0 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d  e);.  pToplevel-
1fce0 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20  >isMultiWrite = 
1fcf0 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65  1;.}../* .** The
1fd00 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
1fd10 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
1fd20 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f 76 65  ne if is discove
1fd30 72 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a  rs that it is.**
1fd40 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f   possible to abo
1fd50 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70  rt a statement p
1fd60 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69  rior to completi
1fd70 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  on.  In order to
1fd80 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69   .** perform thi
1fd90 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20  s abort without 
1fda0 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20 64  corrupting the d
1fdb0 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64  atabase, we need
1fdc0 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65   to make.** sure
1fdd0 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
1fde0 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65 64  ent is protected
1fdf0 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20   by a statement 
1fe00 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1fe10 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20  ** Technically, 
1fe20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20  we only need to 
1fe30 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74  set the mayAbort
1fe40 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20   flag if the.** 
1fe50 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61  isMultiWrite fla
1fe60 67 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  g was previously
1fe70 20 73 65 74 2e 20 20 54 68 65 72 65 20 69 73 20   set.  There is 
1fe80 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63  a time dependenc
1fe90 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74  y.** such that t
1fea0 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63  he abort must oc
1feb0 63 75 72 20 61 66 74 65 72 20 74 68 65 20 6d 75  cur after the mu
1fec0 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69 73 20  ltiwrite.  This 
1fed0 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74  makes.** some st
1fee0 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69  atements involvi
1fef0 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45 20 63  ng the REPLACE c
1ff00 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
1ff10 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20  on algorithm.** 
1ff20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74  go a little fast
1ff30 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20  er.  But taking 
1ff40 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69  advantage of thi
1ff50 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63  s time dependenc
1ff60 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f  y.** makes it mo
1ff70 72 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20  re difficult to 
1ff80 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 63  prove that the c
1ff90 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74 20 28  ode is correct (
1ffa0 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61  in .** particula
1ffb0 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20 75  r, it prevents u
1ffc0 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61  s from writing a
1ffd0 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69  n effective.** i
1ffe0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1fff0 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
20000 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f  yAbort()) and so
20010 20 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a   we have chosen.
20020 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73  ** to take the s
20030 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b  afe route and sk
20040 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  ip the optimizat
20050 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
20060 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72  ite3MayAbort(Par
20070 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50  se *pParse){.  P
20080 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
20090 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
200a0 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
200b0 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79    pToplevel->may
200c0 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  Abort = 1;.}../*
200d0 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48  .** Code an OP_H
200e0 61 6c 74 20 74 68 61 74 20 63 61 75 73 65 73 20  alt that causes 
200f0 74 68 65 20 76 64 62 65 20 74 6f 20 72 65 74 75  the vdbe to retu
20100 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  rn an SQLITE_CON
20110 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72  STRAINT.** error
20120 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61  . The onError pa
20130 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e  rameter determin
20140 65 73 20 77 68 69 63 68 20 28 69 66 20 61 6e 79  es which (if any
20150 29 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  ) of the stateme
20160 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72  nt.** and/or cur
20170 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
20180 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
20190 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
201a0 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a  HaltConstraint(.
201b0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
201c0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
201d0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
201e0 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a  errCode,      /*
201f0 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20   extended error 
20200 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  code */.  int on
20210 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
20220 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a  onstraint type *
20230 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20 20  /.  char *p4,   
20240 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d        /* Error m
20250 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 38 20 70  essage */.  i8 p
20260 34 74 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a  4type,        /*
20270 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50 34   P4_STATIC or P4
20280 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20  _TRANSIENT */.  
20290 75 38 20 70 35 45 72 72 6d 73 67 20 20 20 20 20  u8 p5Errmsg     
202a0 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20 74    /* P5_ErrMsg t
202b0 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  ype */.){.  Vdbe
202c0 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
202d0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
202e0 61 73 73 65 72 74 28 20 28 65 72 72 43 6f 64 65  assert( (errCode
202f0 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
20300 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20 69  ONSTRAINT );.  i
20310 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41  f( onError==OE_A
20320 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  bort ){.    sqli
20330 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
20340 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  se);.  }.  sqlit
20350 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
20360 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64 65  OP_Halt, errCode
20370 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34  , onError, 0, p4
20380 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 69 66 28  , p4type);.  if(
20390 20 70 35 45 72 72 6d 73 67 20 29 20 73 71 6c 69   p5Errmsg ) sqli
203a0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
203b0 76 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a  v, p5Errmsg);.}.
203c0 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
203d0 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 55 4e  P_Halt due to UN
203e0 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20  IQUE or PRIMARY 
203f0 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  KEY constraint v
20400 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  iolation..*/.voi
20410 64 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43  d sqlite3UniqueC
20420 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
20430 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
20440 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
20450 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  t */.  int onErr
20460 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73  or,      /* Cons
20470 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20  traint type */. 
20480 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
20490 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
204a0 74 68 61 74 20 74 72 69 67 67 65 72 73 20 74 68  that triggers th
204b0 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  e constraint */.
204c0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
204d0 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41  .  int j;.  StrA
204e0 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54  ccum errMsg;.  T
204f0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64  able *pTab = pId
20500 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71  x->pTable;..  sq
20510 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
20520 74 28 26 65 72 72 4d 73 67 2c 20 30 2c 20 30 2c  t(&errMsg, 0, 0,
20530 20 32 30 30 29 3b 0a 20 20 65 72 72 4d 73 67 2e   200);.  errMsg.
20540 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
20550 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49  .  for(j=0; j<pI
20560 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  dx->nKeyCol; j++
20570 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  ){.    char *zCo
20580 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70  l = pTab->aCol[p
20590 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
205a0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
205b0 20 6a 20 29 20 73 71 6c 69 74 65 33 53 74 72 41   j ) sqlite3StrA
205c0 63 63 75 6d 41 70 70 65 6e 64 28 26 65 72 72 4d  ccumAppend(&errM
205d0 73 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20  sg, ", ", 2);.  
205e0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
205f0 6d 41 70 70 65 6e 64 41 6c 6c 28 26 65 72 72 4d  mAppendAll(&errM
20600 73 67 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  sg, pTab->zName)
20610 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72  ;.    sqlite3Str
20620 41 63 63 75 6d 41 70 70 65 6e 64 28 26 65 72 72  AccumAppend(&err
20630 4d 73 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20  Msg, ".", 1);.  
20640 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
20650 6d 41 70 70 65 6e 64 41 6c 6c 28 26 65 72 72 4d  mAppendAll(&errM
20660 73 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20 7d 0a 20  sg, zCol);.  }. 
20670 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 53   zErr = sqlite3S
20680 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 65  trAccumFinish(&e
20690 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
206a0 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
206b0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 28 70 49  pParse, .    (pI
206c0 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 3d 3d 32  dx->autoIndex==2
206d0 29 3f 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  )?SQLITE_CONSTRA
206e0 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a 53  INT_PRIMARYKEY:S
206f0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
20700 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45  _UNIQUE,.    onE
20710 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44  rror, zErr, P4_D
20720 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74  YNAMIC, P5_Const
20730 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a  raintUnique);.}.
20740 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
20750 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 6e  OP_Halt due to n
20760 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 2e  on-unique rowid.
20770 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20780 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28  RowidConstraint(
20790 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
207a0 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
207b0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
207c0 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
207d0 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
207e0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20  ution algorithm 
207f0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
20800 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
20810 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f 6e  ble with the non
20820 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a 2f  -unique rowid */
20830 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73   .){.  char *zMs
20840 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  g;.  int rc;.  i
20850 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d  f( pTab->iPKey>=
20860 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20  0 ){.    zMsg = 
20870 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
20880 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25  Parse->db, "%s.%
20890 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  s", pTab->zName,
208a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
208b0 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
208c0 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65  >aCol[pTab->iPKe
208d0 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  y].zName);.    r
208e0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
208f0 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
20900 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
20910 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
20920 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
20930 20 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54 61   "%s.rowid", pTa
20940 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  b->zName);.    r
20950 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
20960 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d  RAINT_ROWID;.  }
20970 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  .  sqlite3HaltCo
20980 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
20990 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d   rc, onError, zM
209a0 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a  sg, P4_DYNAMIC,.
209b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209c0 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74          P5_Const
209d0 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a  raintUnique);.}.
209e0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
209f0 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73  see if pIndex us
20a00 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  es the collating
20a10 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
20a20 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
20a30 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
20a40 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73  false if it does
20a50 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   not..*/.#ifndef
20a60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
20a70 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20  NDEX.static int 
20a80 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63  collationMatch(c
20a90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
20aa0 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29  , Index *pIndex)
20ab0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
20ac0 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b  ert( zColl!=0 );
20ad0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
20ae0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  ndex->nColumn; i
20af0 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
20b00 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d  har *z = pIndex-
20b10 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
20b20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20  assert( z!=0 || 
20b30 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
20b40 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66 28  [i]<0 );.    if(
20b50 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
20b60 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71  n[i]>=0 && 0==sq
20b70 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
20b80 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
20b90 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
20ba0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
20bb0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
20bc0 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
20bd0 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68  dices of pTab th
20be0 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  at use the colla
20bf0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
20c00 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c  oll..** If pColl
20c10 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
20c20 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
20c30 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64  f pTab..*/.#ifnd
20c40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
20c50 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f  EINDEX.static vo
20c60 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28  id reindexTable(
20c70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
20c80 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72  able *pTab, char
20c90 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
20ca0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20cc0 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
20cd0 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
20ce0 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d  /..  for(pIndex=
20cf0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
20d00 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e  ndex; pIndex=pIn
20d10 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  dex->pNext){.   
20d20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c   if( zColl==0 ||
20d30 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
20d40 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29  zColl, pIndex) )
20d50 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20  {.      int iDb 
20d60 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
20d70 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
20d80 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
20d90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20da0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
20db0 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
20dc0 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
20dd0 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
20de0 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
20df0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
20e00 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
20e10 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
20e20 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  es of all tables
20e30 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
20e40 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69  s where the.** i
20e50 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63  ndices use the c
20e60 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
20e70 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f  e pColl.  If pCo
20e80 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
20e90 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69  pute.** all indi
20ea0 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a  ces everywhere..
20eb0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
20ec0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
20ed0 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64  tatic void reind
20ee0 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73  exDatabases(Pars
20ef0 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20  e *pParse, char 
20f00 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
20f10 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
20f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20f30 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  A single databas
20f40 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f60 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
20f70 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
20f80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
20f90 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
20fa0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
20fb0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
20fc0 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20   HashElem *k;   
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20fe0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
20ff0 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a   tables in pDb *
21000 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
21010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21020 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
21030 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20  e database */.. 
21040 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
21050 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
21060 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a 20  exes(db) );  /* 
21070 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68 65 6d  Needed for schem
21080 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f  a access */.  fo
21090 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d  r(iDb=0, pDb=db-
210a0 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  >aDb; iDb<db->nD
210b0 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29  b; iDb++, pDb++)
210c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44  {.    assert( pD
210d0 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  b!=0 );.    for(
210e0 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  k=sqliteHashFirs
210f0 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
21100 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b  >tblHash);  k; k
21110 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
21120 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  k)){.      pTab 
21130 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65  = (Table*)sqlite
21140 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20  HashData(k);.   
21150 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
21160 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43  pParse, pTab, zC
21170 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oll);.    }.  }.
21180 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
21190 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
211a0 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f  r the REINDEX co
211b0 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  mmand..**.**    
211c0 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20      REINDEX     
211d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211e0 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20         -- 1.**  
211f0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c        REINDEX  <
21200 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20  collation>      
21210 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a           -- 2.**
21220 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
21230 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74   ?<database>.?<t
21240 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a  ablename>  -- 3.
21250 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
21260 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
21270 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20  <indexname>  -- 
21280 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63  4.**.** Form 1 c
21290 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65  auses all indice
212a0 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  s in all attache
212b0 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62  d databases to b
212c0 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f  e rebuilt..** Fo
212d0 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c  rm 2 rebuilds al
212e0 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
212f0 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
21300 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a  use the named.**
21310 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
21320 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e  ion.  Forms 3 an
21330 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20  d 4 rebuild the 
21340 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61  named index or a
21350 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73  ll.** indices as
21360 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
21370 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a  e named table..*
21380 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
21390 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f  _OMIT_REINDEX.vo
213a0 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65  id sqlite3Reinde
213b0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
213c0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
213d0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a  Token *pName2){.
213e0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
213f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
21400 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
21410 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65  nce to be reinde
21420 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  xed, or NULL */.
21430 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
21440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21450 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   Name of a table
21460 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63   or index */.  c
21470 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20  onst char *zDb; 
21480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
21490 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
214a0 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  se */.  Table *p
214b0 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
214c0 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
214d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
214e0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
214f0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
21500 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
21510 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
21520 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
21530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21540 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
21550 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
21560 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
21570 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
21580 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
21590 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
215a0 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b  Token *pObjName;
215b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
215c0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
215d0 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20   or index to be 
215e0 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20  reindexed */..  
215f0 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
21600 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
21610 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
21620 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
21630 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
21640 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
21650 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
21660 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
21670 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
21680 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
21690 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
216a0 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d  }..  if( pName1=
216b0 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  =0 ){.    reinde
216c0 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
216d0 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  e, 0);.    retur
216e0 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e  n;.  }else if( N
216f0 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20  EVER(pName2==0) 
21700 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20  || pName2->z==0 
21710 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  ){.    char *zCo
21720 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ll;.    assert( 
21730 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20  pName1->z );.   
21740 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
21750 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
21760 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31  arse->db, pName1
21770 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c  );.    if( !zCol
21780 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  l ) return;.    
21790 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
217a0 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
217b0 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30  NC(db), zColl, 0
217c0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
217d0 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65   ){.      reinde
217e0 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
217f0 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, zColl);.     
21800 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
21810 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  b, zColl);.     
21820 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
21830 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
21840 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
21850 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
21860 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
21870 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
21880 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a  e2, &pObjName);.
21890 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
218a0 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  turn;.  z = sqli
218b0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
218c0 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a  (db, pObjName);.
218d0 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
218e0 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d  urn;.  zDb = db-
218f0 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
21900 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
21910 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
21920 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54  , zDb);.  if( pT
21930 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  ab ){.    reinde
21940 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
21950 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Tab, 0);.    sql
21960 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
21970 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
21980 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
21990 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
219a0 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71  b, z, zDb);.  sq
219b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
219c0 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  z);.  if( pIndex
219d0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
219e0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
219f0 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
21a00 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  b);.    sqlite3R
21a10 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
21a20 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
21a30 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
21a40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
21a50 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
21a60 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  e to identify th
21a70 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72  e object to be r
21a80 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65  eindexed");.}.#e
21a90 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
21aa0 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  rn a KeyInfo str
21ab0 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20 61  ucture that is a
21ac0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
21ad0 68 65 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a  he given Index..
21ae0 2a 2a 0a 2a 2a 20 54 68 65 20 4b 65 79 49 6e 66  **.** The KeyInf
21af0 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  o structure for 
21b00 61 6e 20 69 6e 64 65 78 20 69 73 20 63 61 63 68  an index is cach
21b10 65 64 20 69 6e 20 74 68 65 20 49 6e 64 65 78 20  ed in the Index 
21b20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 53 6f 20 74 68  object..** So th
21b30 65 72 65 20 6d 69 67 68 74 20 62 65 20 6d 75 6c  ere might be mul
21b40 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  tiple references
21b50 20 74 6f 20 74 68 65 20 72 65 74 75 72 6e 65 64   to the returned
21b60 20 70 6f 69 6e 74 65 72 2e 20 20 54 68 65 0a 2a   pointer.  The.*
21b70 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  * caller should 
21b80 6e 6f 74 20 74 72 79 20 74 6f 20 6d 6f 64 69 66  not try to modif
21b90 79 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62  y the KeyInfo ob
21ba0 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
21bb0 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e  caller should in
21bc0 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b 65 79 49  voke sqlite3KeyI
21bd0 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e 20 74 68  nfoUnref() on th
21be0 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63  e returned objec
21bf0 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73  t.** when it has
21c00 20 66 69 6e 69 73 68 65 64 20 75 73 69 6e 67 20   finished using 
21c10 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a  it..*/.KeyInfo *
21c20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
21c30 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
21c40 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  rse, Index *pIdx
21c50 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
21c60 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
21c70 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
21c80 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
21c90 48 45 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70  HE.  if( pIdx->p
21ca0 4b 65 79 49 6e 66 6f 20 26 26 20 70 49 64 78 2d  KeyInfo && pIdx-
21cb0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 21 3d 70  >pKeyInfo->db!=p
21cc0 50 61 72 73 65 2d 3e 64 62 20 29 7b 0a 20 20 20  Parse->db ){.   
21cd0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
21ce0 6e 72 65 66 28 70 49 64 78 2d 3e 70 4b 65 79 49  nref(pIdx->pKeyI
21cf0 6e 66 6f 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e  nfo);.    pIdx->
21d00 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20  pKeyInfo = 0;.  
21d10 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
21d20 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Idx->pKeyInfo==0
21d30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
21d40 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49     int nCol = pI
21d50 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  dx->nColumn;.   
21d60 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78   int nKey = pIdx
21d70 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 4b  ->nKeyCol;.    K
21d80 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20  eyInfo *pKey;.  
21d90 20 20 69 66 28 20 70 49 64 78 2d 3e 75 6e 69 71    if( pIdx->uniq
21da0 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  NotNull ){.     
21db0 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b   pKey = sqlite3K
21dc0 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72  eyInfoAlloc(pPar
21dd0 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43  se->db, nKey, nC
21de0 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 20 20 7d 65  ol-nKey);.    }e
21df0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4b 65 79 20  lse{.      pKey 
21e00 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
21e10 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
21e20 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20  , nCol, 0);.    
21e30 7d 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29  }.    if( pKey )
21e40 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21e50 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
21e60 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20  Writeable(pKey) 
21e70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
21e80 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
21e90 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43          char *zC
21ea0 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
21eb0 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 61  ll[i];.        a
21ec0 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20  ssert( zColl!=0 
21ed0 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 2d  );.        pKey-
21ee0 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 74 72 63  >aColl[i] = strc
21ef0 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52 59  mp(zColl,"BINARY
21f00 22 29 3d 3d 30 20 3f 20 30 20 3a 0a 20 20 20 20  ")==0 ? 0 :.    
21f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
21f30 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
21f40 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, zColl);.     
21f50 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72     pKey->aSortOr
21f60 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61  der[i] = pIdx->a
21f70 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
21f80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
21f90 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
21fa0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b          sqlite3K
21fb0 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
21fc0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
21fd0 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 70 4b          pIdx->pK
21fe0 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 3b 0a 20  eyInfo = pKey;. 
21ff0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
22000 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
22010 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 49 64 78  3KeyInfoRef(pIdx
22020 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 7d 0a 0a  ->pKeyInfo);.}..
22030 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22040 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54  MIT_CTE./* .** T
22050 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
22060 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65 72 20  nvoked once per 
22070 43 54 45 20 62 79 20 74 68 65 20 70 61 72 73 65  CTE by the parse
22080 72 20 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20  r while parsing 
22090 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73  a .** WITH claus
220a0 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c  e. .*/.With *sql
220b0 69 74 65 33 57 69 74 68 41 64 64 28 0a 20 20 50  ite3WithAdd(.  P
220c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
220d0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
220e0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
220f0 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20  ith *pWith,     
22100 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69         /* Existi
22110 6e 67 20 57 49 54 48 20 63 6c 61 75 73 65 2c 20  ng WITH clause, 
22120 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  or NULL */.  Tok
22130 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20  en *pName,      
22140 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
22150 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65  the common-table
22160 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
22170 70 41 72 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a  pArglist,     /*
22180 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e   Optional column
22190 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72 20 74   name list for t
221a0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65  he table */.  Se
221b0 6c 65 63 74 20 2a 70 51 75 65 72 79 20 20 20 20  lect *pQuery    
221c0 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 75        /* Query u
221d0 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  sed to initializ
221e0 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29  e the table */.)
221f0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
22200 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
22210 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68  With *pNew;.  ch
22220 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a  ar *zName;..  /*
22230 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
22240 43 54 45 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  CTE name is uniq
22250 75 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 57  ue within this W
22260 49 54 48 20 63 6c 61 75 73 65 2e 20 49 66 0a 20  ITH clause. If. 
22270 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61   ** not, store a
22280 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50  n error in the P
22290 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  arse structure. 
222a0 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  */.  zName = sql
222b0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
222c0 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  n(pParse->db, pN
222d0 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
222e0 65 20 26 26 20 70 57 69 74 68 20 29 7b 0a 20 20  e && pWith ){.  
222f0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
22300 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e  (i=0; i<pWith->n
22310 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
22320 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
22330 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68  Cmp(zName, pWith
22340 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
22350 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
22360 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
22370 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63  se, "duplicate c
22380 74 65 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e  te name: %s", zN
22390 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
223a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
223b0 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20  With ){.    int 
223c0 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
223d0 70 57 69 74 68 29 20 2b 20 28 73 69 7a 65 6f 66  pWith) + (sizeof
223e0 28 70 57 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20  (pWith->a[1]) * 
223f0 70 57 69 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20  pWith->nCte);.  
22400 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
22410 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57  DbRealloc(db, pW
22420 69 74 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  ith, nByte);.  }
22430 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d  else{.    pNew =
22440 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
22450 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
22460 2a 70 57 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20  *pWith));.  }.  
22470 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30  assert( zName!=0
22480 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 3b 0a 20   || pNew==0 );. 
22490 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
224a0 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20  locFailed==0 || 
224b0 70 4e 65 77 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  pNew==0 );..  if
224c0 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
224d0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
224e0 44 65 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c  Delete(db, pArgl
224f0 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
22500 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
22510 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73  , pQuery);.    s
22520 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22530 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65   zName);.    pNe
22540 77 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c  w = pWith;.  }el
22550 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  se{.    pNew->a[
22560 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c  pNew->nCte].pSel
22570 65 63 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20  ect = pQuery;.  
22580 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
22590 6e 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41  nCte].pCols = pA
225a0 72 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77  rglist;.    pNew
225b0 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e  ->a[pNew->nCte].
225c0 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
225d0 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
225e0 3e 6e 43 74 65 5d 2e 7a 45 72 72 20 3d 20 30 3b  >nCte].zErr = 0;
225f0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b  .    pNew->nCte+
22600 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  +;.  }..  return
22610 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
22620 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  Free the content
22630 73 20 6f 66 20 74 68 65 20 57 69 74 68 20 6f 62  s of the With ob
22640 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
22650 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
22660 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
22670 74 65 33 57 69 74 68 44 65 6c 65 74 65 28 73 71  te3WithDelete(sq
22680 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20  lite3 *db, With 
22690 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28 20 70  *pWith){.  if( p
226a0 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20  With ){.    int 
226b0 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
226c0 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69  i<pWith->nCte; i
226d0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
226e0 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20 26 70  t Cte *pCte = &p
226f0 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  With->a[i];.    
22700 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
22710 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65  tDelete(db, pCte
22720 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20  ->pCols);.      
22730 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
22740 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 53  ete(db, pCte->pS
22750 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71  elect);.      sq
22760 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
22770 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCte->zName);.  
22780 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
22790 62 46 72 65 65 28 64 62 2c 20 70 57 69 74 68 29  bFree(db, pWith)
227a0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
227b0 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
227c0 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a     E_OMIT_CTE) */.