/ Hex Artifact Content
Login

Artifact 8b02494e4dc9c4a6c9aff1cac8b40c426733f025:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
0d90: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
0da0: 65 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20  e given yDbMask 
0db0: 6f 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20  object is empty 
0dc0: 2d 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73  - if it contains
0dd0: 20 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20   no.** 1 bits.  
0de0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0df0: 75 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61  used by the DbMa
0e00: 73 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20  skAllZero() and 
0e10: 44 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a  DbMaskNotZero().
0e20: 2a 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53  ** macros when S
0e30: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
0e40: 45 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ED is greater th
0e50: 61 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51  an 30..*/.#if SQ
0e60: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0e70: 44 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33  D>30.int sqlite3
0e80: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44  DbMaskAllZero(yD
0e90: 62 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20  bMask m){.  int 
0ea0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
0eb0: 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b  sizeof(yDbMask);
0ec0: 20 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29   i++) if( m[i] )
0ed0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
0ee0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
0ef0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
0f00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
0f10: 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c  ter a single SQL
0f20: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f30: 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e  een.** parsed an
0f40: 64 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  d a VDBE program
0f50: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74   to execute that
0f60: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f70: 65 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e  een.** prepared.
0f80: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70    This routine p
0f90: 75 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e  uts the finishin
0fa0: 67 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65  g touches on the
0fb0: 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d  .** VDBE program
0fc0: 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
0fd0: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0fe0: 20 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a   for the next.**
0ff0: 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   parse..**.** No
1000: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
1010: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
1020: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
1030: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
1040: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
1050: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
1060: 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
1070: 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ng(Parse *pParse
1080: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1090: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
10a0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
10b0: 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a  pToplevel==0 );.
10c0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
10d0: 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  b;.  if( db->mal
10e0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
10f0: 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
1100: 2d 3e 6e 65 73 74 65 64 20 29 20 72 65 74 75 72  ->nested ) retur
1110: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
1120: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
1130: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67  .  /* Begin by g
1140: 65 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74  enerating some t
1150: 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20  ermination code 
1160: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
1170: 65 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67  e.  ** vdbe prog
1180: 72 61 6d 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  ram.  */.  v = s
1190: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
11a0: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
11b0: 20 21 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74   !pParse->isMult
11c0: 69 57 72 69 74 65 20 0a 20 20 20 20 20 20 20 7c  iWrite .       |
11d0: 7c 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  | sqlite3VdbeAss
11e0: 65 72 74 4d 61 79 41 62 6f 72 74 28 76 2c 20 70  ertMayAbort(v, p
11f0: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
1200: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
1210: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
1220: 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f  VdbeDeletePriorO
1230: 70 63 6f 64 65 28 76 2c 20 4f 50 5f 43 6c 6f 73  pcode(v, OP_Clos
1240: 65 29 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74  e) ){}.    sqlit
1250: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
1260: 4f 50 5f 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53  OP_Halt);..#if S
1270: 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
1280: 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 69 66  NTICATION.    if
1290: 28 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65  ( pParse->nTable
12a0: 4c 6f 63 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e  Lock>0 && db->in
12b0: 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20  it.busy==0 ){.  
12c0: 20 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68      if( db->auth
12d0: 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48  .authLevel<UAUTH
12e0: 5f 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20  _User ){.       
12f0: 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75   if( db->auth.au
1300: 74 68 4c 65 76 65 6c 3d 3d 55 41 55 54 48 5f 55  thLevel==UAUTH_U
1310: 6e 6b 6e 6f 77 6e 20 29 7b 0a 20 20 20 20 20 20  nknown ){.      
1320: 20 20 20 20 75 38 20 61 75 74 68 4c 65 76 65 6c      u8 authLevel
1330: 20 3d 20 55 41 55 54 48 5f 46 61 69 6c 3b 0a 20   = UAUTH_Fail;. 
1340: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1350: 55 73 65 72 41 75 74 68 43 68 65 63 6b 4c 6f 67  UserAuthCheckLog
1360: 69 6e 28 64 62 2c 20 22 6d 61 69 6e 22 2c 20 26  in(db, "main", &
1370: 61 75 74 68 4c 65 76 65 6c 29 3b 0a 20 20 20 20  authLevel);.    
1380: 20 20 20 20 20 20 64 62 2d 3e 61 75 74 68 2e 61        db->auth.a
1390: 75 74 68 4c 65 76 65 6c 20 3d 20 61 75 74 68 4c  uthLevel = authL
13a0: 65 76 65 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  evel;.          
13b0: 69 66 28 20 61 75 74 68 4c 65 76 65 6c 3c 55 41  if( authLevel<UA
13c0: 55 54 48 5f 41 64 6d 69 6e 20 29 20 64 62 2d 3e  UTH_Admin ) db->
13d0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
13e0: 5f 57 72 69 74 65 53 63 68 65 6d 61 3b 0a 20 20  _WriteSchema;.  
13f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1400: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74  if( db->auth.aut
1410: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65  hLevel<UAUTH_Use
1420: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  r ){.          p
1430: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1440: 54 45 5f 41 55 54 48 5f 55 53 45 52 3b 0a 20 20  TE_AUTH_USER;.  
1450: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1460: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1470: 22 75 73 65 72 20 6e 6f 74 20 61 75 74 68 65 6e  "user not authen
1480: 74 69 63 61 74 65 64 22 29 3b 0a 20 20 20 20 20  ticated");.     
1490: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
14a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
14c0: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d   /* The cookie m
14d0: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  ask contains one
14e0: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61   bit for each da
14f0: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e  tabase file open
1500: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20  ..    ** (Bit 0 
1510: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74  is for main, bit
1520: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20   1 is for temp, 
1530: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20  and so forth.)  
1540: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  Bits are.    ** 
1550: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74  set for each dat
1560: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73  abase that is us
1570: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  ed.  Generate co
1580: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20  de to start a.  
1590: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
15a0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
15b0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65  tabase and to ve
15c0: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
15d0: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e  cookie.    ** on
15e0: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
15f0: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1600: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
1610: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26  iled==0 .     &&
1620: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28   (DbMaskNonZero(
1630: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1640: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70  sk) || pParse->p
1650: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29  ConstExpr).    )
1660: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c  {.      int iDb,
1670: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   i;.      assert
1680: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  ( sqlite3VdbeGet
1690: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65  Op(v, 0)->opcode
16a0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20  ==OP_Init );.   
16b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
16c0: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20  mpHere(v, 0);.  
16d0: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69      for(iDb=0; i
16e0: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
16f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1700: 44 62 4d 61 73 6b 54 65 73 74 28 70 50 61 72 73  DbMaskTest(pPars
1710: 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69  e->cookieMask, i
1720: 44 62 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Db)==0 ) continu
1730: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
1740: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
1750: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20  v, iDb);.       
1760: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1770: 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20 20  p4Int(v,.       
1780: 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f     OP_Transactio
1790: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
17a0: 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20        /* Opcode 
17b0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44 62  */.          iDb
17c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e0: 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20 20  /* P1 */.       
17f0: 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70 50     DbMaskTest(pP
1800: 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 2c  arse->writeMask,
1810: 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a 20  iDb), /* P2 */. 
1820: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
1830: 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62  >cookieValue[iDb
1840: 5d 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ],          /* P
1850: 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 64  3 */.          d
1860: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
1870: 65 6d 61 2d 3e 69 47 65 6e 65 72 61 74 69 6f 6e  ema->iGeneration
1880: 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20    /* P4 */.     
1890: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
18a0: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
18b0: 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  =0 ) sqlite3Vdbe
18c0: 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a  ChangeP5(v, 1);.
18d0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
18e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
18f0: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 66  UALTABLE.      f
1900: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
1910: 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b 20 69 2b 2b  ->nVtabLock; i++
1920: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
1930: 2a 76 74 61 62 20 3d 20 28 63 68 61 72 20 2a 29  *vtab = (char *)
1940: 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65  sqlite3GetVTable
1950: 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 70 56  (db, pParse->apV
1960: 74 61 62 4c 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20  tabLock[i]);.   
1970: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1980: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65  AddOp4(v, OP_VBe
1990: 67 69 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74  gin, 0, 0, 0, vt
19a0: 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20  ab, P4_VTAB);.  
19b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72      }.      pPar
19c0: 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20 3d 20  se->nVtabLock = 
19d0: 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  0;.#endif..     
19e0: 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20 74 68 65   /* Once all the
19f0: 20 63 6f 6f 6b 69 65 73 20 68 61 76 65 20 62 65   cookies have be
1a00: 65 6e 20 76 65 72 69 66 69 65 64 20 61 6e 64 20  en verified and 
1a10: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65  transactions ope
1a20: 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f  ned, .      ** o
1a30: 62 74 61 69 6e 20 74 68 65 20 72 65 71 75 69 72  btain the requir
1a40: 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20  ed table-locks. 
1a50: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
1a60: 75 6e 6c 65 73 73 20 74 68 65 20 0a 20 20 20 20  unless the .    
1a70: 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68    ** shared-cach
1a80: 65 20 66 65 61 74 75 72 65 20 69 73 20 65 6e 61  e feature is ena
1a90: 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  bled..      */. 
1aa0: 20 20 20 20 20 63 6f 64 65 54 61 62 6c 65 4c 6f       codeTableLo
1ab0: 63 6b 73 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  cks(pParse);..  
1ac0: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
1ad0: 65 20 61 6e 79 20 41 55 54 4f 49 4e 43 52 45 4d  e any AUTOINCREM
1ae0: 45 4e 54 20 64 61 74 61 20 73 74 72 75 63 74 75  ENT data structu
1af0: 72 65 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20  res required..  
1b00: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
1b10: 69 74 65 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e  ite3Autoincremen
1b20: 74 42 65 67 69 6e 28 70 50 61 72 73 65 29 3b 0a  tBegin(pParse);.
1b30: 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 63  .      /* Code c
1b40: 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73 69  onstant expressi
1b50: 6f 6e 73 20 74 68 61 74 20 77 68 65 72 65 20 66  ons that where f
1b60: 61 63 74 6f 72 65 64 20 6f 75 74 20 6f 66 20 69  actored out of i
1b70: 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20  nner loops */.  
1b80: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
1b90: 70 43 6f 6e 73 74 45 78 70 72 20 29 7b 0a 20 20  pConstExpr ){.  
1ba0: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
1bb0: 70 45 4c 20 3d 20 70 50 61 72 73 65 2d 3e 70 43  pEL = pParse->pC
1bc0: 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20 20 20 20  onstExpr;.      
1bd0: 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73    pParse->okCons
1be0: 74 46 61 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20  tFactor = 0;.   
1bf0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1c00: 70 45 4c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  pEL->nExpr; i++)
1c10: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1c20: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
1c30: 73 65 2c 20 70 45 4c 2d 3e 61 5b 69 5d 2e 70 45  se, pEL->a[i].pE
1c40: 78 70 72 2c 20 70 45 4c 2d 3e 61 5b 69 5d 2e 75  xpr, pEL->a[i].u
1c50: 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67 29 3b  .iConstExprReg);
1c60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c70: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e   }..      /* Fin
1c80: 61 6c 6c 79 2c 20 6a 75 6d 70 20 62 61 63 6b 20  ally, jump back 
1c90: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
1ca0: 20 6f 66 20 74 68 65 20 65 78 65 63 75 74 61 62   of the executab
1cb0: 6c 65 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20  le code. */.    
1cc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cd0: 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1ce0: 30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 1);.    }.  }
1cf0: 0a 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20  ...  /* Get the 
1d00: 56 44 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61  VDBE program rea
1d10: 64 79 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  dy for execution
1d20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26  .  */.  if( v &&
1d30: 20 41 4c 57 41 59 53 28 70 50 61 72 73 65 2d 3e   ALWAYS(pParse->
1d40: 6e 45 72 72 3d 3d 30 29 20 26 26 20 21 64 62 2d  nErr==0) && !db-
1d50: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1d60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1d70: 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c  rse->iCacheLevel
1d80: 3d 3d 30 20 29 3b 20 20 2f 2a 20 44 69 73 61 62  ==0 );  /* Disab
1d90: 6c 65 73 20 61 6e 64 20 72 65 2d 65 6e 61 62 6c  les and re-enabl
1da0: 65 73 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  es match */.    
1db0: 2f 2a 20 41 20 6d 69 6e 69 6d 75 6d 20 6f 66 20  /* A minimum of 
1dc0: 6f 6e 65 20 63 75 72 73 6f 72 20 69 73 20 72 65  one cursor is re
1dd0: 71 75 69 72 65 64 20 69 66 20 61 75 74 6f 69 6e  quired if autoin
1de0: 63 72 65 6d 65 6e 74 20 69 73 20 75 73 65 64 0a  crement is used.
1df0: 20 20 20 20 2a 20 20 53 65 65 20 74 69 63 6b 65      *  See ticke
1e00: 74 20 5b 61 36 39 36 33 37 39 63 31 66 30 38 38  t [a696379c1f088
1e10: 36 36 5d 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  66] */.    if( p
1e20: 50 61 72 73 65 2d 3e 70 41 69 6e 63 21 3d 30 20  Parse->pAinc!=0 
1e30: 26 26 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d  && pParse->nTab=
1e40: 3d 30 20 29 20 70 50 61 72 73 65 2d 3e 6e 54 61  =0 ) pParse->nTa
1e50: 62 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  b = 1;.    sqlit
1e60: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28  e3VdbeMakeReady(
1e70: 76 2c 20 70 50 61 72 73 65 29 3b 0a 20 20 20 20  v, pParse);.    
1e80: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
1e90: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50  ITE_DONE;.    pP
1ea0: 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65  arse->colNamesSe
1eb0: 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
1ec0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
1ed0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1ee0: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61   }.  pParse->nTa
1ef0: 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  b = 0;.  pParse-
1f00: 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61  >nMem = 0;.  pPa
1f10: 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20  rse->nSet = 0;. 
1f20: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
1f30: 30 3b 0a 20 20 44 62 4d 61 73 6b 5a 65 72 6f 28  0;.  DbMaskZero(
1f40: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1f50: 73 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75  sk);.}../*.** Ru
1f60: 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64  n the parser and
1f70: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
1f80: 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f  recursively in o
1f90: 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65  rder to generate
1fa0: 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65  .** code for the
1fb0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67   SQL statement g
1fc0: 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e  iven onto the en
1fd0: 64 20 6f 66 20 74 68 65 20 70 50 61 72 73 65 20  d of the pParse 
1fe0: 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65  context.** curre
1ff0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
2000: 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74  ruction.  When t
2010: 68 65 20 70 61 72 73 65 72 20 69 73 20 72 75 6e  he parser is run
2020: 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20   recursively.** 
2030: 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 66 69  this way, the fi
2040: 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e  nal OP_Halt is n
2050: 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20  ot appended and 
2060: 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61  other initializa
2070: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61  tion.** and fina
2080: 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61  lization steps a
2090: 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75  re omitted becau
20a0: 73 65 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e  se those are han
20b0: 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20  dling by the.** 
20c0: 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72  outermost parser
20d0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72  ..**.** Not ever
20e0: 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62  ything is nestab
20f0: 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69  le.  This facili
2100: 74 79 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  ty is designed t
2110: 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45  o permit.** INSE
2120: 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20  RT, UPDATE, and 
2130: 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
2140: 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45  s against SQLITE
2150: 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a  _MASTER.  Use.**
2160: 20 63 61 72 65 20 69 66 20 79 6f 75 20 64 65 63   care if you dec
2170: 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73  ide to try to us
2180: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  e this routine f
2190: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
21a0: 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  rposes..*/.void 
21b0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
21c0: 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
21d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
21e0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
21f0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
2200: 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20  r *zSql;.  char 
2210: 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
2220: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
2230: 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65 66 69  arse->db;.# defi
2240: 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69 7a  ne SAVE_SZ  (siz
2250: 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66 66  eof(Parse) - off
2260: 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61 72  setof(Parse,nVar
2270: 29 29 0a 20 20 63 68 61 72 20 73 61 76 65 42 75  )).  char saveBu
2280: 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69  f[SAVE_SZ];..  i
2290: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
22a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
22b0: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  rt( pParse->nest
22c0: 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73  ed<10 );  /* Nes
22d0: 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  ting should only
22e0: 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20 64   be of limited d
22f0: 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61  epth */.  va_sta
2300: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
2310: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
2320: 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 46  3VMPrintf(db, zF
2330: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
2340: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20  _end(ap);.  if( 
2350: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  zSql==0 ){.    r
2360: 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61  eturn;   /* A ma
2370: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
2380: 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70  ailed */.  }.  p
2390: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b  Parse->nested++;
23a0: 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75  .  memcpy(saveBu
23b0: 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72  f, &pParse->nVar
23c0: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65  , SAVE_SZ);.  me
23d0: 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56  mset(&pParse->nV
23e0: 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b  ar, 0, SAVE_SZ);
23f0: 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72  .  sqlite3RunPar
2400: 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c  ser(pParse, zSql
2410: 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  , &zErrMsg);.  s
2420: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2430: 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c   zErrMsg);.  sql
2440: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
2450: 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  Sql);.  memcpy(&
2460: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61  pParse->nVar, sa
2470: 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b  veBuf, SAVE_SZ);
2480: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  .  pParse->neste
2490: 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  d--;.}..#if SQLI
24a0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
24b0: 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52 65 74  CATION./*.** Ret
24c0: 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54 61 62  urn TRUE if zTab
24d0: 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  le is the name o
24e0: 66 20 74 68 65 20 73 79 73 74 65 6d 20 74 61 62  f the system tab
24f0: 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  le that stores t
2500: 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 75 73  he.** list of us
2510: 65 72 73 20 61 6e 64 20 74 68 65 69 72 20 61 63  ers and their ac
2520: 63 65 73 73 20 63 72 65 64 65 6e 74 69 61 6c 73  cess credentials
2530: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2540: 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 63 6f  UserAuthTable(co
2550: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
2560: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
2570: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54 61 62  te3_stricmp(zTab
2580: 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73 65 72  le, "sqlite_user
2590: 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ")==0;.}.#endif.
25a0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
25b0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
25c0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
25d0: 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  ibes a particula
25e0: 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61  r database.** ta
25f0: 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61  ble given the na
2600: 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  me of that table
2610: 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79   and (optionally
2620: 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  ) the name of th
2630: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
2640: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
2650: 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  le.  Return NULL
2660: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
2670: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
2680: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
2690: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
26a0: 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ed for the table
26b0: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73   and the.** firs
26c0: 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65  t matching table
26d0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
26e0: 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  No checking for 
26f0: 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a  duplicate table.
2700: 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ** names is done
2710: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
2720: 72 64 65 72 20 69 73 20 54 45 4d 50 20 66 69 72  rder is TEMP fir
2730: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
2740: 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c  hen any.** auxil
2750: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
2760: 64 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 41  dded using the A
2770: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
2780: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
2790: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
27a0: 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ()..*/.Table *sq
27b0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73  lite3FindTable(s
27c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
27d0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
27e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61  onst char *zData
27f0: 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  base){.  Table *
2800: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  p = 0;.  int i;.
2810: 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21    assert( zName!
2820: 3d 30 20 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d  =0 );.  /* All m
2830: 75 74 65 78 65 73 20 61 72 65 20 72 65 71 75 69  utexes are requi
2840: 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61  red for schema a
2850: 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72  ccess.  Make sur
2860: 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20  e we hold them. 
2870: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44 61  */.  assert( zDa
2880: 74 61 62 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c  tabase!=0 || sql
2890: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
28a0: 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a  lMutexes(db) );.
28b0: 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
28c0: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
28d0: 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 61 64 6d   /* Only the adm
28e0: 69 6e 20 75 73 65 72 20 69 73 20 61 6c 6c 6f 77  in user is allow
28f0: 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20  ed to know that 
2900: 74 68 65 20 73 71 6c 69 74 65 5f 75 73 65 72 20  the sqlite_user 
2910: 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78 69 73 74  table.  ** exist
2920: 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61  s */.  if( db->a
2930: 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41  uth.authLevel<UA
2940: 55 54 48 5f 41 64 6d 69 6e 20 26 26 20 73 71 6c  UTH_Admin && sql
2950: 69 74 65 33 55 73 65 72 41 75 74 68 54 61 62 6c  ite3UserAuthTabl
2960: 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  e(zName)!=0 ){. 
2970: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2980: 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d  .#endif.  for(i=
2990: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
29a0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
29b0: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
29c0: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20  ? i^1 : i;   /* 
29d0: 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f  Search TEMP befo
29e0: 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69  re MAIN */.    i
29f0: 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20  f( zDatabase!=0 
2a00: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2a10: 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d  p(zDatabase, db-
2a20: 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29  >aDb[j].zName) )
2a30: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
2a40: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
2a50: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
2a60: 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  , j, 0) );.    p
2a70: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
2a80: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70  nd(&db->aDb[j].p
2a90: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
2aa0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   zName);.    if(
2ab0: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
2ac0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
2ad0: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2ae0: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
2af0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2b00: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
2b10: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
2b20: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
2b30: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
2b40: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
2b50: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
2b60: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
2b70: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
2b80: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
2b90: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c  f not found.  Al
2ba0: 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65  so leave an.** e
2bb0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
2bc0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
2bd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
2be0: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
2bf0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73  is routine and s
2c00: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2c10: 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
2c20: 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73  * routine leaves
2c30: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2c40: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2c50: 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71  rMsg where.** sq
2c60: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29  lite3FindTable()
2c70: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61   does not..*/.Ta
2c80: 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  ble *sqlite3Loca
2c90: 74 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  teTable(.  Parse
2ca0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2cb0: 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20    /* context in 
2cc0: 77 68 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20  which to report 
2cd0: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
2ce0: 69 73 56 69 65 77 2c 20 20 20 20 20 20 20 20 20  isView,         
2cf0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f     /* True if lo
2d00: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 56 49 45 57  oking for a VIEW
2d10: 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 54   rather than a T
2d20: 41 42 4c 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ABLE */.  const 
2d30: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
2d40: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2d50: 74 61 62 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f  table we are loo
2d60: 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f  king for */.  co
2d70: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65  nst char *zDbase
2d80: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2d90: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d  the database.  M
2da0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
2db0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a  ){.  Table *p;..
2dc0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
2dd0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
2de0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2df0: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
2e00: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
2e10: 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
2e20: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
2e30: 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
2e40: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
2e50: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
2e60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
2e70: 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  ;.  }..  p = sql
2e80: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
2e90: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
2ea0: 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20   zDbase);.  if( 
2eb0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  p==0 ){.    cons
2ec0: 74 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 69  t char *zMsg = i
2ed0: 73 56 69 65 77 20 3f 20 22 6e 6f 20 73 75 63 68  sView ? "no such
2ee0: 20 76 69 65 77 22 20 3a 20 22 6e 6f 20 73 75 63   view" : "no suc
2ef0: 68 20 74 61 62 6c 65 22 3b 0a 20 20 20 20 69 66  h table";.    if
2f00: 28 20 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20  ( zDbase ){.    
2f10: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2f20: 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25  g(pParse, "%s: %
2f30: 73 2e 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62  s.%s", zMsg, zDb
2f40: 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ase, zName);.   
2f50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2f60: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
2f70: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20  arse, "%s: %s", 
2f80: 7a 4d 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  zMsg, zName);.  
2f90: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
2fa0: 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
2fb0: 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
2fc0: 55 53 45 52 5f 41 55 54 48 45 4e 49 43 41 54 49  USER_AUTHENICATI
2fd0: 4f 4e 0a 20 20 65 6c 73 65 20 69 66 28 20 70 50  ON.  else if( pP
2fe0: 61 72 73 65 2d 3e 64 62 2d 3e 61 75 74 68 2e 61  arse->db->auth.a
2ff0: 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55  uthLevel<UAUTH_U
3000: 73 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ser ){.    sqlit
3010: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
3020: 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61 75 74  e, "user not aut
3030: 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a 20 20  henticated");.  
3040: 20 20 70 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e    p = 0;.  }.#en
3050: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  dif.  return p;.
3060: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
3070: 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69  the table identi
3080: 66 69 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a  fied by *p..**.*
3090: 2a 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70  * This is a wrap
30a0: 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
30b0: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e  e3LocateTable().
30c0: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
30d0: 62 65 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74  between.** sqlit
30e0: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20  e3LocateTable() 
30f0: 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
3100: 6e 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  n is that this f
3110: 75 6e 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74  unction restrict
3120: 73 0a 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20  s.** the search 
3130: 74 6f 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53  to schema (p->pS
3140: 63 68 65 6d 61 29 20 69 66 20 69 74 20 69 73 20  chema) if it is 
3150: 6e 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63  not NULL. p->pSc
3160: 68 65 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e  hema may be.** n
3170: 6f 6e 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73  on-NULL if it is
3180: 20 70 61 72 74 20 6f 66 20 61 20 76 69 65 77 20   part of a view 
3190: 6f 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  or trigger progr
31a0: 61 6d 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53  am definition. S
31b0: 65 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78  ee.** sqlite3Fix
31c0: 53 72 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65  SrcList() for de
31d0: 74 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20  tails..*/.Table 
31e0: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
31f0: 62 6c 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65  bleItem(.  Parse
3200: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 69 6e 74   *pParse, .  int
3210: 20 69 73 56 69 65 77 2c 20 0a 20 20 73 74 72 75   isView, .  stru
3220: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
3230: 2a 70 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  *p.){.  const ch
3240: 61 72 20 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72  ar *zDb;.  asser
3250: 74 28 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30  t( p->pSchema==0
3260: 20 7c 7c 20 70 2d 3e 7a 44 61 74 61 62 61 73 65   || p->zDatabase
3270: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
3280: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69  pSchema ){.    i
3290: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
32a0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
32b0: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63  arse->db, p->pSc
32c0: 68 65 6d 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d  hema);.    zDb =
32d0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
32e0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d  [iDb].zName;.  }
32f0: 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20  else{.    zDb = 
3300: 70 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20  p->zDatabase;.  
3310: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
3320: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
3330: 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20 70 2d  arse, isView, p-
3340: 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a  >zName, zDb);.}.
3350: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
3360: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
3370: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
3380: 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69  ibes .** a parti
3390: 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65  cular index give
33a0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
33b0: 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  at index.** and 
33c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
33d0: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f  database that co
33e0: 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78  ntains the index
33f0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ..** Return NULL
3400: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
3410: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
3420: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
3430: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
3440: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61  ed for the.** ta
3450: 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73  ble and the firs
3460: 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78  t matching index
3470: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
3480: 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66  No checking.** f
3490: 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64  or duplicate ind
34a0: 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ex names is done
34b0: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
34c0: 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20  rder is.** TEMP 
34d0: 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e  first, then MAIN
34e0: 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c  , then any auxil
34f0: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
3500: 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68  dded.** using th
3510: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
3520: 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ..*/.Index *sqli
3530: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c  te3FindIndex(sql
3540: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
3550: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
3560: 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
3570: 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20   Index *p = 0;. 
3580: 20 69 6e 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c   int i;.  /* All
3590: 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71   mutexes are req
35a0: 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61  uired for schema
35b0: 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73   access.  Make s
35c0: 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d  ure we hold them
35d0: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  . */.  assert( z
35e0: 44 62 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  Db!=0 || sqlite3
35f0: 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
3600: 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66 6f  exes(db) );.  fo
3610: 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b  r(i=OMIT_TEMPDB;
3620: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
3630: 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69  {.    int j = (i
3640: 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20  <2) ? i^1 : i;  
3650: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
3660: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
3670: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
3680: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70  a = db->aDb[j].p
3690: 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65  Schema;.    asse
36a0: 72 74 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20  rt( pSchema );. 
36b0: 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71     if( zDb && sq
36c0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62  lite3StrICmp(zDb
36d0: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  , db->aDb[j].zNa
36e0: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
36f0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
3700: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
3710: 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a  ld(db, j, 0) );.
3720: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
3730: 61 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61  ashFind(&pSchema
3740: 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65  ->idxHash, zName
3750: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62  );.    if( p ) b
3760: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
3770: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn p;.}../*.** R
3780: 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72  eclaim the memor
3790: 79 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64  y used by an ind
37a0: 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ex.*/.static voi
37b0: 64 20 66 72 65 65 49 6e 64 65 78 28 73 71 6c 69  d freeIndex(sqli
37c0: 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  te3 *db, Index *
37d0: 70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p){.#ifndef SQLI
37e0: 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a  TE_OMIT_ANALYZE.
37f0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49    sqlite3DeleteI
3800: 6e 64 65 78 53 61 6d 70 6c 65 73 28 64 62 2c 20  ndexSamples(db, 
3810: 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  p);.#endif.  if(
3820: 20 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e   db==0 || db->pn
3830: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
3840: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
3850: 72 65 66 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 29  ref(p->pKeyInfo)
3860: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
3870: 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61  elete(db, p->pPa
3880: 72 74 49 64 78 57 68 65 72 65 29 3b 0a 20 20 73  rtIdxWhere);.  s
3890: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
38a0: 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20   p->zColAff);.  
38b0: 69 66 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64  if( p->isResized
38c0: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
38d0: 28 64 62 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 29 3b  (db, p->azColl);
38e0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
38f0: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
3900: 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20  * For the index 
3910: 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20  called zIdxName 
3920: 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69  which is found i
3930: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
3940: 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68  Db,.** unlike th
3950: 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74  at index from it
3960: 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d  s Table then rem
3970: 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72  ove the index fr
3980: 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  om.** the index 
3990: 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66  hash table and f
39a0: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73  ree all memory s
39b0: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
39c0: 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  ated.** with the
39d0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   index..*/.void 
39e0: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
39f0: 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69  DeleteIndex(sqli
3a00: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
3a10: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  , const char *zI
3a20: 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  dxName){.  Index
3a30: 20 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68   *pIndex;.  Hash
3a40: 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65   *pHash;..  asse
3a50: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3a60: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3a70: 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73  Db, 0) );.  pHas
3a80: 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  h = &db->aDb[iDb
3a90: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ].pSchema->idxHa
3aa0: 73 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  sh;.  pIndex = s
3ab0: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
3ac0: 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65  (pHash, zIdxName
3ad0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  , 0);.  if( ALWA
3ae0: 59 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  YS(pIndex) ){.  
3af0: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54    if( pIndex->pT
3b00: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49  able->pIndex==pI
3b10: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49  ndex ){.      pI
3b20: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
3b30: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70  ndex = pIndex->p
3b40: 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
3b50: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  .      Index *p;
3b60: 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66  .      /* Justif
3b70: 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59  ication of ALWAY
3b80: 53 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20  S();  The index 
3b90: 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c  must be on the l
3ba0: 69 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ist of.      ** 
3bb0: 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20  indices. */.    
3bc0: 20 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54    p = pIndex->pT
3bd0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  able->pIndex;.  
3be0: 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
3bf0: 53 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74  S(p) && p->pNext
3c00: 21 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20  !=pIndex ){ p = 
3c10: 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20  p->pNext; }.    
3c20: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 20 26    if( ALWAYS(p &
3c30: 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64  & p->pNext==pInd
3c40: 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ex) ){.        p
3c50: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
3c60: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
3c70: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49  .    }.    freeI
3c80: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
3c90: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  ;.  }.  db->flag
3ca0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
3cb0: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
3cc0: 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68  .** Look through
3cd0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65   the list of ope
3ce0: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  n database files
3cf0: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e   in db->aDb[] an
3d00: 64 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65  d if.** any have
3d10: 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65   been closed, re
3d20: 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74  move them from t
3d30: 68 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f  he list.  Reallo
3d40: 63 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e  cate the.** db->
3d50: 61 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20  aDb[] structure 
3d60: 74 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a  to a smaller siz
3d70: 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a  e, if possible..
3d80: 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74  **.** Entry 0 (t
3d90: 68 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61  he "main" databa
3da0: 73 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20  se) and entry 1 
3db0: 28 74 68 65 20 22 74 65 6d 70 22 20 64 61 74 61  (the "temp" data
3dc0: 62 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76  base).** are nev
3dd0: 65 72 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f  er candidates fo
3de0: 72 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65  r being collapse
3df0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
3e00: 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61  e3CollapseDataba
3e10: 73 65 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  seArray(sqlite3 
3e20: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  *db){.  int i, j
3e30: 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69  ;.  for(i=j=2; i
3e40: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
3e50: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
3e60: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
3e70: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
3e80: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Bt==0 ){.      s
3e90: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3ea0: 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20   pDb->zName);.  
3eb0: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d      pDb->zName =
3ec0: 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
3ed0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
3ee0: 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64  ( j<i ){.      d
3ef0: 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e  b->aDb[j] = db->
3f00: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aDb[i];.    }.  
3f10: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d    j++;.  }.  mem
3f20: 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c  set(&db->aDb[j],
3f30: 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a   0, (db->nDb-j)*
3f40: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a  sizeof(db->aDb[j
3f50: 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  ]));.  db->nDb =
3f60: 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44   j;.  if( db->nD
3f70: 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21  b<=2 && db->aDb!
3f80: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
3f90: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d  {.    memcpy(db-
3fa0: 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e  >aDbStatic, db->
3fb0: 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62  aDb, 2*sizeof(db
3fc0: 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20  ->aDb[0]));.    
3fd0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3fe0: 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20  , db->aDb);.    
3ff0: 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
4000: 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a  bStatic;.  }.}..
4010: 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20  /*.** Reset the 
4020: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20 64  schema for the d
4030: 61 74 61 62 61 73 65 20 61 74 20 69 6e 64 65 78  atabase at index
4040: 20 69 44 62 2e 20 20 41 6c 73 6f 20 72 65 73 65   iDb.  Also rese
4050: 74 20 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73 63  t the.** TEMP sc
4060: 68 65 6d 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hema..*/.void sq
4070: 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68  lite3ResetOneSch
4080: 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ema(sqlite3 *db,
4090: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 44 62 20   int iDb){.  Db 
40a0: 2a 70 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  *pDb;.  assert( 
40b0: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  iDb<db->nDb );..
40c0: 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 52 65    /* Case 1:  Re
40d0: 73 65 74 20 74 68 65 20 73 69 6e 67 6c 65 20 73  set the single s
40e0: 63 68 65 6d 61 20 69 64 65 6e 74 69 66 69 65 64  chema identified
40f0: 20 62 79 20 69 44 62 20 2a 2f 0a 20 20 70 44 62   by iDb */.  pDb
4100: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
4110: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4120: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
4130: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
4140: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 2d  ;.  assert( pDb-
4150: 3e 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20  >pSchema!=0 );. 
4160: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
4170: 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61  ear(pDb->pSchema
4180: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20  );..  /* If any 
4190: 64 61 74 61 62 61 73 65 20 6f 74 68 65 72 20 74  database other t
41a0: 68 61 6e 20 54 45 4d 50 20 69 73 20 72 65 73 65  han TEMP is rese
41b0: 74 2c 20 74 68 65 6e 20 61 6c 73 6f 20 72 65 73  t, then also res
41c0: 65 74 20 54 45 4d 50 0a 20 20 2a 2a 20 73 69 6e  et TEMP.  ** sin
41d0: 63 65 20 54 45 4d 50 20 6d 69 67 68 74 20 62 65  ce TEMP might be
41e0: 20 68 6f 6c 64 69 6e 67 20 74 72 69 67 67 65 72   holding trigger
41f0: 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  s that reference
4200: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20   tables in the. 
4210: 20 2a 2a 20 6f 74 68 65 72 20 64 61 74 61 62 61   ** other databa
4220: 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  se..  */.  if( i
4230: 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 70 44 62  Db!=1 ){.    pDb
4240: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 31 5d 3b 0a   = &db->aDb[1];.
4250: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 2d      assert( pDb-
4260: 3e 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20  >pSchema!=0 );. 
4270: 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61     sqlite3Schema
4280: 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65  Clear(pDb->pSche
4290: 6d 61 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ma);.  }.  retur
42a0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73  n;.}../*.** Eras
42b0: 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66  e all schema inf
42c0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c  ormation from al
42d0: 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
42e0: 61 73 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a  ases (including.
42f0: 2a 2a 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74  ** "main" and "t
4300: 65 6d 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67  emp") for a sing
4310: 6c 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  le database conn
4320: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
4330: 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53  sqlite3ResetAllS
4340: 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69  chemasOfConnecti
4350: 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  on(sqlite3 *db){
4360: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
4370: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
4380: 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  (db);.  for(i=0;
4390: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
43a0: 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  {.    Db *pDb = 
43b0: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
43c0: 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
43d0: 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  a ){.      sqlit
43e0: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44  e3SchemaClear(pD
43f0: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
4400: 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61   }.  }.  db->fla
4410: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
4420: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73  ternChanges;.  s
4430: 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b  qlite3VtabUnlock
4440: 4c 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69  List(db);.  sqli
4450: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
4460: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  (db);.  sqlite3C
4470: 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65 41  ollapseDatabaseA
4480: 72 72 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a  rray(db);.}../*.
4490: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
44a0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
44b0: 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a   commit occurs..
44c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
44d0: 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61  ommitInternalCha
44e0: 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
44f0: 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26  ){.  db->flags &
4500: 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  = ~SQLITE_Intern
4510: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
4520: 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20  * Delete memory 
4530: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
4540: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f  e column names o
4550: 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  f a table or vie
4560: 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e  w (the.** Table.
4570: 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a  aCol[] array)..*
4580: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
4590: 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  liteDeleteColumn
45a0: 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64  Names(sqlite3 *d
45b0: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
45c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  ){.  int i;.  Co
45d0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73  lumn *pCol;.  as
45e0: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
45f0: 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d  );.  if( (pCol =
4600: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d   pTable->aCol)!=
4610: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
4620: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
4630: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
4640: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4650: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
4660: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
4670: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
4680: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
4690: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
46a0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44  ree(db, pCol->zD
46b0: 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  flt);.      sqli
46c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
46d0: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20  ol->zType);.    
46e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
46f0: 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29  db, pCol->zColl)
4700: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
4710: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
4720: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
4730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
4740: 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61   the memory data
4750: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
4760: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
4770: 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20  given.** Table. 
4780: 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
4790: 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20  made to disk by 
47a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
47b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
47c0: 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68   just deletes th
47d0: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
47e0: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75  .  It does not u
47f0: 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62  nlink.** the tab
4800: 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  le data structur
4810: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
4820: 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64  table.  But it d
4830: 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d  oes destroy.** m
4840: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
4850: 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20   of the indices 
4860: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
4870: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4880: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a   .** the table..
4890: 2a 2a 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72  **.** The db par
48a0: 61 6d 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e  ameter is option
48b0: 61 6c 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65  al.  It is neede
48c0: 64 20 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f  d if the Table o
48d0: 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69  bject .** contai
48e0: 6e 73 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  ns lookaside mem
48f0: 6f 72 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a  ory.  (Table obj
4900: 65 63 74 73 20 69 6e 20 74 68 65 20 73 63 68 65  ects in the sche
4910: 6d 61 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a  ma do not use.**
4920: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
4930: 79 2c 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65  y, but some ephe
4940: 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65  meral Table obje
4950: 63 74 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65  cts do.)  Or the
4960: 0a 2a 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72  .** db parameter
4970: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
4980: 68 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  h db->pnBytesFre
4990: 65 64 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68  ed to measure th
49a0: 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64  e memory.** used
49b0: 20 62 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62   by the Table ob
49c0: 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ject..*/.void sq
49d0: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
49e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
49f0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
4a00: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a  Index *pIndex, *
4a10: 70 4e 65 78 74 3b 0a 20 20 54 45 53 54 4f 4e 4c  pNext;.  TESTONL
4a20: 59 28 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64  Y( int nLookasid
4a30: 65 3b 20 29 20 2f 2a 20 55 73 65 64 20 74 6f 20  e; ) /* Used to 
4a40: 76 65 72 69 66 79 20 6c 6f 6f 6b 61 73 69 64 65  verify lookaside
4a50: 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 20 73 63   not used for sc
4a60: 68 65 6d 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72  hema */..  asser
4a70: 74 28 20 21 70 54 61 62 6c 65 20 7c 7c 20 70 54  t( !pTable || pT
4a80: 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  able->nRef>0 );.
4a90: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c  .  /* Do not del
4aa0: 65 74 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e  ete the table un
4ab0: 74 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63  til the referenc
4ac0: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  e count reaches 
4ad0: 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 21  zero. */.  if( !
4ae0: 70 54 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b  pTable ) return;
4af0: 0a 20 20 69 66 28 20 28 28 21 64 62 20 7c 7c 20  .  if( ((!db || 
4b00: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
4b10: 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54 61 62 6c  ==0) && (--pTabl
4b20: 65 2d 3e 6e 52 65 66 29 3e 30 29 20 29 20 72 65  e->nRef)>0) ) re
4b30: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f  turn;..  /* Reco
4b40: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rd the number of
4b50: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f   outstanding loo
4b60: 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f  kaside allocatio
4b70: 6e 73 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62  ns in schema Tab
4b80: 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74  les.  ** prior t
4b90: 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65  o doing any free
4ba0: 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20  () operations.  
4bb0: 53 69 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62  Since schema Tab
4bc0: 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20  les do not use. 
4bd0: 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74   ** lookaside, t
4be0: 68 69 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c  his number shoul
4bf0: 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f  d not change. */
4c00: 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 6e 4c 6f  .  TESTONLY( nLo
4c10: 6f 6b 61 73 69 64 65 20 3d 20 28 64 62 20 26 26  okaside = (db &&
4c20: 20 28 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61   (pTable->tabFla
4c30: 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
4c40: 6c 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20  l)==0) ?.       
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c60: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4c70: 6e 4f 75 74 20 3a 20 30 20 29 3b 0a 0a 20 20 2f  nOut : 0 );..  /
4c80: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64  * Delete all ind
4c90: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
4ca0: 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e  with this table.
4cb0: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78   */.  for(pIndex
4cc0: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65   = pTable->pInde
4cd0: 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
4ce0: 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  x=pNext){.    pN
4cf0: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
4d00: 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ext;.    assert(
4d10: 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
4d20: 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d  ==pTable->pSchem
4d30: 61 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62  a );.    if( !db
4d40: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
4d50: 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  reed==0 ){.     
4d60: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
4d70: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20  Index->zName; . 
4d80: 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20       TESTONLY ( 
4d90: 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20  Index *pOld = ) 
4da0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
4db0: 74 28 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e  t(.         &pIn
4dc0: 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  dex->pSchema->id
4dd0: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a  xHash, zName, 0.
4de0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
4df0: 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20  ssert( db==0 || 
4e00: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
4e10: 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
4e20: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
4e30: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4e40: 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20  pOld==pIndex || 
4e50: 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  pOld==0 );.    }
4e60: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
4e70: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
4e80: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
4e90: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74   foreign keys at
4ea0: 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74  tached to this t
4eb0: 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  able. */.  sqlit
4ec0: 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70  e3FkDelete(db, p
4ed0: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65  Table);..  /* De
4ee0: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
4ef0: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
4f00: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 44 65  .  */.  sqliteDe
4f10: 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
4f20: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73  db, pTable);.  s
4f30: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4f40: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
4f50: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4f60: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f  (db, pTable->zCo
4f70: 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  lAff);.  sqlite3
4f80: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
4f90: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
4fa0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
4fb0: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73  E_OMIT_CHECK.  s
4fc0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
4fd0: 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  lete(db, pTable-
4fe0: 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66  >pCheck);.#endif
4ff0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5000: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
5010: 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43  E.  sqlite3VtabC
5020: 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29  lear(db, pTable)
5030: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
5040: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
5050: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  ble);..  /* Veri
5060: 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  fy that no looka
5070: 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20  side memory was 
5080: 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74  used by schema t
5090: 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  ables */.  asser
50a0: 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30  t( nLookaside==0
50b0: 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d   || nLookaside==
50c0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
50d0: 75 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ut );.}../*.** U
50e0: 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20  nlink the given 
50f0: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68  table from the h
5100: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
5110: 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  he delete the.**
5120: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
5130: 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e   with all its in
5140: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
5150: 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20  n keys..*/.void 
5160: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
5170: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
5180: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
5190: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
51a0: 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  abName){.  Table
51b0: 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a   *p;.  Db *pDb;.
51c0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
51d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
51e0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
51f0: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
5200: 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61   zTabName );.  a
5210: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
5220: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
5230: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 74  , iDb, 0) );.  t
5240: 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d  estcase( zTabNam
5250: 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a  e[0]==0 );  /* Z
5260: 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65  ero-length table
5270: 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77   names are allow
5280: 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64  ed */.  pDb = &d
5290: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
52a0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
52b0: 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65  sert(&pDb->pSche
52c0: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61  ma->tblHash, zTa
52d0: 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c  bName, 0);.  sql
52e0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
52f0: 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 66 6c  db, p);.  db->fl
5300: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
5310: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
5320: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f  /*.** Given a to
5330: 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74  ken, return a st
5340: 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73  ring that consis
5350: 74 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f  ts of the text o
5360: 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e  f that.** token.
5370: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
5380: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
5390: 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e  ing.** is obtain
53a0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
53b0: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
53c0: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
53d0: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
53e0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71  ion..**.** Any q
53f0: 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28  uotation marks (
5400: 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61  ex:  "name", 'na
5410: 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20  me', [name], or 
5420: 60 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20  `name`) that.** 
5430: 73 75 72 72 6f 75 6e 64 20 74 68 65 20 62 6f 64  surround the bod
5440: 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 61  y of the token a
5450: 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a  re removed..**.*
5460: 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74  * Tokens are oft
5470: 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73  en just pointers
5480: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
5490: 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20  al SQL text and 
54a0: 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30  so.** are not \0
54b0: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
54c0: 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73  d are not persis
54d0: 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72  tent.  The retur
54e0: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
54f0: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
5500: 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65   and is persiste
5510: 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nt..*/.char *sql
5520: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
5530: 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  n(sqlite3 *db, T
5540: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
5550: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
5560: 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
5570: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
5580: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68  bStrNDup(db, (ch
5590: 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  ar*)pName->z, pN
55a0: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c  ame->n);.    sql
55b0: 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d  ite3Dequote(zNam
55c0: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
55d0: 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a   zName = 0;.  }.
55e0: 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
55f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
5600: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
5610: 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20  table stored in 
5620: 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
5630: 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69  iDb for.** writi
5640: 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73  ng. The table is
5650: 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75   opened using cu
5660: 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  rsor 0..*/.void 
5670: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
5680: 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c  rTable(Parse *p,
5690: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
56a0: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
56b0: 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69  tVdbe(p);.  sqli
56c0: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  te3TableLock(p, 
56d0: 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  iDb, MASTER_ROOT
56e0: 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  , 1, SCHEMA_TABL
56f0: 45 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69 74  E(iDb));.  sqlit
5700: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
5710: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
5720: 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c   0, MASTER_ROOT,
5730: 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20   iDb, 5);.  if( 
5740: 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20  p->nTab==0 ){.  
5750: 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20    p->nTab = 1;. 
5760: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61   }.}../*.** Para
5770: 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e  meter zName poin
5780: 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d  ts to a nul-term
5790: 69 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f  inated buffer co
57a0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
57b0: 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61  e.** of a databa
57c0: 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d  se ("main", "tem
57d0: 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f  p" or the name o
57e0: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62  f an attached db
57f0: 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
5800: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
5810: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
5820: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
5830: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20  b->aDb[], or.** 
5840: 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  -1 if the named 
5850: 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  db cannot be fou
5860: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
5870: 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c  e3FindDbName(sql
5880: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
5890: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
58a0: 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20  int i = -1;     
58b0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
58c0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20  number */.  if( 
58d0: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20  zName ){.    Db 
58e0: 2a 70 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20  *pDb;.    int n 
58f0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
5900: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  0(zName);.    fo
5910: 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c  r(i=(db->nDb-1),
5920: 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d   pDb=&db->aDb[i]
5930: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62  ; i>=0; i--, pDb
5940: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  --){.      if( (
5950: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20  !OMIT_TEMPDB || 
5960: 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73 71 6c  i!=1 ) && n==sql
5970: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62  ite3Strlen30(pDb
5980: 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20  ->zName) && .   
5990: 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65         0==sqlite
59a0: 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e  3StrICmp(pDb->zN
59b0: 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  ame, zName) ){. 
59c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
59d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
59e0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
59f0: 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a  *.** The token *
5a00: 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74  pName contains t
5a10: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
5a20: 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d  abase (either "m
5a30: 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70  ain" or.** "temp
5a40: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
5a50: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
5a60: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
5a70: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e  eturns the.** in
5a80: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
5a90: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
5aa0: 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66  >aDb[], or -1 if
5ab0: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a   the named db .*
5ac0: 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
5ad0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5ae0: 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a  FindDb(sqlite3 *
5af0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
5b00: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
5b30: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
5b40: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
5b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b60: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 77         /* Name w
5b70: 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67 20  e are searching 
5b80: 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d  for */.  zName =
5b90: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
5ba0: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
5bb0: 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 46  ;.  i = sqlite3F
5bc0: 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e  indDbName(db, zN
5bd0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
5be0: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
5bf0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  ;.  return i;.}.
5c00: 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72  ./* The table or
5c10: 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72   view or trigger
5c20: 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64 20   name is passed 
5c30: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
5c40: 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e  via tokens.** pN
5c50: 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e  ame1 and pName2.
5c60: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61   If the table na
5c70: 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61  me was fully qua
5c80: 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d  lified, for exam
5c90: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ple:.**.** CREAT
5ca0: 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20  E TABLE xxx.yyy 
5cb0: 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68  (...);.** .** Th
5cc0: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
5cd0: 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e   to "xxx" and pN
5ce0: 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74  ame2 "yyy". On t
5cf0: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66  he other hand if
5d00: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61  .** the table na
5d10: 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20  me is not fully 
5d20: 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a  qualified, i.e.:
5d30: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
5d40: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a  BLE yyy(...);.**
5d50: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
5d60: 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20  is set to "yyy" 
5d70: 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22  and pName2 is ""
5d80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5d90: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70  tine sets the *p
5da0: 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20  pUnqual pointer 
5db0: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
5dc0: 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72  token (pName1 or
5dd0: 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74  .** pName2) that
5de0: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
5df0: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
5e00: 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f  me.  The index o
5e10: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
5e20: 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75 72  e "xxx" is retur
5e30: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
5e40: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a  te3TwoPartName(.
5e50: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5e60: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
5e70: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
5e80: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
5e90: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
5ea0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78        /* The "xx
5eb0: 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22  x" in the name "
5ec0: 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78  xxx.yyy" or "xxx
5ed0: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  " */.  Token *pN
5ee0: 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame2,      /* Th
5ef0: 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e  e "yyy" in the n
5f00: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f  ame "xxx.yyy" */
5f10: 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75  .  Token **pUnqu
5f20: 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  al     /* Write 
5f30: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
5f40: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65  object name here
5f50: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62   */.){.  int iDb
5f60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5f70: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
5f80: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a   holding the obj
5f90: 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
5fa0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
5fb0: 62 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53  b;..  if( ALWAYS
5fc0: 28 70 4e 61 6d 65 32 21 3d 30 29 20 26 26 20 70  (pName2!=0) && p
5fd0: 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20  Name2->n>0 ){.  
5fe0: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
5ff0: 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20 73 71  usy ) {.      sq
6000: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6010: 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20 64  arse, "corrupt d
6020: 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20  atabase");.     
6030: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
6040: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
6050: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e  ;.    }.    *pUn
6060: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20  qual = pName2;. 
6070: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
6080: 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65  FindDb(db, pName
6090: 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  1);.    if( iDb<
60a0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
60b0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
60c0: 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  e, "unknown data
60d0: 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31  base %T", pName1
60e0: 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
60f0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
6100: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
6110: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
6120: 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44  ert( db->init.iD
6130: 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74  b==0 || db->init
6140: 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62  .busy );.    iDb
6150: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b   = db->init.iDb;
6160: 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20  .    *pUnqual = 
6170: 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65  pName1;.  }.  re
6180: 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a  turn iDb;.}../*.
6190: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
61a0: 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b  is used to check
61b0: 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74   if the UTF-8 st
61c0: 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20  ring zName is a 
61d0: 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69  legal.** unquali
61e0: 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20  fied name for a 
61f0: 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63  new schema objec
6200: 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c  t (table, index,
6210: 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67   view or.** trig
6220: 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20  ger). All names 
6230: 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74  are legal except
6240: 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69   those that begi
6250: 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e  n with the strin
6260: 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28  g.** "sqlite_" (
6270: 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20  in upper, lower 
6280: 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20  or mixed case). 
6290: 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20  This portion of 
62a0: 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  the namespace.**
62b0: 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72   is reserved for
62c0: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a   internal use..*
62d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
62e0: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72  ckObjectName(Par
62f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
6300: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
6310: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64    if( !pParse->d
6320: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
6330: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
6340: 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  0 .          && 
6350: 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61  (pParse->db->fla
6360: 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74  gs & SQLITE_Writ
6370: 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20  eSchema)==0.    
6380: 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69        && 0==sqli
6390: 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d  te3StrNICmp(zNam
63a0: 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29  e, "sqlite_", 7)
63b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
63c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
63d0: 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73  "object name res
63e0: 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e  erved for intern
63f0: 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61  al use: %s", zNa
6400: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
6410: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
6420: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
6430: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
6440: 65 74 75 72 6e 20 74 68 65 20 50 52 49 4d 41 52  eturn the PRIMAR
6450: 59 20 4b 45 59 20 69 6e 64 65 78 20 6f 66 20 61  Y KEY index of a
6460: 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20   table.*/.Index 
6470: 2a 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b  *sqlite3PrimaryK
6480: 65 79 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70  eyIndex(Table *p
6490: 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Tab){.  Index *p
64a0: 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e  ;.  for(p=pTab->
64b0: 70 49 6e 64 65 78 3b 20 70 20 26 26 20 21 49 73  pIndex; p && !Is
64c0: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
64d0: 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  p); p=p->pNext){
64e0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
64f0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
6500: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65  e column of inde
6510: 78 20 70 49 64 78 20 74 68 61 74 20 63 6f 72 72  x pIdx that corr
6520: 65 73 70 6f 6e 64 73 20 74 6f 20 74 61 62 6c 65  esponds to table
6530: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e  .** column iCol.
6540: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 6e    Return -1 if n
6550: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36  ot found..*/.i16
6560: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
6570: 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64  Index(Index *pId
6580: 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20  x, i16 iCol){.  
6590: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
65a0: 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; i<pIdx->nColum
65b0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  n; i++){.    if(
65c0: 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43   iCol==pIdx->aiC
65d0: 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72  olumn[i] ) retur
65e0: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
65f0: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n -1;.}../*.** B
6600: 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e  egin constructin
6610: 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65  g a new table re
6620: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20  presentation in 
6630: 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73  memory.  This is
6640: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66  .** the first of
6650: 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20   several action 
6660: 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65  routines that ge
6670: 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70  t called in resp
6680: 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45  onse.** to a CRE
6690: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
66a0: 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75  ent.  In particu
66b0: 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  lar, this routin
66c0: 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61  e is called.** a
66d0: 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65  fter seeing toke
66e0: 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20  ns "CREATE" and 
66f0: 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20  "TABLE" and the 
6700: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
6710: 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69  isTemp.** flag i
6720: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61  s true if the ta
6730: 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74  ble should be st
6740: 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69  ored in the auxi
6750: 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a  liary database.*
6760: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
6770: 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  f in the main da
6780: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
6790: 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74  is is normally t
67a0: 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20  he case.** when 
67b0: 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54  the "TEMP" or "T
67c0: 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72  EMPORARY" keywor
67d0: 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  d occurs in betw
67e0: 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e  een.** CREATE an
67f0: 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54  d TABLE..**.** T
6800: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
6810: 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ord is initializ
6820: 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50  ed and put in pP
6830: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e  arse->pNewTable.
6840: 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74  .** As more of t
6850: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
6860: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72  statement is par
6870: 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  sed, additional 
6880: 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e  action.** routin
6890: 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  es will be calle
68a0: 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e  d to add more in
68b0: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69  formation to thi
68c0: 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20  s record..** At 
68d0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
68e0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
68f0: 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74  ement, the sqlit
6900: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75  e3EndTable() rou
6910: 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tine.** is calle
6920: 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  d to complete th
6930: 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f  e construction o
6940: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
6950: 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20  record..*/.void 
6960: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
6970: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
6980: 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20  se,   /* Parser 
6990: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
69a0: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a  en *pName1,   /*
69b0: 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   First part of t
69c0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
69d0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a  able or view */.
69e0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
69f0: 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72     /* Second par
6a00: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
6a10: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
6a20: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
6a30: 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65  mp,      /* True
6a40: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45   if this is a TE
6a50: 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  MP table */.  in
6a60: 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f  t isView,      /
6a70: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
6a80: 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e  s a VIEW */.  in
6a90: 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f  t isVirtual,   /
6aa0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
6ab0: 73 20 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c  s a VIRTUAL tabl
6ac0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72  e */.  int noErr
6ad0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
6ae0: 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61  thing if table a
6af0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
6b00: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
6b10: 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  ble;.  char *zNa
6b20: 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e  me = 0; /* The n
6b30: 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ame of the new t
6b40: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
6b50: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
6b60: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  db;.  Vdbe *v;. 
6b70: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
6b80: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
6b90: 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74  mber to create t
6ba0: 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20  he table in */. 
6bb0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20   Token *pName;  
6bc0: 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64    /* Unqualified
6bd0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
6be0: 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a  le to create */.
6bf0: 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  .  /* The table 
6c00: 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20  or view name to 
6c10: 63 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64  create is passed
6c20: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
6c30: 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a   via tokens.  **
6c40: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
6c50: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
6c60: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
6c70: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
6c80: 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
6c90: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
6ca0: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20  xx.yyy (...);.  
6cb0: 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e  ** .  ** Then pN
6cc0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
6cd0: 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  xxx" and pName2 
6ce0: 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74  "yyy". On the ot
6cf0: 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a  her hand if.  **
6d00: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
6d10: 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61  is not fully qua
6d20: 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20  lified, i.e.:.  
6d30: 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54  **.  ** CREATE T
6d40: 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20  ABLE yyy(...);. 
6d50: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e   **.  ** Then pN
6d60: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
6d70: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
6d80: 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  is ""..  **.  **
6d90: 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20   The call below 
6da0: 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70  sets the pName p
6db0: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
6dc0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
6dd0: 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61  ame1 or.  ** pNa
6de0: 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73  me2) that stores
6df0: 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64   the unqualified
6e00: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65   table name. The
6e10: 20 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73   variable iDb is
6e20: 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65  .  ** set to the
6e30: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   index of the da
6e40: 74 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20  tabase that the 
6e50: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73  table or view is
6e60: 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61   to be.  ** crea
6e70: 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69  ted in..  */.  i
6e80: 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
6e90: 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
6ea0: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
6eb0: 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  &pName);.  if( i
6ec0: 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
6ed0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
6ee0: 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 70  B && isTemp && p
6ef0: 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44  Name2->n>0 && iD
6f00: 62 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  b!=1 ){.    /* I
6f10: 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d  f creating a tem
6f20: 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d  p table, the nam
6f30: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61  e may not be qua
6f40: 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a  lified. Unless .
6f50: 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
6f60: 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74 65 6d  ase name is "tem
6f70: 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20  p" anyway.  */. 
6f80: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6f90: 73 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70  sg(pParse, "temp
6fa0: 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65  orary table name
6fb0: 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69   must be unquali
6fc0: 66 69 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  fied");.    retu
6fd0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f  rn;.  }.  if( !O
6fe0: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
6ff0: 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a  Temp ) iDb = 1;.
7000: 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  .  pParse->sName
7010: 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a  Token = *pName;.
7020: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
7030: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
7040: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
7050: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
7060: 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  rn;.  if( SQLITE
7070: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63  _OK!=sqlite3Chec
7080: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72  kObjectName(pPar
7090: 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  se, zName) ){.  
70a0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
70b0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  le_error;.  }.  
70c0: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  if( db->init.iDb
70d0: 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31  ==1 ) isTemp = 1
70e0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
70f0: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
7100: 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69  ION.  assert( (i
7110: 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65  sTemp & 1)==isTe
7120: 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e  mp );.  {.    in
7130: 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72  t code;.    char
7140: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
7150: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
7160: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
7170: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
7180: 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45  ITE_INSERT, SCHE
7190: 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29  MA_TABLE(isTemp)
71a0: 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
71b0: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
71c0: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
71d0: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
71e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  ){.      if( !OM
71f0: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
7200: 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63  emp ){.        c
7210: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45  ode = SQLITE_CRE
7220: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ATE_TEMP_VIEW;. 
7230: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7240: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
7250: 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20  E_CREATE_VIEW;. 
7260: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
7270: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
7280: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
7290: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
72a0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
72b0: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20  TE_TEMP_TABLE;. 
72c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
72d0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
72e0: 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a  E_CREATE_TABLE;.
72f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7300: 20 20 69 66 28 20 21 69 73 56 69 72 74 75 61 6c    if( !isVirtual
7310: 20 26 26 20 73 71 6c 69 74 65 33 41 75 74 68 43   && sqlite3AuthC
7320: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
7330: 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62  e, zName, 0, zDb
7340: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
7350: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
7360: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  r;.    }.  }.#en
7370: 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  dif..  /* Make s
7380: 75 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ure the new tabl
7390: 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20  e name does not 
73a0: 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20  collide with an 
73b0: 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e  existing.  ** in
73c0: 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d  dex or table nam
73d0: 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  e in the same da
73e0: 74 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61  tabase.  Issue a
73f0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
7400: 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e  if.  ** it does.
7410: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
7420: 73 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  s if the stateme
7430: 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65 64 20  nt being parsed 
7440: 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a 20  was passed.  ** 
7450: 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64 65  to an sqlite3_de
7460: 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61 6c  clare_vtab() cal
7470: 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 20  l. In that case 
7480: 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  only the column 
7490: 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74  names.  ** and t
74a0: 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65  ypes will be use
74b0: 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  d, so there is n
74c0: 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66  o need to test f
74d0: 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a  or namespace.  *
74e0: 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20  * collisions..  
74f0: 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45 43  */.  if( !IN_DEC
7500: 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20  LARE_VTAB ){.   
7510: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
7520: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
7530: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
7540: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
7550: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
7560: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
7570: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
7580: 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20     }.    pTable 
7590: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
75a0: 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  le(db, zName, zD
75b0: 62 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  b);.    if( pTab
75c0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
75d0: 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20  !noErr ){.      
75e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
75f0: 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
7600: 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73   %T already exis
7610: 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  ts", pName);.   
7620: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7630: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
7640: 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
7650: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
7660: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
7670: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
7680: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  }.      goto beg
7690: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
76a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
76b0: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
76c0: 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d  b, zName, zDb)!=
76d0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
76e0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
76f0: 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
7700: 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61  eady an index na
7710: 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
7720: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
7730: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
7740: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62     }.  }..  pTab
7750: 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  le = sqlite3DbMa
7760: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
7770: 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69  eof(Table));.  i
7780: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  f( pTable==0 ){.
7790: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
77a0: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50  iled = 1;.    pP
77b0: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
77c0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61  E_NOMEM;.    pPa
77d0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
77e0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
77f0: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
7800: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
7810: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
7820: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
7830: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20  able->pSchema = 
7840: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
7850: 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  hema;.  pTable->
7860: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62  nRef = 1;.  pTab
7870: 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d  le->nRowLogEst =
7880: 20 32 30 30 3b 20 61 73 73 65 72 74 28 20 32 30   200; assert( 20
7890: 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  0==sqlite3LogEst
78a0: 28 31 30 34 38 35 37 36 29 20 29 3b 0a 20 20 61  (1048576) );.  a
78b0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
78c0: 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  NewTable==0 );. 
78d0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
78e0: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
78f0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
7900: 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73  e magic sqlite_s
7910: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73  equence table us
7920: 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d  ed by autoincrem
7930: 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  ent,.  ** then r
7940: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
7950: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e  to this table in
7960: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
7970: 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
7980: 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54  * so that INSERT
7990: 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61   can find the ta
79a0: 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f  ble easily..  */
79b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
79c0: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
79d0: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  NT.  if( !pParse
79e0: 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63  ->nested && strc
79f0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
7a00: 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20  e_sequence")==0 
7a10: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
7a20: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
7a30: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
7a40: 29 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  ) );.    pTable-
7a50: 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
7a60: 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a  b = pTable;.  }.
7a70: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67  #endif..  /* Beg
7a80: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
7a90: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
7aa0: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
7ab0: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
7ac0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
7ad0: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
7ae0: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
7af0: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
7b00: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
7b10: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
7b20: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
7b30: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
7b40: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
7b50: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
7b60: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
7b70: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
7b80: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
7b90: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
7ba0: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
7bb0: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
7bc0: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
7bd0: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
7be0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
7bf0: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
7c00: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7c10: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
7c20: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
7c30: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
7c40: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28  ->init.busy && (
7c50: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
7c60: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
7c70: 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20  {.    int j1;.  
7c80: 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74    int fileFormat
7c90: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20  ;.    int reg1, 
7ca0: 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20  reg2, reg3;.    
7cb0: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
7cc0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
7cd0: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 0, iDb);..#if
7ce0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7cf0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
7d00: 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20    if( isVirtual 
7d10: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7d20: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
7d30: 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a  _VBegin);.    }.
7d40: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
7d50: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
7d60: 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69  t and encoding i
7d70: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
7d80: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74  ave not been set
7d90: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
7da0: 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  em now..    */. 
7db0: 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65     reg1 = pParse
7dc0: 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70  ->regRowid = ++p
7dd0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
7de0: 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e   reg2 = pParse->
7df0: 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72  regRoot = ++pPar
7e00: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
7e10: 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  g3 = ++pParse->n
7e20: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
7e30: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7e40: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
7e50: 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49  , reg3, BTREE_FI
7e60: 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20  LE_FORMAT);.    
7e70: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
7e80: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
7e90: 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
7ea0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
7eb0: 66 2c 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f  f, reg3); VdbeCo
7ec0: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66  verage(v);.    f
7ed0: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d  ileFormat = (db-
7ee0: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
7ef0: 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d  LegacyFileFmt)!=
7f00: 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  0 ?.            
7f10: 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45        1 : SQLITE
7f20: 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  _MAX_FILE_FORMAT
7f30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7f40: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
7f50: 74 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61  teger, fileForma
7f60: 74 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  t, reg3);.    sq
7f70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
7f80: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
7f90: 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45   iDb, BTREE_FILE
7fa0: 5f 46 4f 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a  _FORMAT, reg3);.
7fb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7fc0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
7fd0: 67 65 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65  ger, ENC(db), re
7fe0: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
7ff0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8000: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
8010: 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f   BTREE_TEXT_ENCO
8020: 44 49 4e 47 2c 20 72 65 67 33 29 3b 0a 20 20 20  DING, reg3);.   
8030: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
8040: 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20  Here(v, j1);..  
8050: 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63    /* This just c
8060: 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68  reates a place-h
8070: 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20  older record in 
8080: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
8090: 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  r table..    ** 
80a0: 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74  The record creat
80b0: 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  ed does not cont
80c0: 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74  ain anything yet
80d0: 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65  .  It will be re
80e0: 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79  placed.    ** by
80f0: 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20   the real entry 
8100: 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  in code generate
8110: 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54  d at sqlite3EndT
8120: 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20  able()..    **. 
8130: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
8140: 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72  for the new entr
8150: 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  y is left in reg
8160: 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65  ister pParse->re
8170: 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54  gRowid..    ** T
8180: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
8190: 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74  ber of the new t
81a0: 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20  able is left in 
81b0: 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52  reg pParse->regR
81c0: 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  oot..    ** The 
81d0: 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70  rowid and root p
81e0: 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65  age number value
81f0: 73 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  s are needed by 
8200: 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20  the code that.  
8210: 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54    ** sqlite3EndT
8220: 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  able will genera
8230: 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21  te..    */.#if !
8240: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
8250: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
8260: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8270: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
8280: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 7c      if( isView |
8290: 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  | isVirtual ){. 
82a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
82b0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
82c0: 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a  eger, 0, reg2);.
82d0: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
82e0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70 50 61  .    {.      pPa
82f0: 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 3d  rse->addrCrTab =
8300: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8310: 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  p2(v, OP_CreateT
8320: 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29  able, iDb, reg2)
8330: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
8340: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
8350: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  le(pParse, iDb);
8360: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8370: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
8380: 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b  Rowid, 0, reg1);
8390: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
83a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
83b0: 6c 2c 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20  l, 0, reg3);.   
83c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
83d0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
83e0: 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b   0, reg3, reg1);
83f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8400: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
8410: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
8420: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8430: 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a  0(v, OP_Close);.
8440: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
8450: 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74   (non-error) ret
8460: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  urn. */.  return
8470: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
8480: 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a  ror occurs, we j
8490: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69  ump here */.begi
84a0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20  n_table_error:. 
84b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
84c0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
84d0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
84e0: 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64  is macro is used
84f0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20   to compare two 
8500: 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73  strings in a cas
8510: 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61  e-insensitive ma
8520: 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73  nner..** It is s
8530: 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20 74  lightly faster t
8540: 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  han calling sqli
8550: 74 65 33 53 74 72 49 43 6d 70 28 29 20 64 69 72  te3StrICmp() dir
8560: 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72  ectly, but.** pr
8570: 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f  oduces larger co
8580: 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e  de..**.** WARNIN
8590: 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73  G: This macro is
85a0: 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20   not compatible 
85b0: 77 69 74 68 20 74 68 65 20 73 74 72 63 6d 70 28  with the strcmp(
85c0: 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20  ) family. It.** 
85d0: 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20  returns true if 
85e0: 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20  the two strings 
85f0: 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72  are equal, other
8600: 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23  wise false..*/.#
8610: 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78  define STRICMP(x
8620: 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55  , y) (\.sqlite3U
8630: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e  pperToLower[*(un
8640: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78  signed char *)(x
8650: 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33  )]==   \.sqlite3
8660: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75  UpperToLower[*(u
8670: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28  nsigned char *)(
8680: 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c  y)]     \.&& sql
8690: 69 74 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b  ite3StrICmp((x)+
86a0: 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f  1,(y)+1)==0 )../
86b0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
86c0: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
86d0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
86e0: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
86f0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
8700: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
8710: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
8720: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
8730: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
8740: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
8750: 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61  ent.  sqlite3Sta
8760: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
8770: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
8780: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
8790: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
87a0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
87b0: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
87c0: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
87d0: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61  ite3AddColumn(Pa
87e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
87f0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61  en *pName){.  Ta
8800: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
8810: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f  .  char *z;.  Co
8820: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71  lumn *pCol;.  sq
8830: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
8840: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70  se->db;.  if( (p
8850: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
8860: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
8870: 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  n;.#if SQLITE_MA
8880: 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70  X_COLUMN.  if( p
8890: 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69  ->nCol+1>db->aLi
88a0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
88b0: 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
88c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
88d0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
88e0: 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22  y columns on %s"
88f0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
8900: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
8910: 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  dif.  z = sqlite
8920: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
8930: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
8940: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
8950: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
8960: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
8970: 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70  if( STRICMP(z, p
8980: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
8990: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
89a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
89b0: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
89c0: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
89d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
89e0: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
89f0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
8a00: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d   }.  }.  if( (p-
8a10: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
8a20: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
8a30: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
8a40: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
8a50: 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e  (db,p->aCol,(p->
8a60: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
8a70: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
8a80: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
8a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
8aa0: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
8ab0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
8ac0: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e      p->aCol = aN
8ad0: 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d  ew;.  }.  pCol =
8ae0: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
8af0: 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f  l];.  memset(pCo
8b00: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  l, 0, sizeof(p->
8b10: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f  aCol[0]));.  pCo
8b20: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a  l->zName = z;. .
8b30: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
8b40: 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69   no type specifi
8b50: 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65  ed, columns have
8b60: 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66   the default aff
8b70: 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45  inity.  ** 'NONE
8b80: 27 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  '. If there is a
8b90: 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c   type specified,
8ba0: 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64   then sqlite3Add
8bb0: 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c  ColumnType() wil
8bc0: 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64  l.  ** be called
8bd0: 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f   next to set pCo
8be0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72  l->affinity corr
8bf0: 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43  ectly..  */.  pC
8c00: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
8c10: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
8c20: 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20    pCol->szEst = 
8c30: 31 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a  1;.  p->nCol++;.
8c40: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8c50: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8c60: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
8c70: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
8c80: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
8c90: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
8ca0: 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f  tatement.  A "NO
8cb0: 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69  T NULL" constrai
8cc0: 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73  nt has.** been s
8cd0: 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e  een on a column.
8ce0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
8cf0: 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20  ets the notNull 
8d00: 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63  flag on.** the c
8d10: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
8d20: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
8d30: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
8d40: 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61  te3AddNotNull(Pa
8d50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
8d60: 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62   onError){.  Tab
8d70: 6c 65 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61  le *p;.  p = pPa
8d80: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
8d90: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
8da0: 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29  VER(p->nCol<1) )
8db0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43   return;.  p->aC
8dc0: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f  ol[p->nCol-1].no
8dd0: 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72  tNull = (u8)onEr
8de0: 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63  ror;.}../*.** Sc
8df0: 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79  an the column ty
8e00: 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c  pe name zType (l
8e10: 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64  ength nType) and
8e20: 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   return the.** a
8e30: 73 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69  ssociated affini
8e40: 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54  ty type..**.** T
8e50: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
8e60: 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64   a case-independ
8e70: 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54  ent search of zT
8e80: 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  ype for the .** 
8e90: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
8ea0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c  e following tabl
8eb0: 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65  e. If one of the
8ec0: 20 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a   substrings is.*
8ed0: 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72  * found, the cor
8ee0: 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e  responding affin
8ef0: 69 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ity is returned.
8f00: 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69   If zType contai
8f10: 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  ns.** more than 
8f20: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
8f30: 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74  rings, entries t
8f40: 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66  oward the top of
8f50: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74   .** the table t
8f60: 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f  ake priority. Fo
8f70: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54  r example, if zT
8f80: 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27  ype is 'BLOBINT'
8f90: 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  , .** SQLITE_AFF
8fa0: 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75  _INTEGER is retu
8fb0: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73  rned..**.** Subs
8fc0: 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69  tring     | Affi
8fd0: 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  nity.** --------
8fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ff0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54  --------.** 'INT
9000: 27 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  '         | SQLI
9010: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a  TE_AFF_INTEGER.*
9020: 2a 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20  * 'CHAR'        
9030: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
9040: 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20  T.** 'CLOB'     
9050: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
9060: 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20  TEXT.** 'TEXT'  
9070: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
9080: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42  FF_TEXT.** 'BLOB
9090: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
90a0: 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52  E_AFF_NONE.** 'R
90b0: 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51  EAL'        | SQ
90c0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
90d0: 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c   'FLOA'        |
90e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
90f0: 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20  .** 'DOUB'      
9100: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
9110: 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e  EAL.**.** If non
9120: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
9130: 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65  ngs in the above
9140: 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64   table are found
9150: 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  ,.** SQLITE_AFF_
9160: 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72  NUMERIC is retur
9170: 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  ned..*/.char sql
9180: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
9190: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e  (const char *zIn
91a0: 2c 20 75 38 20 2a 70 73 7a 45 73 74 29 7b 0a 20  , u8 *pszEst){. 
91b0: 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68   u32 h = 0;.  ch
91c0: 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f  ar aff = SQLITE_
91d0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63  AFF_NUMERIC;.  c
91e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72  onst char *zChar
91f0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 7a 49 6e   = 0;..  if( zIn
9200: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 66 66  ==0 ) return aff
9210: 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30  ;.  while( zIn[0
9220: 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c  ] ){.    h = (h<
9230: 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70  <8) + sqlite3Upp
9240: 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29  erToLower[(*zIn)
9250: 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b  &0xff];.    zIn+
9260: 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28  +;.    if( h==((
9270: 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31  'c'<<24)+('h'<<1
9280: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29  6)+('a'<<8)+'r')
9290: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
92a0: 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20  /* CHAR */.     
92b0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
92c0: 46 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7a 43  F_TEXT;.      zC
92d0: 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d  har = zIn;.    }
92e0: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63  else if( h==(('c
92f0: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
9300: 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29  +('o'<<8)+'b') )
9310: 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20  {       /* CLOB 
9320: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
9330: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
9340: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
9350: 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27  =(('t'<<24)+('e'
9360: 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27  <<16)+('x'<<8)+'
9370: 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  t') ){       /* 
9380: 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66  TEXT */.      af
9390: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
93a0: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
93b0: 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29  f( h==(('b'<<24)
93c0: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
93d0: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
93e0: 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20    /* BLOB */.   
93f0: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
9400: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9410: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
9420: 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20  AFF_REAL) ){.   
9430: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
9440: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20  AFF_NONE;.      
9450: 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20  if( zIn[0]=='(' 
9460: 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23  ) zChar = zIn;.#
9470: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9480: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
9490: 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  T.    }else if( 
94a0: 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27  h==(('r'<<24)+('
94b0: 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29  e'<<16)+('a'<<8)
94c0: 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'l')          /
94d0: 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20  * REAL */.      
94e0: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
94f0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
9500: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
9510: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
9520: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
9530: 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'f'<<24)+('l'<<1
9540: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29  6)+('o'<<8)+'a')
9550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f            /* FLO
9560: 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  A */.        && 
9570: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
9580: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
9590: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
95a0: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
95b0: 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c  e if( h==(('d'<<
95c0: 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27  24)+('o'<<16)+('
95d0: 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20  u'<<8)+'b')     
95e0: 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a       /* DOUB */.
95f0: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
9600: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
9610: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
9620: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
9630: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  L;.#endif.    }e
9640: 6c 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46  lse if( (h&0x00F
9650: 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31  FFFFF)==(('i'<<1
9660: 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29  6)+('n'<<8)+'t')
9670: 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f   ){    /* INT */
9680: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
9690: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
96a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
96b0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
96c0: 20 70 73 7a 45 73 74 20 69 73 20 6e 6f 74 20 4e   pszEst is not N
96d0: 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73  ULL, store an es
96e0: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69  timate of the fi
96f0: 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20  eld size.  The. 
9700: 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20   ** estimate is 
9710: 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74  scaled so that t
9720: 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e  he size of an in
9730: 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a  teger is 1.  */.
9740: 20 20 69 66 28 20 70 73 7a 45 73 74 20 29 7b 0a    if( pszEst ){.
9750: 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 31 3b      *pszEst = 1;
9760: 20 20 20 2f 2a 20 64 65 66 61 75 6c 74 20 73 69     /* default si
9770: 7a 65 20 69 73 20 61 70 70 72 6f 78 20 34 20 62  ze is approx 4 b
9780: 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ytes */.    if( 
9790: 61 66 66 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff<=SQLITE_AFF_
97a0: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 66  NONE ){.      if
97b0: 28 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20  ( zChar ){.     
97c0: 20 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b     while( zChar[
97d0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0] ){.          
97e0: 69 66 28 20 73 71 6c 69 74 65 33 49 73 64 69 67  if( sqlite3Isdig
97f0: 69 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a  it(zChar[0]) ){.
9800: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
9810: 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  v = 0;.         
9820: 20 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74     sqlite3GetInt
9830: 33 32 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a 20  32(zChar, &v);. 
9840: 20 20 20 20 20 20 20 20 20 20 20 76 20 3d 20 76             v = v
9850: 2f 34 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  /4 + 1;.        
9860: 20 20 20 20 69 66 28 20 76 3e 32 35 35 20 29 20      if( v>255 ) 
9870: 76 20 3d 20 32 35 35 3b 0a 20 20 20 20 20 20 20  v = 255;.       
9880: 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 76       *pszEst = v
9890: 3b 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41  ; /* BLOB(k), VA
98a0: 52 43 48 41 52 28 6b 29 2c 20 43 48 41 52 28 6b  RCHAR(k), CHAR(k
98b0: 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a  ) -> r=(k/4+1) *
98c0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  /.            br
98d0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
98e0: 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68 61 72  .          zChar
98f0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
9900: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9910: 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 35 3b 20     *pszEst = 5; 
9920: 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c    /* BLOB, TEXT,
9930: 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61   CLOB -> r=5  (a
9940: 70 70 72 6f 78 20 32 30 20 62 79 74 65 73 29 2a  pprox 20 bytes)*
9950: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
9960: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66    }.  return aff
9970: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
9980: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
9990: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
99a0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
99b0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
99c0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
99d0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
99e0: 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73   pFirst token is
99f0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f   the first.** to
9a00: 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65  ken in the seque
9a10: 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68  nce of tokens th
9a20: 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20  at describe the 
9a30: 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  type of the.** c
9a40: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
9a50: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
9a60: 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74  on.   pLast is t
9a70: 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a  he last token.**
9a80: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
9a90: 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f  .  Use this info
9aa0: 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74  rmation to const
9ab0: 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a  ruct a string.**
9ac0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
9ad0: 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74  he typename of t
9ae0: 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74  he column and st
9af0: 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a  ore that string.
9b00: 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20  ** in zType..*/ 
9b10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
9b20: 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65  ColumnType(Parse
9b30: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
9b40: 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65  *pType){.  Table
9b50: 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *p;.  Column *p
9b60: 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70 50 61 72  Col;..  p = pPar
9b70: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
9b80: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
9b90: 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20  ER(p->nCol<1) ) 
9ba0: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d  return;.  pCol =
9bb0: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
9bc0: 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  l-1];.  assert( 
9bd0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29  pCol->zType==0 )
9be0: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20  ;.  pCol->zType 
9bf0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
9c00: 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
9c10: 62 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f  b, pType);.  pCo
9c20: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71  l->affinity = sq
9c30: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
9c40: 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 2c 20 26  e(pCol->zType, &
9c50: 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 7d 0a  pCol->szEst);.}.
9c60: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65  ./*.** The expre
9c70: 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66  ssion is the def
9c80: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
9c90: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
9ca0: 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a   added column.**
9cb0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75   of the table cu
9cc0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
9cd0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  nstruction..**.*
9ce0: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
9cf0: 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74  expressions must
9d00: 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52   be constant.  R
9d10: 61 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f  aise an exceptio
9d20: 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  n if this.** is 
9d30: 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a  not the case..**
9d40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9d50: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
9d60: 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69  e parser while i
9d70: 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a  n the middle of.
9d80: 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  ** parsing a CRE
9d90: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
9da0: 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
9db0: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
9dc0: 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lue(Parse *pPars
9dd0: 65 2c 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70  e, ExprSpan *pSp
9de0: 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  an){.  Table *p;
9df0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
9e00: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9e10: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
9e20: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
9e30: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30  able;.  if( p!=0
9e40: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26   ){.    pCol = &
9e50: 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  (p->aCol[p->nCol
9e60: 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73  -1]);.    if( !s
9e70: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
9e80: 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70  tantOrFunction(p
9e90: 53 70 61 6e 2d 3e 70 45 78 70 72 29 20 29 7b 0a  Span->pExpr) ){.
9ea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
9eb0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
9ec0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20  efault value of 
9ed0: 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e  column [%s] is n
9ee0: 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20  ot constant",.  
9ef0: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e          pCol->zN
9f00: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
9f10: 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  .      /* A copy
9f20: 20 6f 66 20 70 45 78 70 72 20 69 73 20 75 73 65   of pExpr is use
9f30: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  d instead of the
9f40: 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45   original, as pE
9f50: 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20  xpr contains.   
9f60: 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61     ** tokens tha
9f70: 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74  t point to volat
9f80: 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20  ile memory. The 
9f90: 27 73 70 61 6e 27 20 6f 66 20 74 68 65 20 65 78  'span' of the ex
9fa0: 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a  pression.      *
9fb0: 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79  * is required by
9fc0: 20 70 72 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e   pragma table_in
9fd0: 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  fo..      */.   
9fe0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
9ff0: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70  lete(db, pCol->p
a000: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f  Dflt);.      pCo
a010: 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74  l->pDflt = sqlit
a020: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
a030: 70 61 6e 2d 3e 70 45 78 70 72 2c 20 45 58 50 52  pan->pExpr, EXPR
a040: 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20  DUP_REDUCE);.   
a050: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
a060: 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74  (db, pCol->zDflt
a070: 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a  );.      pCol->z
a080: 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 44 62  Dflt = sqlite3Db
a090: 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
a0a0: 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74  r*)pSpan->zStart
a0b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0d0: 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 53 70         (int)(pSp
a0e0: 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e  an->zEnd - pSpan
a0f0: 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20 20 20  ->zStart));.    
a100: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  }.  }.  sqlite3E
a110: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 53  xprDelete(db, pS
a120: 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a  pan->pExpr);.}..
a130: 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20  /*.** Designate 
a140: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
a150: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20  for the table.  
a160: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
a170: 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  of names .** of 
a180: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72  columns that for
a190: 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  m the primary ke
a1a0: 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20  y.  If pList is 
a1b0: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  NULL, then the.*
a1c0: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  * most recently 
a1d0: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20  added column of 
a1e0: 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65  the table is the
a1f0: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
a200: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20  .** A table can 
a210: 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
a220: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
a230: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
a240: 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69  ady has.** a pri
a250: 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68  mary key (and th
a260: 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
a270: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68   primary key) th
a280: 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20  en create an.** 
a290: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
a2a0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
a2b0: 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63  is on a single c
a2c0: 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61  olumn whose data
a2d0: 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c  type is INTEGER,
a2e0: 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  .** then we will
a2f0: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74   try to use that
a300: 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72   column as the r
a310: 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54  owid.  Set the T
a320: 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69  able.iPKey.** fi
a330: 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65  eld of the table
a340: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
a350: 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e  ion to be the in
a360: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  dex of the.** IN
a370: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
a380: 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65  Y column.  Table
a390: 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f  .iPKey is set to
a3a0: 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a   -1 if there is.
a3b0: 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52  ** no INTEGER PR
a3c0: 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a  IMARY KEY..**.**
a3d0: 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e   If the key is n
a3e0: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
a3f0: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
a400: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a  create a unique.
a410: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
a420: 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20   key.  No index 
a430: 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49  is created for I
a440: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
a450: 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  EYs..*/.void sql
a460: 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65  ite3AddPrimaryKe
a470: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
a480: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
a490: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
a4a0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
a4b0: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c   /* List of fiel
a4c0: 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e  d names to be in
a4d0: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
a4e0: 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
a4f0: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
a500: 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e  a uniqueness con
a510: 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61  flict */.  int a
a520: 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20  utoInc,      /* 
a530: 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f  True if the AUTO
a540: 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72  INCREMENT keywor
a550: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
a560: 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20    int sortOrder 
a570: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f      /* SQLITE_SO
a580: 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53  _ASC or SQLITE_S
a590: 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54  O_DESC */.){.  T
a5a0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
a5b0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
a5c0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
a5d0: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
a5e0: 2d 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65  -1, i;.  int nTe
a5f0: 72 6d 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  rm;.  if( pTab==
a600: 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f  0 || IN_DECLARE_
a610: 56 54 41 42 20 29 20 67 6f 74 6f 20 70 72 69 6d  VTAB ) goto prim
a620: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
a630: 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61  if( pTab->tabFla
a640: 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61  gs & TF_HasPrima
a650: 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  ryKey ){.    sql
a660: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
a670: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62  rse, .      "tab
a680: 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f  le \"%s\" has mo
a690: 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d  re than one prim
a6a0: 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e  ary key", pTab->
a6b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
a6c0: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
a6d0: 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74  t;.  }.  pTab->t
a6e0: 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61  abFlags |= TF_Ha
a6f0: 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69  sPrimaryKey;.  i
a700: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
a710: 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     iCol = pTab->
a720: 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54  nCol - 1;.    pT
a730: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63  ab->aCol[iCol].c
a740: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
a750: 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20  AG_PRIMKEY;.    
a760: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
a770: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
a780: 20 20 20 20 6e 54 65 72 6d 20 3d 20 31 3b 0a 20      nTerm = 1;. 
a790: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 54 65 72   }else{.    nTer
a7a0: 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  m = pList->nExpr
a7b0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
a7c0: 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  <nTerm; i++){.  
a7d0: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
a7e0: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
a7f0: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
a800: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
a810: 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
a820: 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  .zName, pTab->aC
a830: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d  ol[iCol].zName)=
a840: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a850: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
a860: 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  .colFlags |= COL
a870: 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20  FLAG_PRIMKEY;.  
a880: 20 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20          zType = 
a890: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
a8a0: 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20  .zType;.        
a8b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
a8c0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
a8d0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d  .  }.  if( nTerm
a8e0: 3d 3d 31 0a 20 20 20 26 26 20 7a 54 79 70 65 20  ==1.   && zType 
a8f0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
a900: 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45  p(zType, "INTEGE
a910: 52 22 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72  R")==0.   && sor
a920: 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53  tOrder==SQLITE_S
a930: 4f 5f 41 53 43 0a 20 20 29 7b 0a 20 20 20 20 70  O_ASC.  ){.    p
a940: 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f  Tab->iPKey = iCo
a950: 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79  l;.    pTab->key
a960: 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72  Conf = (u8)onErr
a970: 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  or;.    assert( 
a980: 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75  autoInc==0 || au
a990: 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20  toInc==1 );.    
a9a0: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
a9b0: 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74  = autoInc*TF_Aut
a9c0: 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20  oincrement;.    
a9d0: 69 66 28 20 70 4c 69 73 74 20 29 20 70 50 61 72  if( pList ) pPar
a9e0: 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72  se->iPkSortOrder
a9f0: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73   = pList->a[0].s
aa00: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73  ortOrder;.  }els
aa10: 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b  e if( autoInc ){
aa20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
aa30: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
aa40: 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  NT.    sqlite3Er
aa50: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
aa60: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73  AUTOINCREMENT is
aa70: 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e   only allowed on
aa80: 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e   an ".       "IN
aa90: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
aaa0: 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  Y");.#endif.  }e
aab0: 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  lse{.    Vdbe *v
aac0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
aad0: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  ;.    Index *p;.
aae0: 20 20 20 20 69 66 28 20 76 20 29 20 70 50 61 72      if( v ) pPar
aaf0: 73 65 2d 3e 61 64 64 72 53 6b 69 70 50 4b 20 3d  se->addrSkipPK =
ab00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ab10: 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a  p0(v, OP_Noop);.
ab20: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 43      p = sqlite3C
ab30: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
ab40: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73  e, 0, 0, 0, pLis
ab50: 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20  t, onError, 0,. 
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab70: 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 6f 72            0, sor
ab80: 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20 20 20  tOrder, 0);.    
ab90: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70  if( p ){.      p
aba0: 2d 3e 69 64 78 54 79 70 65 20 3d 20 53 51 4c 49  ->idxType = SQLI
abb0: 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41  TE_IDXTYPE_PRIMA
abc0: 52 59 4b 45 59 3b 0a 20 20 20 20 20 20 69 66 28  RYKEY;.      if(
abd0: 20 76 20 29 20 73 71 6c 69 74 65 33 56 64 62 65   v ) sqlite3Vdbe
abe0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 50 61 72  JumpHere(v, pPar
abf0: 73 65 2d 3e 61 64 64 72 53 6b 69 70 50 4b 29 3b  se->addrSkipPK);
ac00: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
ac10: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61   = 0;.  }..prima
ac20: 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73  ry_key_exit:.  s
ac30: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
ac40: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
ac50: 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72   pList);.  retur
ac60: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  n;.}../*.** Add 
ac70: 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73  a new CHECK cons
ac80: 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61  traint to the ta
ac90: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
aca0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
acb0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
acc0: 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61  3AddCheckConstra
acd0: 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
ace0: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
acf0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
ad00: 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70   Expr *pCheckExp
ad10: 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20  r  /* The check 
ad20: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
ad30: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ad40: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62  OMIT_CHECK.  Tab
ad50: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
ad60: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
ad70: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
ad80: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
ad90: 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c  pTab && !IN_DECL
ada0: 41 52 45 5f 56 54 41 42 0a 20 20 20 26 26 20 21  ARE_VTAB.   && !
adb0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 65  sqlite3BtreeIsRe
adc0: 61 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64  adonly(db->aDb[d
add0: 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74  b->init.iDb].pBt
ade0: 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  ).  ){.    pTab-
adf0: 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65  >pCheck = sqlite
ae00: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
ae10: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43  pParse, pTab->pC
ae20: 68 65 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72  heck, pCheckExpr
ae30: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  );.    if( pPars
ae40: 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d  e->constraintNam
ae50: 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  e.n ){.      sql
ae60: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
ae70: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ame(pParse, pTab
ae80: 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73  ->pCheck, &pPars
ae90: 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d  e->constraintNam
aea0: 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 1);.    }.  }
aeb0: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a  else.#endif.  {.
aec0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
aed0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
aee0: 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20  , pCheckExpr);. 
aef0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
af00: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  the collation fu
af10: 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nction of the mo
af20: 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73  st recently pars
af30: 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a  ed table column.
af40: 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65  ** to the CollSe
af50: 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64  q given..*/.void
af60: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61   sqlite3AddColla
af70: 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  teType(Parse *pP
af80: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  arse, Token *pTo
af90: 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ken){.  Table *p
afa0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
afb0: 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20  r *zColl;       
afc0: 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74         /* Dequot
afd0: 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61  ed name of colla
afe0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f  tion sequence */
aff0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
b000: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
b010: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
b020: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
b030: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64  = p->nCol-1;.  d
b040: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
b050: 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    zColl = sqlite
b060: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
b070: 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66  b, pToken);.  if
b080: 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72  ( !zColl ) retur
b090: 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  n;..  if( sqlite
b0a0: 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
b0b0: 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Parse, zColl) ){
b0c0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
b0d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
b0e0: 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b  ree(db, p->aCol[
b0f0: 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70  i].zColl);.    p
b100: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20  ->aCol[i].zColl 
b110: 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20  = zColl;.  .    
b120: 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e  /* If the column
b130: 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 20   is declared as 
b140: 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20  "<name> PRIMARY 
b150: 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70  KEY COLLATE <typ
b160: 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  e>",.    ** then
b170: 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61   an index may ha
b180: 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  ve been created 
b190: 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62  on this column b
b1a0: 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
b1b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20   collation type 
b1c0: 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65  was added. Corre
b1d0: 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73  ct this if it is
b1e0: 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a   the case..    *
b1f0: 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  /.    for(pIdx=p
b200: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
b210: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
b220: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b230: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d   pIdx->nKeyCol==
b240: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
b250: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
b260: 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==i ){.        p
b270: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d  Idx->azColl[0] =
b280: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
b290: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
b2a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
b2b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
b2c0: 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  zColl);.  }.}../
b2d0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
b2e0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63  on returns the c
b2f0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
b300: 65 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e  e for database n
b310: 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e  ative text.** en
b320: 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65  coding identifie
b330: 64 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20  d by the string 
b340: 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e  zName, length nN
b350: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ame..**.** If th
b360: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
b370: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69  ation sequence i
b380: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c  s not available,
b390: 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   or not availabl
b3a0: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61  e.** in the data
b3b0: 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f  base native enco
b3c0: 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74  ding, the collat
b3d0: 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69  ion factory is i
b3e0: 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71  nvoked to.** req
b3f0: 75 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20  uest it. If the 
b400: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
b410: 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c  y does not suppl
b420: 79 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63  y such a sequenc
b430: 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65  e,.** and the se
b440: 71 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61  quence is availa
b450: 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74  ble in another t
b460: 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  ext encoding, th
b470: 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65  en that is.** re
b480: 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a  turned instead..
b490: 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73  **.** If no vers
b4a0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75  ions of the requ
b4b0: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73  ested collations
b4c0: 20 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76   sequence are av
b4d0: 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61  ailable, or.** a
b4e0: 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63  nother error occ
b4f0: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  urs, NULL is ret
b500: 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72  urned and an err
b510: 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74  or message writt
b520: 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73  en into.** pPars
b530: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
b540: 75 74 69 6e 65 20 69 73 20 61 20 77 72 61 70 70  utine is a wrapp
b550: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
b560: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20  3FindCollSeq(). 
b570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
b580: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c   invokes the col
b590: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
b5a0: 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c  f the named coll
b5b0: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20  ation cannot be 
b5c0: 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e  found.** and gen
b5d0: 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20  erates an error 
b5e0: 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53  message..**.** S
b5f0: 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33  ee also: sqlite3
b600: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73  FindCollSeq(), s
b610: 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71  qlite3GetCollSeq
b620: 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73  ().*/.CollSeq *s
b630: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
b640: 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73  Seq(Parse *pPars
b650: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
b660: 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  Name){.  sqlite3
b670: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b680: 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e  b;.  u8 enc = EN
b690: 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74  C(db);.  u8 init
b6a0: 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  busy = db->init.
b6b0: 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  busy;.  CollSeq 
b6c0: 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c  *pColl;..  pColl
b6d0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
b6e0: 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a  llSeq(db, enc, z
b6f0: 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b  Name, initbusy);
b700: 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79  .  if( !initbusy
b710: 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21   && (!pColl || !
b720: 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a  pColl->xCmp) ){.
b730: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
b740: 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50  te3GetCollSeq(pP
b750: 61 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c  arse, enc, pColl
b760: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20  , zName);.  }.. 
b770: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
b780: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
b790: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
b7a0: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73   increment the s
b7b0: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a  chema cookie..**
b7c0: 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63  .** The schema c
b7d0: 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f  ookie is used to
b7e0: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20   determine when 
b7f0: 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74  the schema for t
b800: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
b810: 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65  hanges.  After e
b820: 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ach schema chang
b830: 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61  e, the cookie va
b840: 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  lue.** changes. 
b850: 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   When a process 
b860: 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20  first reads the 
b870: 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64  schema it record
b880: 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e  s the.** cookie.
b890: 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68    Thereafter, wh
b8a0: 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74  enever it goes t
b8b0: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
b8c0: 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65  abase,.** it che
b8d0: 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  cks the cookie t
b8e0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
b8f0: 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63  schema has not c
b900: 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20  hanged.** since 
b910: 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64  it was last read
b920: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61  ..**.** This pla
b930: 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  n is not complet
b940: 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66  ely bullet-proof
b950: 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  .  It is possibl
b960: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68  e for.** the sch
b970: 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75  ema to change mu
b980: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64  ltiple times and
b990: 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20   for the cookie 
b9a0: 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63  to be.** set bac
b9b0: 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65  k to prior value
b9c0: 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68  .  But schema ch
b9d0: 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71  anges are infreq
b9e0: 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  uent.** and the 
b9f0: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68  probability of h
ba00: 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20  itting the same 
ba10: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20  cookie value is 
ba20: 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65  only.** 1 chance
ba30: 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65   in 2^32.  So we
ba40: 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e  're safe enough.
ba50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ba60: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72  ChangeCookie(Par
ba70: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
ba80: 69 44 62 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d  iDb){.  int r1 =
ba90: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
baa0: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
bab0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
bac0: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
bad0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
bae0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
baf0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
bb00: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
bb10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
bb20: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
bb30: 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44  eger, db->aDb[iD
bb40: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  b].pSchema->sche
bb50: 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72 31 29  ma_cookie+1, r1)
bb60: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
bb70: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
bb80: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
bb90: 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e  E_SCHEMA_VERSION
bba0: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
bbb0: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
bbc0: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f  Parse, r1);.}../
bbd0: 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65  *.** Measure the
bbe0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
bbf0: 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20  cters needed to 
bc00: 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  output the given
bc10: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20  .** identifier. 
bc20: 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
bc30: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e  rned includes an
bc40: 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a  y quotes used.**
bc50: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e   but does not in
bc60: 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74  clude the null t
bc70: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  erminator..**.**
bc80: 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73   The estimate is
bc90: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20   conservative.  
bca0: 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  It might be larg
bcb0: 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a  er that what is.
bcc0: 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64  ** really needed
bcd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
bce0: 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73  identLength(cons
bcf0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
bd00: 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  t n;.  for(n=0; 
bd10: 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20  *z; n++, z++){. 
bd20: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29     if( *z=='"' )
bd30: 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72  { n++; }.  }.  r
bd40: 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a  eturn n + 2;.}..
bd50: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
bd60: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
bd70: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74  ointer to an out
bd80: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65 20  put buffer. The 
bd90: 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d  second .** param
bda0: 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
bdb0: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
bdc0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
bdd0: 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77  e offset at.** w
bde0: 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e  hich to write in
bdf0: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
be00: 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  ffer. This funct
be10: 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a  ion copies the.*
be20: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * nul-terminated
be30: 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20   string pointed 
be40: 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64 20  to by the third 
be50: 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e  parameter, zSign
be60: 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74  edIdent,.** to t
be70: 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66 66  he specified off
be80: 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66 65  set in the buffe
be90: 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70  r and updates *p
bea0: 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20  Idx to refer.** 
beb0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
bec0: 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  e after the last
bed0: 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62 65   byte written be
bee0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
bef0: 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74  ** .** If the st
bf00: 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e  ring zSignedIden
bf10: 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  t consists entir
bf20: 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d  ely of alpha-num
bf30: 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65  eric.** characte
bf40: 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  rs, does not beg
bf50: 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74 20  in with a digit 
bf60: 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51  and is not an SQ
bf70: 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68  L keyword,.** th
bf80: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
bf90: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
bfa0: 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73 20  ffer exactly as 
bfb0: 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65  it is. Otherwise
bfc0: 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65  ,.** it is quote
bfd0: 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71  d using double-q
bfe0: 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  uotes..*/.static
bff0: 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63   void identPut(c
c000: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64  har *z, int *pId
c010: 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64  x, char *zSigned
c020: 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e  Ident){.  unsign
c030: 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20  ed char *zIdent 
c040: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
c050: 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a  *)zSignedIdent;.
c060: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64    int i, j, need
c070: 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49  Quote;.  i = *pI
c080: 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  dx;..  for(j=0; 
c090: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
c0a0: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
c0b0: 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b  3Isalnum(zIdent[
c0c0: 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d  j]) && zIdent[j]
c0d0: 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='_' ) break;. 
c0e0: 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d   }.  needQuote =
c0f0: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
c100: 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20  zIdent[0]).     
c110: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
c120: 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64  3KeywordCode(zId
c130: 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20  ent, j)!=TK_ID. 
c140: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a 49             || zI
c150: 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20  dent[j]!=0.     
c160: 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a         || j==0;.
c170: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
c180: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
c190: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
c1a0: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
c1b0: 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74   z[i++] = zIdent
c1c0: 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64  [j];.    if( zId
c1d0: 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b  ent[j]=='"' ) z[
c1e0: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a  i++] = '"';.  }.
c1f0: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
c200: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
c210: 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70    z[i] = 0;.  *p
c220: 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  Idx = i;.}../*.*
c230: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45  * Generate a CRE
c240: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
c250: 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20  ent appropriate 
c260: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  for the given.**
c270: 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20   table.  Memory 
c280: 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74  to hold the text
c290: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
c2a0: 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  t is obtained.**
c2b0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
c2c0: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
c2d0: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
c2e0: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a  lling function..
c2f0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
c300: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
c310: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62  sqlite3 *db, Tab
c320: 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c  le *p){.  int i,
c330: 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a   k, n;.  char *z
c340: 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53  Stmt;.  char *zS
c350: 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e  ep, *zSep2, *zEn
c360: 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  d;.  Column *pCo
c370: 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f  l;.  n = 0;.  fo
c380: 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c  r(pCol = p->aCol
c390: 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  , i=0; i<p->nCol
c3a0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
c3b0: 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65      n += identLe
c3c0: 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ngth(pCol->zName
c3d0: 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b  ) + 5;.  }.  n +
c3e0: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d  = identLength(p-
c3f0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e  >zName);.  if( n
c400: 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70  <50 ){ .    zSep
c410: 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32   = "";.    zSep2
c420: 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64   = ",";.    zEnd
c430: 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b   = ")";.  }else{
c440: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20  .    zSep = "\n 
c450: 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20   ";.    zSep2 = 
c460: 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e  ",\n  ";.    zEn
c470: 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20  d = "\n)";.  }. 
c480: 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e   n += 35 + 6*p->
c490: 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20  nCol;.  zStmt = 
c4a0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
c4b0: 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20  aw(0, n);.  if( 
c4c0: 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  zStmt==0 ){.    
c4d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c4e0: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
c4f0: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
c500: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53  3_snprintf(n, zS
c510: 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42  tmt, "CREATE TAB
c520: 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c  LE ");.  k = sql
c530: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74  ite3Strlen30(zSt
c540: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28  mt);.  identPut(
c550: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e  zStmt, &k, p->zN
c560: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  ame);.  zStmt[k+
c570: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
c580: 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d  pCol=p->aCol, i=
c590: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
c5a0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
c5b0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
c5c0: 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65  r * const azType
c5d0: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f  [] = {.        /
c5e0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  * SQLITE_AFF_TEX
c5f0: 54 20 20 20 20 2a 2f 20 22 20 54 45 58 54 22 2c  T    */ " TEXT",
c600: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
c610: 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 2a  TE_AFF_NONE    *
c620: 2f 20 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  / "",.        /*
c630: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
c640: 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20  RIC */ " NUM",. 
c650: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
c660: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20  _AFF_INTEGER */ 
c670: 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20  " INT",.        
c680: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  /* SQLITE_AFF_RE
c690: 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22  AL    */ " REAL"
c6a0: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
c6b0: 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  len;.    const c
c6c0: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20  har *zType;..   
c6d0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
c6e0: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
c6f0: 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b  , zSep);.    k +
c700: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
c710: 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20  0(&zStmt[k]);.  
c720: 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a    zSep = zSep2;.
c730: 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74      identPut(zSt
c740: 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e  mt, &k, pCol->zN
c750: 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ame);.    assert
c760: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
c770: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54  -SQLITE_AFF_TEXT
c780: 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73   >= 0 );.    ass
c790: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ert( pCol->affin
c7a0: 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ity-SQLITE_AFF_T
c7b0: 45 58 54 20 3c 20 41 72 72 61 79 53 69 7a 65 28  EXT < ArraySize(
c7c0: 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74  azType) );.    t
c7d0: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
c7e0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
c7f0: 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20  AFF_TEXT );.    
c800: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
c810: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
c820: 5f 41 46 46 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20  _AFF_NONE );.   
c830: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
c840: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
c850: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b  E_AFF_NUMERIC );
c860: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
c870: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
c880: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
c890: 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  R );.    testcas
c8a0: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
c8b0: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  y==SQLITE_AFF_RE
c8c0: 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a  AL );.    .    z
c8d0: 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43  Type = azType[pC
c8e0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53  ol->affinity - S
c8f0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 5d 3b  QLITE_AFF_TEXT];
c900: 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  .    len = sqlit
c910: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65  e3Strlen30(zType
c920: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
c930: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
c940: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 0a  QLITE_AFF_NONE .
c950: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
c960: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73  Col->affinity==s
c970: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
c980: 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a  pe(zType, 0) );.
c990: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d      memcpy(&zStm
c9a0: 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e  t[k], zType, len
c9b0: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b  );.    k += len;
c9c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d  .    assert( k<=
c9d0: 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n );.  }.  sqlit
c9e0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c  e3_snprintf(n-k,
c9f0: 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22   &zStmt[k], "%s"
ca00: 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  , zEnd);.  retur
ca10: 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zStmt;.}../*.*
ca20: 2a 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65  * Resize an Inde
ca30: 78 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64  x object to hold
ca40: 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c   N columns total
ca50: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
ca60: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
ca70: 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d  s and SQLITE_NOM
ca80: 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72  EM on an OOM err
ca90: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
caa0: 74 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  t resizeIndexObj
cab0: 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ect(sqlite3 *db,
cac0: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e   Index *pIdx, in
cad0: 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  t N){.  char *zE
cae0: 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74  xtra;.  int nByt
caf0: 65 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e  e;.  if( pIdx->n
cb00: 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75  Column>=N ) retu
cb10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
cb20: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73  assert( pIdx->is
cb30: 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20  Resized==0 );.  
cb40: 6e 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28  nByte = (sizeof(
cb50: 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28  char*) + sizeof(
cb60: 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a  i16) + 1)*N;.  z
cb70: 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44  Extra = sqlite3D
cb80: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
cb90: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45  nByte);.  if( zE
cba0: 78 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e  xtra==0 ) return
cbb0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
cbc0: 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
cbd0: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69  pIdx->azColl, si
cbe0: 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 49 64 78  zeof(char*)*pIdx
cbf0: 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49  ->nColumn);.  pI
cc00: 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68  dx->azColl = (ch
cc10: 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a  ar**)zExtra;.  z
cc20: 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
cc30: 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63  char*)*N;.  memc
cc40: 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d  py(zExtra, pIdx-
cc50: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f  >aiColumn, sizeo
cc60: 66 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43 6f  f(i16)*pIdx->nCo
cc70: 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn);.  pIdx->a
cc80: 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29  iColumn = (i16*)
cc90: 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
cca0: 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a   += sizeof(i16)*
ccb0: 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74  N;.  memcpy(zExt
ccc0: 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ra, pIdx->aSortO
ccd0: 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c  rder, pIdx->nCol
cce0: 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 53  umn);.  pIdx->aS
ccf0: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
cd00: 7a 45 78 74 72 61 3b 0a 20 20 70 49 64 78 2d 3e  zExtra;.  pIdx->
cd10: 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70  nColumn = N;.  p
cd20: 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 20 3d  Idx->isResized =
cd30: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
cd40: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
cd50: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 6f   Estimate the to
cd60: 74 61 6c 20 72 6f 77 20 77 69 64 74 68 20 66 6f  tal row width fo
cd70: 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  r a table..*/.st
cd80: 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61  atic void estima
cd90: 74 65 54 61 62 6c 65 57 69 64 74 68 28 54 61 62  teTableWidth(Tab
cda0: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e 73  le *pTab){.  uns
cdb0: 69 67 6e 65 64 20 77 54 61 62 6c 65 20 3d 20 30  igned wTable = 0
cdc0: 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e  ;.  const Column
cdd0: 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e 74   *pTabCol;.  int
cde0: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62   i;.  for(i=pTab
cdf0: 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d  ->nCol, pTabCol=
ce00: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b  pTab->aCol; i>0;
ce10: 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b 29   i--, pTabCol++)
ce20: 7b 0a 20 20 20 20 77 54 61 62 6c 65 20 2b 3d 20  {.    wTable += 
ce30: 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a  pTabCol->szEst;.
ce40: 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e    }.  if( pTab->
ce50: 69 50 4b 65 79 3c 30 20 29 20 77 54 61 62 6c 65  iPKey<0 ) wTable
ce60: 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61  ++;.  pTab->szTa
ce70: 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f  bRow = sqlite3Lo
ce80: 67 45 73 74 28 77 54 61 62 6c 65 2a 34 29 3b 0a  gEst(wTable*4);.
ce90: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  }../*.** Estimat
cea0: 65 20 74 68 65 20 61 76 65 72 61 67 65 20 73 69  e the average si
ceb0: 7a 65 20 6f 66 20 61 20 72 6f 77 20 66 6f 72 20  ze of a row for 
cec0: 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  an index..*/.sta
ced0: 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74  tic void estimat
cee0: 65 49 6e 64 65 78 57 69 64 74 68 28 49 6e 64 65  eIndexWidth(Inde
cef0: 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69  x *pIdx){.  unsi
cf00: 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20 30 3b  gned wIndex = 0;
cf10: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
cf20: 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d  t Column *aCol =
cf30: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
cf40: 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Col;.  for(i=0; 
cf50: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
cf60: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20 78   i++){.    i16 x
cf70: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
cf80: 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  n[i];.    assert
cf90: 28 20 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c 65  ( x<pIdx->pTable
cfa0: 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77 49  ->nCol );.    wI
cfb0: 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31 20  ndex += x<0 ? 1 
cfc0: 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43  : aCol[pIdx->aiC
cfd0: 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b  olumn[i]].szEst;
cfe0: 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a 49  .  }.  pIdx->szI
cff0: 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  dxRow = sqlite3L
d000: 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34 29 3b  ogEst(wIndex*4);
d010: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72  .}../* Return tr
d020: 75 65 20 69 66 20 76 61 6c 75 65 20 78 20 69 73  ue if value x is
d030: 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20 74 68   found any of th
d040: 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74  e first nCol ent
d050: 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a  ries of aiCol[].
d060: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
d070: 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31  sColumn(const i1
d080: 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43  6 *aiCol, int nC
d090: 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77 68  ol, int x){.  wh
d0a0: 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20  ile( nCol-- > 0 
d0b0: 29 20 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c  ) if( x==*(aiCol
d0c0: 2b 2b 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ++) ) return 1;.
d0d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
d0e0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
d0f0: 65 20 72 75 6e 73 20 61 74 20 74 68 65 20 65 6e  e runs at the en
d100: 64 20 6f 66 20 70 61 72 73 69 6e 67 20 61 20 43  d of parsing a C
d110: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
d120: 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61  ement that.** ha
d130: 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  s a WITHOUT ROWI
d140: 44 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6a  D clause.  The j
d150: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
d160: 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76 65 72 74  ne is to convert
d170: 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61   both.** interna
d180: 6c 20 73 63 68 65 6d 61 20 64 61 74 61 20 73 74  l schema data st
d190: 72 75 63 74 75 72 65 73 20 61 6e 64 20 74 68 65  ructures and the
d1a0: 20 67 65 6e 65 72 61 74 65 64 20 56 44 42 45 20   generated VDBE 
d1b0: 63 6f 64 65 20 73 6f 20 74 68 61 74 20 74 68 65  code so that the
d1c0: 79 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f 70 72  y.** are appropr
d1d0: 69 61 74 65 20 66 6f 72 20 61 20 57 49 54 48 4f  iate for a WITHO
d1e0: 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20 69  UT ROWID table i
d1f0: 6e 73 74 65 61 64 20 6f 66 20 61 20 72 6f 77 69  nstead of a rowi
d200: 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e  d table..** Chan
d210: 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a  ges include:.**.
d220: 2a 2a 20 20 20 20 20 28 31 29 20 20 43 6f 6e 76  **     (1)  Conv
d230: 65 72 74 20 74 68 65 20 4f 50 5f 43 72 65 61 74  ert the OP_Creat
d240: 65 54 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f  eTable into an O
d250: 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2e 20 20  P_CreateIndex.  
d260: 54 68 65 72 65 20 69 73 0a 2a 2a 20 20 20 20 20  There is.**     
d270: 20 20 20 20 20 6e 6f 20 72 6f 77 69 64 20 62 74       no rowid bt
d280: 72 65 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55  ree for a WITHOU
d290: 54 20 52 4f 57 49 44 2e 20 20 49 6e 73 74 65 61  T ROWID.  Instea
d2a0: 64 2c 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  d, the canonical
d2b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 64 61 74  .**          dat
d2c0: 61 20 73 74 6f 72 61 67 65 20 69 73 20 61 20 63  a storage is a c
d2d0: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 74  overing index bt
d2e0: 72 65 65 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20  ree..**     (2) 
d2f0: 20 42 79 70 61 73 73 20 74 68 65 20 63 72 65 61   Bypass the crea
d300: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69  tion of the sqli
d310: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
d320: 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20  entry.**        
d330: 20 20 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52    for the PRIMAR
d340: 59 20 4b 45 59 20 61 73 20 74 68 65 20 70 72 69  Y KEY as the pri
d350: 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 69  mary key index i
d360: 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  s now.**        
d370: 20 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20    identified by 
d380: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
d390: 72 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6f 66  r table entry of
d3a0: 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
d3b0: 66 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 53  f..**     (3)  S
d3c0: 65 74 20 74 68 65 20 49 6e 64 65 78 2e 74 6e 75  et the Index.tnu
d3d0: 6d 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  m of the PRIMARY
d3e0: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
d3f0: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  t in the.**     
d400: 20 20 20 20 20 73 63 68 65 6d 61 20 74 6f 20 74       schema to t
d410: 68 65 20 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d  he rootpage from
d420: 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
d430: 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53 65 74  .**     (4)  Set
d440: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   all columns of 
d450: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d460: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f  schema object to
d470: 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a   be NOT NULL..**
d480: 20 20 20 20 20 28 35 29 20 20 41 64 64 20 61 6c       (5)  Add al
d490: 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  l table columns 
d4a0: 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  to the PRIMARY K
d4b0: 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 0a  EY Index object.
d4c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 20 74  **          so t
d4d0: 68 61 74 20 74 68 65 20 50 52 49 4d 41 52 59 20  hat the PRIMARY 
d4e0: 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72 69 6e  KEY is a coverin
d4f0: 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20 73 75  g index.  The su
d500: 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20 20 20  rplus.**        
d510: 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61    columns are pa
d520: 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e 58  rt of KeyInfo.nX
d530: 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20 6e 6f  Field and are no
d540: 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20  t used for.**   
d550: 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67 20 6f         sorting o
d560: 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e 69 71  r lookup or uniq
d570: 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e 0a 2a  ueness checks..*
d580: 2a 20 20 20 20 20 28 36 29 20 20 52 65 70 6c 61  *     (6)  Repla
d590: 63 65 20 74 68 65 20 72 6f 77 69 64 20 74 61 69  ce the rowid tai
d5a0: 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d 61 74  l on all automat
d5b0: 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64  ically generated
d5c0: 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20 20 20   UNIQUE.**      
d5d0: 20 20 20 20 69 6e 64 69 63 65 73 20 77 69 74 68      indices with
d5e0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d5f0: 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61   columns..*/.sta
d600: 74 69 63 20 76 6f 69 64 20 63 6f 6e 76 65 72 74  tic void convert
d610: 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61  ToWithoutRowidTa
d620: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
d630: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  e, Table *pTab){
d640: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
d650: 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20    Index *pPk;.  
d660: 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 69  int nPk;.  int i
d670: 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  , j;.  sqlite3 *
d680: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d690: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
d6a0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 2f  rse->pVdbe;..  /
d6b0: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 4f 50  * Convert the OP
d6c0: 5f 43 72 65 61 74 65 54 61 62 6c 65 20 6f 70 63  _CreateTable opc
d6d0: 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  ode that would n
d6e0: 6f 72 6d 61 6c 6c 79 20 63 72 65 61 74 65 20 74  ormally create t
d6f0: 68 65 0a 20 20 2a 2a 20 72 6f 6f 74 2d 70 61 67  he.  ** root-pag
d700: 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  e for the table 
d710: 69 6e 74 6f 20 61 6e 20 4f 50 5f 43 72 65 61 74  into an OP_Creat
d720: 65 49 6e 64 65 78 20 6f 70 63 6f 64 65 2e 20 20  eIndex opcode.  
d730: 54 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63  The index.  ** c
d740: 72 65 61 74 65 64 20 77 69 6c 6c 20 62 65 63 6f  reated will beco
d750: 6d 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  me the PRIMARY K
d760: 45 59 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20  EY index..  */. 
d770: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64   if( pParse->add
d780: 72 43 72 54 61 62 20 29 7b 0a 20 20 20 20 61 73  rCrTab ){.    as
d790: 73 65 72 74 28 20 76 20 29 3b 0a 20 20 20 20 73  sert( v );.    s
d7a0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
d7b0: 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43  v, pParse->addrC
d7c0: 72 54 61 62 29 2d 3e 6f 70 63 6f 64 65 20 3d 20  rTab)->opcode = 
d7d0: 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 3b 0a  OP_CreateIndex;.
d7e0: 20 20 7d 0a 0a 20 20 2f 2a 20 42 79 70 61 73 73    }..  /* Bypass
d7f0: 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
d800: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d810: 20 62 74 72 65 65 20 61 6e 64 20 74 68 65 20 73   btree and the s
d820: 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a  qlite_master.  *
d830: 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a 20  * table entry.. 
d840: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
d850: 2d 3e 61 64 64 72 53 6b 69 70 50 4b 20 29 7b 0a  ->addrSkipPK ){.
d860: 20 20 20 20 61 73 73 65 72 74 28 20 76 20 29 3b      assert( v );
d870: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
d880: 47 65 74 4f 70 28 76 2c 20 70 50 61 72 73 65 2d  GetOp(v, pParse-
d890: 3e 61 64 64 72 53 6b 69 70 50 4b 29 2d 3e 6f 70  >addrSkipPK)->op
d8a0: 63 6f 64 65 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a  code = OP_Goto;.
d8b0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
d8c0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
d8d0: 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66 20   index.  Or, if 
d8e0: 74 68 69 73 20 74 61 62 6c 65 20 77 61 73 20 6f  this table was o
d8f0: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61  riginally.  ** a
d900: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
d910: 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63 72 65  Y KEY table, cre
d920: 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d 41 52  ate a new PRIMAR
d930: 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20 20  Y KEY index. .  
d940: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69  */.  if( pTab->i
d950: 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45  PKey>=0 ){.    E
d960: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
d970: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
d980: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
d990: 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b  d(pParse, 0, 0);
d9a0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
d9b0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
d9c0: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pList->a[0].zNam
d9d0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
d9e0: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  Dup(pParse->db,.
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da10: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43          pTab->aC
da20: 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e  ol[pTab->iPKey].
da30: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73  zName);.    pLis
da40: 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  t->a[0].sortOrde
da50: 72 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b 53  r = pParse->iPkS
da60: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 61 73  ortOrder;.    as
da70: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e  sert( pParse->pN
da80: 65 77 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b  ewTable==pTab );
da90: 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74  .    pPk = sqlit
daa0: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
dab0: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70  arse, 0, 0, 0, p
dac0: 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43  List, pTab->keyC
dad0: 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  onf, 0, 0, 0, 0)
dae0: 3b 0a 20 20 20 20 69 66 28 20 70 50 6b 3d 3d 30  ;.    if( pPk==0
daf0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
db00: 50 6b 2d 3e 69 64 78 54 79 70 65 20 3d 20 53 51  Pk->idxType = SQ
db10: 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49  LITE_IDXTYPE_PRI
db20: 4d 41 52 59 4b 45 59 3b 0a 20 20 20 20 70 54 61  MARYKEY;.    pTa
db30: 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20  b->iPKey = -1;. 
db40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 20   }else{.    pPk 
db50: 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
db60: 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
db70: 20 20 7d 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76    }.  pPk->isCov
db80: 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 61 73 73  ering = 1;.  ass
db90: 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20  ert( pPk!=0 );. 
dba0: 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79   nPk = pPk->nKey
dbb0: 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  Col;..  /* Make 
dbc0: 73 75 72 65 20 65 76 65 72 79 20 63 6f 6c 75 6d  sure every colum
dbd0: 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  n of the PRIMARY
dbe0: 20 4b 45 59 20 69 73 20 4e 4f 54 20 4e 55 4c 4c   KEY is NOT NULL
dbf0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
dc00: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
dc10: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e  pTab->aCol[pPk->
dc20: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74  aiColumn[i]].not
dc30: 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Null = 1;.  }.  
dc40: 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  pPk->uniqNotNull
dc50: 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65 20   = 1;..  /* The 
dc60: 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
dc70: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20   PRIMARY KEY is 
dc80: 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 20 70  the table root p
dc90: 61 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e  age */.  pPk->tn
dca0: 75 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b  um = pTab->tnum;
dcb0: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
dcc0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
dcd0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c  esentation of al
dce0: 6c 20 55 4e 49 51 55 45 20 69 6e 64 69 63 65 73  l UNIQUE indices
dcf0: 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20   by converting. 
dd00: 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   ** the final ro
dd10: 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20  wid column into 
dd20: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75  one or more colu
dd30: 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41  mns of the PRIMA
dd40: 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66  RY KEY..  */.  f
dd50: 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
dd60: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
dd70: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
dd80: 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66     int n;.    if
dd90: 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e  ( IsPrimaryKeyIn
dda0: 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e 74  dex(pIdx) ) cont
ddb0: 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d  inue;.    for(i=
ddc0: 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29  n=0; i<nPk; i++)
ddd0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73  {.      if( !has
dde0: 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43  Column(pIdx->aiC
ddf0: 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65  olumn, pIdx->nKe
de00: 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c  yCol, pPk->aiCol
de10: 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20  umn[i]) ) n++;. 
de20: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d     }.    if( n==
de30: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
de40: 69 73 20 69 6e 64 65 78 20 69 73 20 61 20 73 75  is index is a su
de50: 70 65 72 73 65 74 20 6f 66 20 74 68 65 20 70 72  perset of the pr
de60: 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20  imary key */.   
de70: 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e     pIdx->nColumn
de80: 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   = pIdx->nKeyCol
de90: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
dea0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
deb0: 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63  resizeIndexObjec
dec0: 74 28 64 62 2c 20 70 49 64 78 2c 20 70 49 64 78  t(db, pIdx, pIdx
ded0: 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72  ->nKeyCol+n) ) r
dee0: 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69  eturn;.    for(i
def0: 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79  =0, j=pIdx->nKey
df00: 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29  Col; i<nPk; i++)
df10: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61 73  {.      if( !has
df20: 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43  Column(pIdx->aiC
df30: 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65  olumn, pIdx->nKe
df40: 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c  yCol, pPk->aiCol
df50: 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  umn[i]) ){.     
df60: 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d     pIdx->aiColum
df70: 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f  n[j] = pPk->aiCo
df80: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20  lumn[i];.       
df90: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d   pIdx->azColl[j]
dfa0: 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69   = pPk->azColl[i
dfb0: 5d 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a  ];.        j++;.
dfc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
dfd0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
dfe0: 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e  nColumn>=pIdx->n
dff0: 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20  KeyCol+n );.    
e000: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
e010: 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a  olumn>=j );.  }.
e020: 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61  .  /* Add all ta
e030: 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  ble columns to t
e040: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
e050: 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ndex.  */.  if( 
e060: 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  nPk<pTab->nCol )
e070: 7b 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65  {.    if( resize
e080: 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20  IndexObject(db, 
e090: 70 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29  pPk, pTab->nCol)
e0a0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66   ) return;.    f
e0b0: 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69  or(i=0, j=nPk; i
e0c0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
e0d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61  ){.      if( !ha
e0e0: 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43  sColumn(pPk->aiC
e0f0: 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a  olumn, j, i) ){.
e100: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
e110: 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  j<pPk->nColumn )
e120: 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61  ;.        pPk->a
e130: 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a  iColumn[j] = i;.
e140: 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43          pPk->azC
e150: 6f 6c 6c 5b 6a 5d 20 3d 20 22 42 49 4e 41 52 59  oll[j] = "BINARY
e160: 22 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a  ";.        j++;.
e170: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e180: 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e    assert( pPk->n
e190: 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20  Column==j );.   
e1a0: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
e1b0: 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c 73  Col==j );.  }els
e1c0: 65 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c  e{.    pPk->nCol
e1d0: 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c  umn = pTab->nCol
e1e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
e1f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
e200: 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20  alled to report 
e210: 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68  the final ")" th
e220: 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a  at terminates.**
e230: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
e240: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
e250: 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63   The table struc
e260: 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20  ture that other 
e270: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
e280: 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69  have been buildi
e290: 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ng.** is added t
e2a0: 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68  o the internal h
e2b0: 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75  ash tables, assu
e2c0: 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68  ming no errors h
e2d0: 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e  ave.** occurred.
e2e0: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20  .**.** An entry 
e2f0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73  for the table is
e300: 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73   made in the mas
e310: 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73  ter table on dis
e320: 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69  k, unless.** thi
e330: 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79  s is a temporary
e340: 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e   table or db->in
e350: 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65  it.busy==1.  Whe
e360: 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  n db->init.busy=
e370: 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77  =1.** it means w
e380: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
e390: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
e3a0: 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65  table because we
e3b0: 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74   just.** connect
e3c0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
e3d0: 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68  se or because th
e3e0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
e3f0: 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63  table has.** rec
e400: 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73  ently changed, s
e410: 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  o the entry for 
e420: 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61  this table alrea
e430: 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20  dy exists in.** 
e440: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
e450: 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20  r table.  We do 
e460: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61  not want to crea
e470: 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a  te it again..**.
e480: 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63  ** If the pSelec
e490: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  t argument is no
e4a0: 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73  t NULL, it means
e4b0: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69   that this routi
e4c0: 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64  ne.** was called
e4d0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62   to create a tab
e4e0: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  le generated fro
e4f0: 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20  m a .** "CREATE 
e500: 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c  TABLE ... AS SEL
e510: 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65  ECT ..." stateme
e520: 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20  nt.  The column 
e530: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
e540: 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d  new table will m
e550: 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20  atch the result 
e560: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
e570: 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  T..*/.void sqlit
e580: 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61  e3EndTable(.  Pa
e590: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
e5a0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
e5b0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
e5c0: 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20  n *pCons,       
e5d0: 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74      /* The ',' t
e5e0: 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c  oken after the l
e5f0: 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e  ast column defn.
e600: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e   */.  Token *pEn
e610: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
e620: 20 54 68 65 20 27 29 27 20 62 65 66 6f 72 65 20   The ')' before 
e630: 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 43  options in the C
e640: 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20  REATE TABLE */. 
e650: 20 75 38 20 74 61 62 4f 70 74 73 2c 20 20 20 20   u8 tabOpts,    
e660: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
e670: 61 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e  a table options.
e680: 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20   Usually 0. */. 
e690: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
e6a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65           /* Sele
e6b0: 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54  ct from a "CREAT
e6c0: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22  E ... AS SELECT"
e6d0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
e6e0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
e6f0: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74 61     /* The new ta
e700: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
e710: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
e720: 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  b; /* The databa
e730: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
e740: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
e750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e760: 44 61 74 61 62 61 73 65 20 69 6e 20 77 68 69 63  Database in whic
e770: 68 20 74 68 65 20 74 61 62 6c 65 20 6c 69 76 65  h the table live
e780: 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  s */.  Index *pI
e790: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
e7a0: 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20 69   /* An implied i
e7b0: 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c  ndex of the tabl
e7c0: 65 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 45 6e  e */..  if( (pEn
e7d0: 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d  d==0 && pSelect=
e7e0: 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  =0) || db->mallo
e7f0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
e800: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d  eturn;.  }.  p =
e810: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
e820: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  le;.  if( p==0 )
e830: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
e840: 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  rt( !db->init.bu
e850: 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29  sy || !pSelect )
e860: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  ;..  /* If the d
e870: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20  b->init.busy is 
e880: 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72  1 it means we ar
e890: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51  e reading the SQ
e8a0: 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22  L off the.  ** "
e8b0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f  sqlite_master" o
e8c0: 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  r "sqlite_temp_m
e8d0: 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20  aster" table on 
e8e0: 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53  the disk..  ** S
e8f0: 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  o do not write t
e900: 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e  o the disk again
e910: 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72  .  Extract the r
e920: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a  oot page number.
e930: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62    ** for the tab
e940: 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e  le from the db->
e950: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65  init.newTnum fie
e960: 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e  ld.  (The page n
e970: 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c  umber.  ** shoul
e980: 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20  d have been put 
e990: 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c  there by the sql
e9a0: 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e  iteOpenCb routin
e9b0: 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  e.).  */.  if( d
e9c0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
e9d0: 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62      p->tnum = db
e9e0: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a  ->init.newTnum;.
e9f0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61    }..  /* Specia
ea00: 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  l processing for
ea10: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 54   WITHOUT ROWID T
ea20: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 74  ables */.  if( t
ea30: 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69 74 68  abOpts & TF_With
ea40: 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  outRowid ){.    
ea50: 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73  if( (p->tabFlags
ea60: 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
ea70: 65 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ent) ){.      sq
ea80: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ea90: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
eaa0: 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e  "AUTOINCREMENT n
eab0: 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49  ot allowed on WI
eac0: 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
ead0: 65 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  es");.      retu
eae0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rn;.    }.    if
eaf0: 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26  ( (p->tabFlags &
eb00: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
eb10: 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  y)==0 ){.      s
eb20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
eb30: 50 61 72 73 65 2c 20 22 50 52 49 4d 41 52 59 20  Parse, "PRIMARY 
eb40: 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74  KEY missing on t
eb50: 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61  able %s", p->zNa
eb60: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
eb70: 20 20 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67        p->tabFlag
eb80: 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74 52  s |= TF_WithoutR
eb90: 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e 76  owid;.      conv
eba0: 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
ebb0: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  dTable(pParse, p
ebc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
ebd0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
ebe0: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
ebf0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66  ->pSchema);..#if
ec00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ec10: 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f  _CHECK.  /* Reso
ec20: 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c  lve names in all
ec30: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
ec40: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  t expressions.. 
ec50: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68   */.  if( p->pCh
ec60: 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  eck ){.    sqlit
ec70: 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
ec80: 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70  erence(pParse, p
ec90: 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30 2c  , NC_IsCheck, 0,
eca0: 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20 7d   p->pCheck);.  }
ecb0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
ecc0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ecd0: 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20  CHECK) */..  /* 
ece0: 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76 65  Estimate the ave
ecf0: 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66 6f  rage row size fo
ed00: 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  r the table and 
ed10: 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64 20  for all implied 
ed20: 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73 74  indices */.  est
ed30: 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28  imateTableWidth(
ed40: 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70  p);.  for(pIdx=p
ed50: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
ed60: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
ed70: 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65 49  ){.    estimateI
ed80: 6e 64 65 78 57 69 64 74 68 28 70 49 64 78 29 3b  ndexWidth(pIdx);
ed90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
eda0: 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20  t initializing, 
edb0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65  then create a re
edc0: 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77  cord for the new
edd0: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74   table.  ** in t
ede0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
edf0: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61   table of the da
ee00: 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  tabase..  **.  *
ee10: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54  * If this is a T
ee20: 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20  EMPORARY table, 
ee30: 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20  write the entry 
ee40: 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61  into the auxilia
ee50: 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73  ry.  ** file ins
ee60: 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65  tead of into the
ee70: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
ee80: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
ee90: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
eea0: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
eeb0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
eec0: 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a  ar *zType;    /*
eed0: 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c   "view" or "tabl
eee0: 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  e" */.    char *
eef0: 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49  zType2;   /* "VI
ef00: 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a  EW" or "TABLE" *
ef10: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d  /.    char *zStm
ef20: 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  t;    /* Text of
ef30: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
ef40: 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45 57  E or CREATE VIEW
ef50: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20   statement */.. 
ef60: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
ef70: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
ef80: 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d 3d     if( NEVER(v==
ef90: 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  0) ) return;..  
efa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
efb0: 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
efc0: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20 20   0);..    /* .  
efd0: 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    ** Initialize 
efe0: 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e 65  zType for the ne
eff0: 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65 2e  w view or table.
f000: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
f010: 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b  p->pSelect==0 ){
f020: 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67 75  .      /* A regu
f030: 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  lar table */.   
f040: 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62 6c     zType = "tabl
f050: 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32  e";.      zType2
f060: 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66 6e   = "TABLE";.#ifn
f070: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f080: 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  VIEW.    }else{.
f090: 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77 20        /* A view 
f0a0: 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  */.      zType =
f0b0: 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20 7a   "view";.      z
f0c0: 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b 0a  Type2 = "VIEW";.
f0d0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
f0e0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
f0f0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  a CREATE TABLE x
f100: 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 2c  x AS SELECT ...,
f110: 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45 4c   execute the SEL
f120: 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  ECT.    ** state
f130: 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ment to populate
f140: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 20   the new table. 
f150: 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  The root-page nu
f160: 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20 20  mber for the.   
f170: 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69 73   ** new table is
f180: 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50 61   in register pPa
f190: 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20  rse->regRoot..  
f1a0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63 65    **.    ** Once
f1b0: 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73 20   the SELECT has 
f1c0: 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73 71  been coded by sq
f1d0: 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20 69  lite3Select(), i
f1e0: 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a 2a  t is in a.    **
f1f0: 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65 20   suitable state 
f200: 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68 65  to query for the
f210: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e   column names an
f220: 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75 73  d types to be us
f230: 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  ed.    ** by the
f240: 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20 20   new table..    
f250: 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61 72  **.    ** A shar
f260: 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d 6c  ed-cache write-l
f270: 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ock is not requi
f280: 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  red to write to 
f290: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a 20  the new table,. 
f2a0: 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65 6d     ** as a schem
f2b0: 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76 65  a-lock must have
f2c0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 62   already been ob
f2d0: 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74 65  tained to create
f2e0: 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a   it. Since.    *
f2f0: 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20  * a schema-lock 
f300: 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74 68  excludes all oth
f310: 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65 72  er database user
f320: 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63  s, the write-loc
f330: 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62  k would.    ** b
f340: 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20  e redundant..   
f350: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c   */.    if( pSel
f360: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ect ){.      Sel
f370: 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20 20  ectDest dest;.  
f380: 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54      Table *pSelT
f390: 61 62 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  ab;..      asser
f3a0: 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d  t(pParse->nTab==
f3b0: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
f3c0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
f3d0: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
f3e0: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c  pParse->regRoot,
f3f0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
f400: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
f410: 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53 52  (v, OPFLAG_P2ISR
f420: 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  EG);.      pPars
f430: 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20  e->nTab = 2;.   
f440: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
f450: 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c 20  DestInit(&dest, 
f460: 53 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a 20  SRT_Table, 1);. 
f470: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
f480: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
f490: 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20  ct, &dest);.    
f4a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f4b0: 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
f4c0: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
f4d0: 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
f4e0: 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61  {.        pSelTa
f4f0: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
f500: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
f510: 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  rse, pSelect);. 
f520: 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c 54         if( pSelT
f530: 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ab==0 ) return;.
f540: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f550: 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20  p->aCol==0 );.  
f560: 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20        p->nCol = 
f570: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
f580: 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d         p->aCol =
f590: 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a   pSelTab->aCol;.
f5a0: 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d          pSelTab-
f5b0: 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
f5c0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
f5d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
f5e0: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
f5f0: 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20  (db, pSelTab);. 
f600: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
f610: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
f620: 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
f630: 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  f the CREATE sta
f640: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66  tement */.    if
f650: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
f660: 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74     zStmt = creat
f670: 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70  eTableStmt(db, p
f680: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
f690: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32      Token *pEnd2
f6a0: 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26 70 50   = tabOpts ? &pP
f6b0: 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
f6c0: 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e   : pEnd;.      n
f6d0: 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e   = (int)(pEnd2->
f6e0: 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  z - pParse->sNam
f6f0: 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20  eToken.z);.     
f700: 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d   if( pEnd2->z[0]
f710: 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e  !=';' ) n += pEn
f720: 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74  d2->n;.      zSt
f730: 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
f740: 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20  ntf(db, .       
f750: 20 20 20 22 43 52 45 41 54 45 20 25 73 20 25 2e     "CREATE %s %.
f760: 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20  *s", zType2, n, 
f770: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
f780: 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20  en.z.      );.  
f790: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c    }..    /* A sl
f7a0: 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  ot for the recor
f7b0: 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  d has already be
f7c0: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  en allocated in 
f7d0: 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49  the .    ** SQLI
f7e0: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
f7f0: 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74    We just need t
f800: 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c  o update that sl
f810: 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20  ot with all.    
f820: 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  ** the informati
f830: 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74  on we've collect
f840: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
f850: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
f860: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
f870: 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a  "UPDATE %Q.%s ".
f880: 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74 79           "SET ty
f890: 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51  pe='%s', name=%Q
f8a0: 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72  , tbl_name=%Q, r
f8b0: 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71 6c  ootpage=#%d, sql
f8c0: 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48  =%Q ".       "WH
f8d0: 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a  ERE rowid=#%d",.
f8e0: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
f8f0: 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
f900: 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
f910: 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20     zType,.      
f920: 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
f930: 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
f940: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c  pParse->regRoot,
f950: 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20  .      zStmt,.  
f960: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52      pParse->regR
f970: 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20  owid.    );.    
f980: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
f990: 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  , zStmt);.    sq
f9a0: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
f9b0: 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
f9c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f9d0: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
f9e0: 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  NT.    /* Check 
f9f0: 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65  to see if we nee
fa00: 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73  d to create an s
fa10: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
fa20: 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20  able for.    ** 
fa30: 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66  keeping track of
fa40: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b   autoincrement k
fa50: 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eys..    */.    
fa60: 69 66 28 20 70 2d 3e 74 61 62 46 6c 61 67 73 20  if( p->tabFlags 
fa70: 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
fa80: 6e 74 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a  nt ){.      Db *
fa90: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
faa0: 44 62 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Db];.      asser
fab0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
fac0: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
fad0: 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20 69  b, 0) );.      i
fae0: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
faf0: 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20  >pSeqTab==0 ){. 
fb00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65         sqlite3Ne
fb10: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
fb20: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45  ,.          "CRE
fb30: 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c  ATE TABLE %Q.sql
fb40: 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d  ite_sequence(nam
fb50: 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20  e,seq)",.       
fb60: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20     pDb->zName.  
fb70: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
fb80: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
fb90: 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76     /* Reparse ev
fba0: 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61  erything to upda
fbb0: 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  te our internal 
fbc0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
fbd0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
fbe0: 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61  beAddParseSchema
fbf0: 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20  Op(v, iDb,.     
fc00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
fc10: 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61  intf(db, "tbl_na
fc20: 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65  me='%q' AND type
fc30: 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20 70 2d  !='trigger'", p-
fc40: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a  >zName));.  }...
fc50: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62    /* Add the tab
fc60: 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d  le to the in-mem
fc70: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
fc80: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
fc90: 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  se..  */.  if( d
fca0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
fcb0: 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b      Table *pOld;
fcc0: 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63  .    Schema *pSc
fcd0: 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d  hema = p->pSchem
fce0: 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  a;.    assert( s
fcf0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
fd00: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
fd10: 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  ) );.    pOld = 
fd20: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
fd30: 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
fd40: 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70  ash, p->zName, p
fd50: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20  );.    if( pOld 
fd60: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
fd70: 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20   p==pOld );  /* 
fd80: 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
fd90: 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48   failed inside H
fda0: 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20  ashInsert() */. 
fdb0: 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
fdc0: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
fdd0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
fde0: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
fdf0: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
fe00: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
fe10: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
fe20: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
fe30: 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
fe40: 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65  .    if( !p->pSe
fe50: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f  lect ){.      co
fe60: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
fe70: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
fe80: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
fe90: 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20  en.z;.      int 
fea0: 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73  nName;.      ass
feb0: 65 72 74 28 20 21 70 53 65 6c 65 63 74 20 26 26  ert( !pSelect &&
fec0: 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29   pCons && pEnd )
fed0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e  ;.      if( pCon
fee0: 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  s->z==0 ){.     
fef0: 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b     pCons = pEnd;
ff00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
ff10: 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28 28 63 6f  Name = (int)((co
ff20: 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73  nst char *)pCons
ff30: 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->z - zName);.  
ff40: 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66      p->addColOff
ff50: 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74  set = 13 + sqlit
ff60: 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e  e3Utf8CharLen(zN
ff70: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
ff80: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
ff90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ffa0: 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
ffb0: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
ffc0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   this routine in
ffd0: 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
ffe0: 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76   a new VIEW.*/.v
fff0: 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
10000 65 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a  eView(.  Parse *
10010 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54  pParse,     /* T
10020 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
10030 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
10040 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68  Begin,     /* Th
10050 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
10060 68 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73  hat begins the s
10070 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
10080 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
10090 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
100a0 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
100b0 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
100c0 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
100d0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b  ,     /* The tok
100e0 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
100f0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
10100 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  ew */.  Select *
10110 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20  pSelect,   /* A 
10120 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
10130 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
10140 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a  e the new view *
10150 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20  /.  int isTemp, 
10160 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66         /* TRUE f
10170 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76  or a TEMPORARY v
10180 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45  iew */.  int noE
10190 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  rr          /* S
101a0 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65  uppress error me
101b0 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20 61  ssages if VIEW a
101c0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
101d0 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
101e0 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74    int n;.  const
101f0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65   char *z;.  Toke
10200 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65  n sEnd;.  DbFixe
10210 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20  r sFix;.  Token 
10220 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e  *pName = 0;.  in
10230 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33  t iDb;.  sqlite3
10240 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
10250 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
10260 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20  ->nVar>0 ){.    
10270 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
10280 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74  pParse, "paramet
10290 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ers are not allo
102a0 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a  wed in views");.
102b0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
102c0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
102d0 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
102e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
102f0 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
10300 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
10310 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20  , isTemp, 1, 0, 
10320 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50  noErr);.  p = pP
10330 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
10340 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
10350 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
10360 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
10370 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
10380 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
10390 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77  .  }.  sqlite3Tw
103a0 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
103b0 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
103c0 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62  , &pName);.  iDb
103d0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
103e0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
103f0 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
10400 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
10410 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76   pParse, iDb, "v
10420 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  iew", pName);.  
10430 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 65  if( sqlite3FixSe
10440 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c  lect(&sFix, pSel
10450 65 63 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ect) ){.    sqli
10460 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
10470 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
10480 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
10490 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
104a0 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45  of the entire SE
104b0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
104c0 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
104d0 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20  view..  ** This 
104e0 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74  will force all t
104f0 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20  he Expr.token.z 
10500 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e  values to be dyn
10510 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c  amically.  ** al
10520 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74  located rather t
10530 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  han point to the
10540 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20   input string - 
10550 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
10560 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20  .  ** they will 
10570 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68  persist after th
10580 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65  e current sqlite
10590 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65  3_exec() call re
105a0 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d  turns..  */.  p-
105b0 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
105c0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
105d0 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50  pSelect, EXPRDUP
105e0 5f 52 45 44 55 43 45 29 3b 0a 20 20 73 71 6c 69  _REDUCE);.  sqli
105f0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
10600 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
10610 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
10620 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
10630 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64  rn;.  }.  if( !d
10640 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
10650 20 20 20 20 73 71 6c 69 74 65 33 56 69 65 77 47      sqlite3ViewG
10660 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
10670 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20  arse, p);.  }.. 
10680 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65   /* Locate the e
10690 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
106a0 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e   VIEW statement.
106b0 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e    Make sEnd poin
106c0 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e  t to.  ** the en
106d0 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d  d..  */.  sEnd =
106e0 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
106f0 6b 65 6e 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  ken;.  if( ALWAY
10700 53 28 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 29 20  S(sEnd.z[0]!=0) 
10710 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b  && sEnd.z[0]!=';
10720 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20  ' ){.    sEnd.z 
10730 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20  += sEnd.n;.  }. 
10740 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e   sEnd.n = 0;.  n
10750 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20   = (int)(sEnd.z 
10760 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20  - pBegin->z);.  
10770 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20  z = pBegin->z;. 
10780 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 6e   while( ALWAYS(n
10790 3e 30 29 20 26 26 20 73 71 6c 69 74 65 33 49 73  >0) && sqlite3Is
107a0 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b  space(z[n-1]) ){
107b0 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a   n--; }.  sEnd.z
107c0 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45   = &z[n-1];.  sE
107d0 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  nd.n = 1;..  /* 
107e0 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61  Use sqlite3EndTa
107f0 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65  ble() to add the
10800 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c   view to the SQL
10810 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
10820 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64   */.  sqlite3End
10830 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c  Table(pParse, 0,
10840 20 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 20   &sEnd, 0, 0);. 
10850 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69   return;.}.#endi
10860 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
10870 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64  _VIEW */..#if !d
10880 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
10890 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
108a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
108b0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f  _VIRTUALTABLE)./
108c0 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
108d0 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20  tructure pTable 
108e0 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57  is really a VIEW
108f0 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e  .  Fill in the n
10900 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63  ames of.** the c
10910 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69  olumns of the vi
10920 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65  ew in the pTable
10930 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74   structure.  Ret
10940 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a  urn the number.*
10950 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  * of errors.  If
10960 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
10970 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  n leave an error
10980 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
10990 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  se->zErrMsg..*/.
109a0 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77 47  int sqlite3ViewG
109b0 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61  etColumnNames(Pa
109c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
109d0 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54  le *pTable){.  T
109e0 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20  able *pSelTab;  
109f0 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65   /* A fake table
10a00 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67   from which we g
10a10 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  et the result se
10a20 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
10a30 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79  Sel;     /* Copy
10a40 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 74   of the SELECT t
10a50 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
10a60 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  he view */.  int
10a70 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f   nErr = 0;     /
10a80 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  * Number of erro
10a90 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a  rs encountered *
10aa0 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
10ab0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
10ac0 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e  rily holds the n
10ad0 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
10ae0 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73   assigned */.  s
10af0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
10b00 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
10b10 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
10b20 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f   for malloc erro
10b30 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rs */.  sqlite3_
10b40 78 61 75 74 68 20 78 41 75 74 68 3b 20 20 20 20  xauth xAuth;    
10b50 20 20 20 2f 2a 20 53 61 76 65 64 20 78 41 75 74     /* Saved xAut
10b60 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a 20 20  h pointer */..  
10b70 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29  assert( pTable )
10b80 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
10b90 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
10ba0 42 4c 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65  BLE.  if( sqlite
10bb0 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74  3VtabCallConnect
10bc0 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29  (pParse, pTable)
10bd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10be0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
10bf0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
10c00 28 70 54 61 62 6c 65 29 20 29 20 72 65 74 75 72  (pTable) ) retur
10c10 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  n 0;.#endif..#if
10c20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10c30 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73  _VIEW.  /* A pos
10c40 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73  itive nCol means
10c50 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d   the columns nam
10c60 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77  es for this view
10c70 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64   are.  ** alread
10c80 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20  y known..  */.  
10c90 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
10ca0 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  >0 ) return 0;..
10cb0 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20    /* A negative 
10cc0 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61  nCol is a specia
10cd0 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67  l marker meaning
10ce0 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72   that we are cur
10cf0 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69  rently.  ** tryi
10d00 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ng to compute th
10d10 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  e column names. 
10d20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69   If we enter thi
10d30 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20  s routine with. 
10d40 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e   ** a negative n
10d50 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77  Col, it means tw
10d60 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20  o or more views 
10d70 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b  form a loop, lik
10d80 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a  e this:.  **.  *
10d90 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45  *     CREATE VIE
10da0 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20  W one AS SELECT 
10db0 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a  * FROM two;.  **
10dc0 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
10dd0 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a   two AS SELECT *
10de0 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a   FROM one;.  **.
10df0 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74    ** Actually, t
10e00 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20 69  he error above i
10e10 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69  s now caught pri
10e20 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74  or to reaching t
10e30 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20  his point..  ** 
10e40 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  But the followin
10e50 67 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c 20  g test is still 
10e60 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74 20  important as it 
10e70 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a  does come up.  *
10e80 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * in the followi
10e90 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20  ng:.  ** .  **  
10ea0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
10eb0 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a  main.ex1(a);.  *
10ec0 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d  *     CREATE TEM
10ed0 50 20 56 49 45 57 20 65 78 31 20 41 53 20 53 45  P VIEW ex1 AS SE
10ee0 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31 3b  LECT a FROM ex1;
10ef0 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
10f00 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31   * FROM temp.ex1
10f10 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ;.  */.  if( pTa
10f20 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20  ble->nCol<0 ){. 
10f30 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
10f40 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
10f50 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c   %s is circularl
10f60 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62  y defined", pTab
10f70 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  le->zName);.    
10f80 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
10f90 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
10fa0 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nCol>=0 );..  /*
10fb0 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
10fc0 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65  far, it means we
10fd0 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   need to compute
10fe0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73   the table names
10ff0 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74  ..  ** Note that
11000 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
11010 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
11020 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70  elect() will exp
11030 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22  and any.  ** "*"
11040 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
11050 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20   results set of 
11060 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c  the view and wil
11070 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73  l assign cursors
11080 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65  .  ** to the ele
11090 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f  ments of the FRO
110a0 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77  M clause.  But w
110b0 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68  e do not want th
110c0 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  ese changes.  **
110d0 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74   to be permanent
110e0 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74  .  So the comput
110f0 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e  ation is done on
11100 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53   a copy of the S
11110 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65  ELECT.  ** state
11120 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65  ment that define
11130 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f  s the view..  */
11140 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
11150 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20  e->pSelect );.  
11160 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65  pSel = sqlite3Se
11170 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62  lectDup(db, pTab
11180 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b  le->pSelect, 0);
11190 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20  .  if( pSel ){. 
111a0 20 20 20 75 38 20 65 6e 61 62 6c 65 4c 6f 6f 6b     u8 enableLook
111b0 61 73 69 64 65 20 3d 20 64 62 2d 3e 6c 6f 6f 6b  aside = db->look
111c0 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3b 0a  aside.bEnabled;.
111d0 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e      n = pParse->
111e0 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65  nTab;.    sqlite
111f0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
11200 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53  rsors(pParse, pS
11210 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70  el->pSrc);.    p
11220 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31  Table->nCol = -1
11230 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  ;.    db->lookas
11240 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30  ide.bEnabled = 0
11250 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
11260 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
11270 49 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20  ION.    xAuth = 
11280 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64  db->xAuth;.    d
11290 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20  b->xAuth = 0;.  
112a0 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
112b0 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
112c0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
112d0 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74  l);.    db->xAut
112e0 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65  h = xAuth;.#else
112f0 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73  .    pSelTab = s
11300 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
11310 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
11320 70 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  pSel);.#endif.  
11330 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
11340 62 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c  bEnabled = enabl
11350 65 4c 6f 6f 6b 61 73 69 64 65 3b 0a 20 20 20 20  eLookaside;.    
11360 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e  pParse->nTab = n
11370 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54 61  ;.    if( pSelTa
11380 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  b ){.      asser
11390 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d  t( pTable->aCol=
113a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  =0 );.      pTab
113b0 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54  le->nCol = pSelT
113c0 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
113d0 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70  pTable->aCol = p
113e0 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20  SelTab->aCol;.  
113f0 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
11400 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65  l = 0;.      pSe
11410 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  lTab->aCol = 0;.
11420 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
11430 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65  eteTable(db, pSe
11440 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 61 73 73  lTab);.      ass
11450 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
11460 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
11470 30 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  0, pTable->pSche
11480 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 70 54 61  ma) );.      pTa
11490 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63  ble->pSchema->sc
114a0 68 65 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f  hemaFlags |= DB_
114b0 55 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20  UnresetViews;.  
114c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
114d0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  Table->nCol = 0;
114e0 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  .      nErr++;. 
114f0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
11500 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
11510 20 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73 65   pSel);.  } else
11520 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20   {.    nErr++;. 
11530 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
11540 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
11550 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20  .  return nErr; 
11560 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64   .}.#endif /* !d
11570 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11580 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
11590 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
115a0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a  _VIRTUALTABLE) *
115b0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
115c0 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
115d0 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
115e0 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76  mn names from ev
115f0 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61  ery VIEW in data
11600 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61  base idx..*/.sta
11610 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56  tic void sqliteV
11620 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69  iewResetAll(sqli
11630 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78  te3 *db, int idx
11640 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
11650 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11660 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
11670 6c 64 28 64 62 2c 20 69 64 78 2c 20 30 29 20 29  ld(db, idx, 0) )
11680 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72  ;.  if( !DbHasPr
11690 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
116a0 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
116b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
116c0 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
116d0 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d  st(&db->aDb[idx]
116e0 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  .pSchema->tblHas
116f0 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61  h); i;i=sqliteHa
11700 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
11710 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
11720 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
11730 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70  .    if( pTab->p
11740 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
11750 73 71 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c 75  sqliteDeleteColu
11760 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62  mnNames(db, pTab
11770 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61  );.      pTab->a
11780 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Col = 0;.      p
11790 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
117a0 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65     }.  }.  DbCle
117b0 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  arProperty(db, i
117c0 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
117d0 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  ews);.}.#else.# 
117e0 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65  define sqliteVie
117f0 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23  wResetAll(A,B).#
11800 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
11810 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a  OMIT_VIEW */../*
11820 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
11830 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
11840 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73  he VDBE to adjus
11850 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  t the internal s
11860 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79  chema.** used by
11870 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65   SQLite when the
11880 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76   btree layer mov
11890 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20  es a table root 
118a0 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f  page. The.** roo
118b0 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t-page of a tabl
118c0 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61  e or index in da
118d0 74 61 62 61 73 65 20 69 44 62 20 68 61 73 20 63  tabase iDb has c
118e0 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f  hanged from iFro
118f0 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a  m.** to iTo..**.
11900 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a  ** Ticket #1728:
11910 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62    The symbol tab
11920 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63  le might still c
11930 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69  ontain informati
11940 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20  on.** on tables 
11950 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74  and/or indices t
11960 68 61 74 20 61 72 65 20 74 68 65 20 70 72 6f 63  hat are the proc
11970 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c  ess of being del
11980 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20  eted..** If you 
11990 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65  are unlucky, one
119a0 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65   of those delete
119b0 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62  d indices or tab
119c0 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76  les might.** hav
119d0 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70  e the same rootp
119e0 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68  age number as th
119f0 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20  e real table or 
11a00 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a  index that is.**
11a10 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53   being moved.  S
11a20 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70  o we cannot stop
11a30 20 73 65 61 72 63 68 69 6e 67 20 61 66 74 65 72   searching after
11a40 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
11a50 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65   .** because the
11a60 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67   first match mig
11a70 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66  ht be for one of
11a80 20 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64   the deleted ind
11a90 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65  ices.** or table
11aa0 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61  s and not the ta
11ab0 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69  ble/index that i
11ac0 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67  s actually being
11ad0 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75   moved..** We mu
11ae0 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70  st continue loop
11af0 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61  ing until all ta
11b00 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73  bles and indices
11b10 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67   with.** rootpag
11b20 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65  e==iFrom have be
11b30 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  en converted to 
11b40 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20  have a rootpage 
11b50 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64  of iTo.** in ord
11b60 65 72 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e  er to be certain
11b70 20 74 68 61 74 20 77 65 20 67 6f 74 20 74 68 65   that we got the
11b80 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23   right one..*/.#
11b90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11ba0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f  IT_AUTOVACUUM.vo
11bb0 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61  id sqlite3RootPa
11bc0 67 65 4d 6f 76 65 64 28 73 71 6c 69 74 65 33 20  geMoved(sqlite3 
11bd0 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e  *db, int iDb, in
11be0 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f  t iFrom, int iTo
11bf0 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  ){.  HashElem *p
11c00 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48  Elem;.  Hash *pH
11c10 61 73 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  ash;.  Db *pDb;.
11c20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11c30 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
11c40 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
11c50 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
11c60 62 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73 68 20  b[iDb];.  pHash 
11c70 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  = &pDb->pSchema-
11c80 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28  >tblHash;.  for(
11c90 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
11ca0 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45  First(pHash); pE
11cb0 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
11cc0 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
11cd0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
11ce0 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
11cf0 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
11d00 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d  if( pTab->tnum==
11d10 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
11d20 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Tab->tnum = iTo;
11d30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61  .    }.  }.  pHa
11d40 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65  sh = &pDb->pSche
11d50 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66  ma->idxHash;.  f
11d60 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
11d70 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b  ashFirst(pHash);
11d80 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
11d90 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
11da0 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  em)){.    Index 
11db0 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61  *pIdx = sqliteHa
11dc0 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
11dd0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75     if( pIdx->tnu
11de0 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  m==iFrom ){.    
11df0 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69    pIdx->tnum = i
11e00 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  To;.    }.  }.}.
11e10 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
11e20 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73  ite code to eras
11e30 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  e the table with
11e40 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
11e50 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20  e from database 
11e60 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69  iDb..** Also wri
11e70 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66  te code to modif
11e80 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  y the sqlite_mas
11e90 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e  ter table and in
11ea0 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a  ternal schema.**
11eb0 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20   if a root-page 
11ec0 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  of another table
11ed0 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65   is moved by the
11ee0 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69   btree-layer whi
11ef0 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69  lst.** erasing i
11f00 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20  Table (this can 
11f10 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
11f20 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
11f30 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  ase)..*/ .static
11f40 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f   void destroyRoo
11f50 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50 61  tPage(Parse *pPa
11f60 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c  rse, int iTable,
11f70 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
11f80 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
11f90 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
11fa0 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
11fb0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
11fc0 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  se);.  sqlite3Vd
11fd0 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44  beAddOp3(v, OP_D
11fe0 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20  estroy, iTable, 
11ff0 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  r1, iDb);.  sqli
12000 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72  te3MayAbort(pPar
12010 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  se);.#ifndef SQL
12020 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
12030 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74  UUM.  /* OP_Dest
12040 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e  roy stores an in
12050 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20   integer r1. If 
12060 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a  this integer.  *
12070 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  * is non-zero, t
12080 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f  hen it is the ro
12090 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
120a0 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20  f a table moved 
120b0 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e  to.  ** location
120c0 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c   iTable. The fol
120d0 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69  lowing code modi
120e0 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f  fies the sqlite_
120f0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a  master table to.
12100 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69    ** reflect thi
12110 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
12120 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53   "#NNN" in the S
12130 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  QL is a special 
12140 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65  constant that me
12150 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c  ans whatever val
12160 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65  ue.  ** is in re
12170 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65  gister NNN.  See
12180 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20 61   grammar rules a
12190 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
121a0 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20  he TK_REGISTER. 
121b0 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64   ** token for ad
121c0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
121d0 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  tion..  */.  sql
121e0 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
121f0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55  pParse, .     "U
12200 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20  PDATE %Q.%s SET 
12210 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52  rootpage=%d WHER
12220 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61  E #%d AND rootpa
12230 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50  ge=#%d",.     pP
12240 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
12250 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
12260 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61  _TABLE(iDb), iTa
12270 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65  ble, r1, r1);.#e
12280 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65  ndif.  sqlite3Re
12290 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
122a0 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a  rse, r1);.}../*.
122b0 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63 6f  ** Write VDBE co
122c0 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c  de to erase tabl
122d0 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61  e pTab and all a
122e0 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65  ssociated indice
122f0 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f  s on disk..** Co
12300 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  de to update the
12310 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
12320 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e  ables and intern
12330 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69  al schema defini
12340 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65  tions.** in case
12350 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c   a root-page bel
12360 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65  onging to anothe
12370 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
12380 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c 61   by the btree la
12390 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61  yer.** is also a
123a0 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20 68  dded (this can h
123b0 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75  appen with an au
123c0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
123d0 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  se)..*/.static v
123e0 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65  oid destroyTable
123f0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
12400 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69  Table *pTab){.#i
12410 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
12420 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e  _AUTOVACUUM.  In
12430 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74  dex *pIdx;.  int
12440 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
12450 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
12460 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
12470 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f  chema);.  destro
12480 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
12490 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44  , pTab->tnum, iD
124a0 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70  b);.  for(pIdx=p
124b0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
124c0 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
124d0 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f  ext){.    destro
124e0 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
124f0 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44  , pIdx->tnum, iD
12500 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  b);.  }.#else.  
12510 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
12520 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76  se may be auto-v
12530 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69  acuum capable (i
12540 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
12550 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73  TOVACUUM.  ** is
12560 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74   not defined), t
12570 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74  hen it is import
12580 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44  ant to call OP_D
12590 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20  estroy on the.  
125a0 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  ** table and ind
125b0 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e  ex root-pages in
125c0 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67   order, starting
125d0 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69   with the numeri
125e0 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67  cally .  ** larg
125f0 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  est root-page nu
12600 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72 61  mber. This guara
12610 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20  ntees that none 
12620 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  of the root-page
12630 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73  s.  ** to be des
12640 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61  troyed is reloca
12650 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ted by an earlie
12660 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e  r OP_Destroy. i.
12670 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66  e. if the.  ** f
12680 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f  ollowing were co
12690 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f  ded:.  **.  ** O
126a0 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20  P_Destroy 4 0.  
126b0 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44  ** ....  ** OP_D
126c0 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a  estroy 5 0.  **.
126d0 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61    ** and root pa
126e0 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f  ge 5 happened to
126f0 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74 20   be the largest 
12700 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
12710 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   in the.  ** dat
12720 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74  abase, then root
12730 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65   page 5 would be
12740 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34   moved to page 4
12750 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f   by the .  ** "O
12760 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f  P_Destroy 4 0" o
12770 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65  pcode. The subse
12780 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f  quent "OP_Destro
12790 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74  y 5 0" would hit
127a0 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73  .  ** a free-lis
127b0 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  t page..  */.  i
127c0 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e  nt iTab = pTab->
127d0 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73  tnum;.  int iDes
127e0 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77  troyed = 0;..  w
127f0 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49  hile( 1 ){.    I
12800 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
12810 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30  int iLargest = 0
12820 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73 74  ;..    if( iDest
12830 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62  royed==0 || iTab
12840 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20  <iDestroyed ){. 
12850 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20       iLargest = 
12860 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iTab;.    }.    
12870 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
12880 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
12890 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
128a0 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d        int iIdx =
128b0 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20   pIdx->tnum;.   
128c0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
128d0 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
128e0 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
128f0 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65 64   if( (iDestroyed
12900 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65  ==0 || (iIdx<iDe
12910 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49 64  stroyed)) && iId
12920 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20  x>iLargest ){.  
12930 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
12940 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20   iIdx;.      }. 
12950 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61     }.    if( iLa
12960 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  rgest==0 ){.    
12970 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65    return;.    }e
12980 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
12990 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
129a0 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
129b0 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
129c0 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ema);.      asse
129d0 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
129e0 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44  b<pParse->db->nD
129f0 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72  b );.      destr
12a00 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
12a10 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62  e, iLargest, iDb
12a20 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f  );.      iDestro
12a30 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a  yed = iLargest;.
12a40 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
12a50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
12a60 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68   entries from th
12a70 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74  e sqlite_statN t
12a80 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e 20  ables (for N in 
12a90 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65  (1,2,3)).** afte
12aa0 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20 6f  r a DROP INDEX o
12ab0 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d  r DROP TABLE com
12ac0 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
12ad0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61  void sqlite3Clea
12ae0 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20 50  rStatTables(.  P
12af0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
12b00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
12b10 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
12b20 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20    int iDb,      
12b30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
12b40 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
12b50 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
12b60 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22  *zType,     /* "
12b70 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f  idx" or "tbl" */
12b80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
12b90 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Name      /* Nam
12ba0 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74 61  e of index or ta
12bb0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
12bc0 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
12bd0 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72 73  *zDbName = pPars
12be0 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  e->db->aDb[iDb].
12bf0 7a 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31  zName;.  for(i=1
12c00 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<=4; i++){.  
12c10 20 20 63 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b    char zTab[24];
12c20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
12c30 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61  rintf(sizeof(zTa
12c40 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f  b),zTab,"sqlite_
12c50 73 74 61 74 25 64 22 2c 69 29 3b 0a 20 20 20 20  stat%d",i);.    
12c60 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
12c70 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
12c80 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20   zTab, zDbName) 
12c90 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12ca0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
12cb0 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c  se,.        "DEL
12cc0 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
12cd0 48 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20  HERE %s=%Q",.   
12ce0 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54       zDbName, zT
12cf0 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65  ab, zType, zName
12d00 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
12d10 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
12d20 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72  erate code to dr
12d30 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76  op a table..*/.v
12d40 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44  oid sqlite3CodeD
12d50 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ropTable(Parse *
12d60 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
12d70 54 61 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e  Tab, int iDb, in
12d80 74 20 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62  t isView){.  Vdb
12d90 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
12da0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
12db0 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54 72  ;.  Trigger *pTr
12dc0 69 67 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62  igger;.  Db *pDb
12dd0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
12de0 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
12df0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
12e00 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
12e10 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  );.  sqlite3Begi
12e20 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
12e30 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
12e40 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
12e50 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
12e60 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
12e70 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
12e80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12e90 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b  0(v, OP_VBegin);
12ea0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
12eb0 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67  * Drop all trigg
12ec0 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ers associated w
12ed0 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65  ith the table be
12ee0 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64  ing dropped. Cod
12ef0 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61  e.  ** is genera
12f00 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e  ted to remove en
12f10 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74  tries from sqlit
12f20 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a  e_master and/or.
12f30 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70    ** sqlite_temp
12f40 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75 69  _master if requi
12f50 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69  red..  */.  pTri
12f60 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72  gger = sqlite3Tr
12f70 69 67 67 65 72 4c 69 73 74 28 70 50 61 72 73 65  iggerList(pParse
12f80 2c 20 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65  , pTab);.  while
12f90 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20  ( pTrigger ){.  
12fa0 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
12fb0 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  er->pSchema==pTa
12fc0 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20  b->pSchema || . 
12fd0 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d         pTrigger-
12fe0 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
12ff0 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
13000 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54      sqlite3DropT
13010 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73 65  riggerPtr(pParse
13020 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20  , pTrigger);.   
13030 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72 69   pTrigger = pTri
13040 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  gger->pNext;.  }
13050 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13060 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
13070 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ENT.  /* Remove 
13080 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74  any entries of t
13090 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
130a0 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  ce table associa
130b0 74 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68  ted with.  ** th
130c0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
130d0 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73 20 64  opped. This is d
130e0 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  one before the t
130f0 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a  able is dropped.
13100 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65    ** at the btre
13110 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65  e level, in case
13120 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75   the sqlite_sequ
13130 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73  ence table needs
13140 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73   to.  ** move as
13150 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
13160 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65   drop (can happe
13170 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  n in auto-vacuum
13180 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69   mode)..  */.  i
13190 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  f( pTab->tabFlag
131a0 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
131b0 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ment ){.    sqli
131c0 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
131d0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45  Parse,.      "DE
131e0 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c  LETE FROM %Q.sql
131f0 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45  ite_sequence WHE
13200 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20  RE name=%Q",.   
13210 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70     pDb->zName, p
13220 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  Tab->zName.    )
13230 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
13240 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49  /* Drop all SQLI
13250 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
13260 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
13270 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
13280 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20  the.  ** table. 
13290 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65  The program name
132a0 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74   loops through t
132b0 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
132c0 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a  and deletes.  **
132d0 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20   every row that 
132e0 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
132f0 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
13300 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65  me as the one be
13310 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64  ing.  ** dropped
13320 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20 68  . Triggers are h
13330 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c  andled separatel
13340 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69 67  y because a trig
13350 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20  ger can be.  ** 
13360 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 74  created in the t
13370 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 61  emp database tha
13380 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
13390 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20  ble in another. 
133a0 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
133b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74  */.  sqlite3Nest
133c0 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
133d0 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46  .      "DELETE F
133e0 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
133f0 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20  tbl_name=%Q and 
13400 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
13410 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61  ,.      pDb->zNa
13420 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
13430 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61  (iDb), pTab->zNa
13440 6d 65 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69  me);.  if( !isVi
13450 65 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c  ew && !IsVirtual
13460 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65  (pTab) ){.    de
13470 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73  stroyTable(pPars
13480 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20  e, pTab);.  }.. 
13490 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74   /* Remove the t
134a0 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  able entry from 
134b0 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61  SQLite's interna
134c0 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64  l schema and mod
134d0 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68  ify.  ** the sch
134e0 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f  ema cookie..  */
134f0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
13500 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
13510 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13520 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20  v, OP_VDestroy, 
13530 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  iDb, 0, 0, pTab-
13540 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
13550 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13560 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61  Op4(v, OP_DropTa
13570 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  ble, iDb, 0, 0, 
13580 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
13590 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  .  sqlite3Change
135a0 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
135b0 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65  Db);.  sqliteVie
135c0 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44  wResetAll(db, iD
135d0 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  b);.}../*.** Thi
135e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
135f0 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  led to do the wo
13600 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  rk of a DROP TAB
13610 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
13620 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61   pName is the na
13630 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
13640 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a  to be dropped..*
13650 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
13660 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
13670 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
13680 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65  pName, int isVie
13690 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20  w, int noErr){. 
136a0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
136b0 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
136c0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
136d0 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
136e0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
136f0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
13700 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
13710 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ble;.  }.  asser
13720 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
13730 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
13740 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29  pName->nSrc==1 )
13750 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20  ;.  if( noErr ) 
13760 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2b  db->suppressErr+
13770 2b 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  +;.  pTab = sqli
13780 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74  te3LocateTableIt
13790 65 6d 28 70 50 61 72 73 65 2c 20 69 73 56 69 65  em(pParse, isVie
137a0 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b 30 5d 29  w, &pName->a[0])
137b0 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20  ;.  if( noErr ) 
137c0 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 2d  db->suppressErr-
137d0 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  -;..  if( pTab==
137e0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45  0 ){.    if( noE
137f0 72 72 20 29 20 73 71 6c 69 74 65 33 43 6f 64 65  rr ) sqlite3Code
13800 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d  VerifyNamedSchem
13810 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d  a(pParse, pName-
13820 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
13830 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
13840 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
13850 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
13860 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
13870 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
13880 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
13890 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
138a0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54 61   );..  /* If pTa
138b0 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20 74  b is a virtual t
138c0 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77 47  able, call ViewG
138d0 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20  etColumnNames() 
138e0 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20 69  to ensure.  ** i
138f0 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  t is initialized
13900 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
13910 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20  irtual(pTab) && 
13920 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
13930 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65  lumnNames(pParse
13940 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67  , pTab) ){.    g
13950 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
13960 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  ble;.  }.#ifndef
13970 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13980 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
13990 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20     int code;.   
139a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
139b0 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  b = SCHEMA_TABLE
139c0 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73 74  (iDb);.    const
139d0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
139e0 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
139f0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
13a00 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20 20  *zArg2 = 0;.    
13a10 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
13a20 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
13a30 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
13a40 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20 20  , 0, zDb)){.    
13a50 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
13a60 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
13a70 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
13a80 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
13a90 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
13aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
13ab0 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
13ac0 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20  EMP_VIEW;.      
13ad0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
13ae0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
13af0 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  P_VIEW;.      }.
13b00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13b10 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
13b20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49  .    }else if( I
13b30 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
13b40 7b 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53  {.      code = S
13b50 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42 4c  QLITE_DROP_VTABL
13b60 45 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20 3d  E;.      zArg2 =
13b70 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c   sqlite3GetVTabl
13b80 65 28 64 62 2c 20 70 54 61 62 29 2d 3e 70 4d 6f  e(db, pTab)->pMo
13b90 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66  d->zName;.#endif
13ba0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13bb0 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
13bc0 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
13bd0 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
13be0 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
13bf0 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  TABLE;.      }el
13c00 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65  se{.        code
13c10 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
13c20 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
13c30 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
13c40 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
13c50 72 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d  rse, code, pTab-
13c60 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a  >zName, zArg2, z
13c70 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
13c80 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
13c90 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
13ca0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
13cb0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
13cc0 5f 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a  _DELETE, pTab->z
13cd0 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
13ce0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
13cf0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
13d00 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
13d10 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49  if( sqlite3StrNI
13d20 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  Cmp(pTab->zName,
13d30 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d   "sqlite_", 7)==
13d40 30 20 0a 20 20 20 20 26 26 20 73 71 6c 69 74 65  0 .    && sqlite
13d50 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
13d60 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73  zName, "sqlite_s
13d70 74 61 74 22 2c 20 31 31 29 21 3d 30 20 29 7b 0a  tat", 11)!=0 ){.
13d80 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13d90 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
13da0 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
13db0 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d   dropped", pTab-
13dc0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
13dd0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
13de0 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  e;.  }..#ifndef 
13df0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
13e00 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f  .  /* Ensure DRO
13e10 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75  P TABLE is not u
13e20 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61  sed on a view, a
13e30 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69 73 20  nd DROP VIEW is 
13e40 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e  not used.  ** on
13e50 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20   a table..  */. 
13e60 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70   if( isView && p
13e70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
13e80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13e90 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13ea0 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74  use DROP TABLE t
13eb0 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25  o delete table %
13ec0 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
13ed0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
13ee0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
13ef0 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26    if( !isView &&
13f00 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
13f10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
13f20 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
13f30 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20  se DROP VIEW to 
13f40 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c  delete view %s",
13f50 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
13f60 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
13f70 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e  p_table;.  }.#en
13f80 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
13f90 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
13fa0 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  e the table from
13fb0 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
13fc0 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a  e.  ** on disk..
13fd0 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
13fe0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
13ff0 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
14000 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
14010 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
14020 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20  rse, 1, iDb);.  
14030 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74    sqlite3ClearSt
14040 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c  atTables(pParse,
14050 20 69 44 62 2c 20 22 74 62 6c 22 2c 20 70 54 61   iDb, "tbl", pTa
14060 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  b->zName);.    s
14070 71 6c 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c  qlite3FkDropTabl
14080 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c  e(pParse, pName,
14090 20 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69   pTab);.    sqli
140a0 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65  te3CodeDropTable
140b0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 69  (pParse, pTab, i
140c0 44 62 2c 20 69 73 56 69 65 77 29 3b 0a 20 20 7d  Db, isView);.  }
140d0 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  ..exit_drop_tabl
140e0 65 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  e:.  sqlite3SrcL
140f0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e  istDelete(db, pN
14100 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ame);.}../*.** T
14110 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
14120 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
14130 61 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65  a new foreign ke
14140 79 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a  y on the table.*
14150 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  * currently unde
14160 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
14170 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d   pFromCol determ
14180 69 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d  ines which colum
14190 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72  ns.** in the cur
141a0 72 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74  rent table point
141b0 20 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20   to the foreign 
141c0 6b 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f  key.  If pFromCo
141d0 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e  l==0 then.** con
141e0 6e 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20  nect the key to 
141f0 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
14200 69 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69  inserted.  pTo i
14210 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a  s the name of.**
14220 20 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72   the table refer
14230 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61 20 74 68  red to (a.k.a th
14240 65 20 22 70 61 72 65 6e 74 22 20 74 61 62 6c 65  e "parent" table
14250 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20  ).  pToCol is a 
14260 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61 62 6c 65  list.** of table
14270 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s in the parent 
14280 70 54 6f 20 74 61 62 6c 65 2e 20 20 66 6c 61 67  pTo table.  flag
14290 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a  s contains all.*
142a0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * information ab
142b0 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  out the conflict
142c0 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
142d0 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65 64  rithms specified
142e0 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45  .** in the ON DE
142f0 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20  LETE, ON UPDATE 
14300 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c  and ON INSERT cl
14310 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  auses..**.** An 
14320 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 69  FKey structure i
14330 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64  s created and ad
14340 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
14350 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e   currently.** un
14360 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
14370 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e   in the pParse->
14380 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e  pNewTable field.
14390 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69  .**.** The forei
143a0 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f  gn key is set fo
143b0 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63  r IMMEDIATE proc
143c0 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65  essing.  A subse
143d0 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f  quent call.** to
143e0 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
143f0 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20  eignKey() might 
14400 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44  change this to D
14410 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64  EFERRED..*/.void
14420 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f   sqlite3CreateFo
14430 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73  reignKey(.  Pars
14440 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
14450 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
14460 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
14470 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a  t *pFromCol,  /*
14480 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73   Columns in this
14490 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e   table that poin
144a0 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65  t to other table
144b0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f   */.  Token *pTo
144c0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ,          /* Na
144d0 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  me of the other 
144e0 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c  table */.  ExprL
144f0 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20  ist *pToCol,    
14500 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
14510 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f  e other table */
14520 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
14530 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c          /* Confl
14540 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
14550 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b  lgorithms. */.){
14560 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
14570 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66   pParse->db;.#if
14580 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14590 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46  _FOREIGN_KEY.  F
145a0 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a  Key *pFKey = 0;.
145b0 20 20 46 4b 65 79 20 2a 70 4e 65 78 74 54 6f 3b    FKey *pNextTo;
145c0 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50  .  Table *p = pP
145d0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
145e0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
145f0 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
14600 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20  l;.  char *z;.. 
14610 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20   assert( pTo!=0 
14620 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  );.  if( p==0 ||
14630 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42   IN_DECLARE_VTAB
14640 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a   ) goto fk_end;.
14650 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d    if( pFromCol==
14660 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f  0 ){.    int iCo
14670 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  l = p->nCol-1;. 
14680 20 20 20 69 66 28 20 4e 45 56 45 52 28 69 43 6f     if( NEVER(iCo
14690 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b 5f 65  l<0) ) goto fk_e
146a0 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54 6f 43  nd;.    if( pToC
146b0 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e 45  ol && pToCol->nE
146c0 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  xpr!=1 ){.      
146d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
146e0 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69 67 6e  pParse, "foreign
146f0 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20 20 20   key on %s".    
14700 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20 72 65       " should re
14710 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 6e 65  ference only one
14720 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65   column of table
14730 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20 20 70   %T",.         p
14740 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61  ->aCol[iCol].zNa
14750 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20 20 20  me, pTo);.      
14760 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
14770 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 31 3b   }.    nCol = 1;
14780 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f  .  }else if( pTo
14790 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e 6e  Col && pToCol->n
147a0 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c 2d 3e  Expr!=pFromCol->
147b0 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73 71 6c  nExpr ){.    sql
147c0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
147d0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 6e 75  rse,.        "nu
147e0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
147f0 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
14800 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
14810 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a 20 20  e number of ".  
14820 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73 20 69        "columns i
14830 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  n the referenced
14840 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 67 6f   table");.    go
14850 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 65 6c  to fk_end;.  }el
14860 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d 20 70  se{.    nCol = p
14870 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 3b 0a  FromCol->nExpr;.
14880 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 73 69    }.  nByte = si
14890 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b 20 28  zeof(*pFKey) + (
148a0 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 70  nCol-1)*sizeof(p
148b0 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b  FKey->aCol[0]) +
148c0 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69   pTo->n + 1;.  i
148d0 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20  f( pToCol ){.   
148e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43   for(i=0; i<pToC
148f0 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  ol->nExpr; i++){
14900 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20  .      nByte += 
14910 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
14920 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
14930 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  me) + 1;.    }. 
14940 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c   }.  pFKey = sql
14950 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
14960 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20  (db, nByte );.  
14970 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a  if( pFKey==0 ){.
14980 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
14990 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46  .  }.  pFKey->pF
149a0 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79  rom = p;.  pFKey
149b0 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d  ->pNextFrom = p-
149c0 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63  >pFKey;.  z = (c
149d0 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61 43 6f  har*)&pFKey->aCo
149e0 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b 65 79  l[nCol];.  pFKey
149f0 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d  ->zTo = z;.  mem
14a00 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70  cpy(z, pTo->z, p
14a10 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d  To->n);.  z[pTo-
14a20 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  >n] = 0;.  sqlit
14a30 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20  e3Dequote(z);.  
14a40 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20  z += pTo->n+1;. 
14a50 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e   pFKey->nCol = n
14a60 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  Col;.  if( pFrom
14a70 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  Col==0 ){.    pF
14a80 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  Key->aCol[0].iFr
14a90 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  om = p->nCol-1;.
14aa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
14ab0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
14ac0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  +){.      int j;
14ad0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
14ae0 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  j<p->nCol; j++){
14af0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
14b00 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61  ite3StrICmp(p->a
14b10 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46  Col[j].zName, pF
14b20 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
14b30 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
14b40 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
14b50 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20  i].iFrom = j;.  
14b60 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
14b70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14b80 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d  .      if( j>=p-
14b90 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
14ba0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14bb0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
14bc0 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c      "unknown col
14bd0 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f  umn \"%s\" in fo
14be0 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
14bf0 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  tion", .        
14c00 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d    pFromCol->a[i]
14c10 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
14c20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
14c30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14c40 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
14c50 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
14c60 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
14c70 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
14c80 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d  Strlen30(pToCol-
14c90 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
14ca0 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
14cb0 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20 20 20  i].zCol = z;.   
14cc0 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f     memcpy(z, pTo
14cd0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  Col->a[i].zName,
14ce0 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20   n);.      z[n] 
14cf0 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  = 0;.      z += 
14d00 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n+1;.    }.  }. 
14d10 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72   pFKey->isDeferr
14d20 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d  ed = 0;.  pFKey-
14d30 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75  >aAction[0] = (u
14d40 38 29 28 66 6c 61 67 73 20 26 20 30 78 66 66 29  8)(flags & 0xff)
14d50 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
14d60 4f 4e 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e  ON DELETE action
14d70 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63   */.  pFKey->aAc
14d80 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28  tion[1] = (u8)((
14d90 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30  flags >> 8 ) & 0
14da0 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55  xff);    /* ON U
14db0 50 44 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a  PDATE action */.
14dc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14dd0 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
14de0 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68  d(db, 0, p->pSch
14df0 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65 78 74 54  ema) );.  pNextT
14e00 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69  o = (FKey *)sqli
14e10 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
14e20 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48  ->pSchema->fkeyH
14e30 61 73 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65  ash, .      pFKe
14e40 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29  y->zTo, (void *)
14e50 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66 28  pFKey.  );.  if(
14e60 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20   pNextTo==pFKey 
14e70 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  ){.    db->mallo
14e80 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
14e90 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
14ea0 7d 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 20  }.  if( pNextTo 
14eb0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
14ec0 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d  NextTo->pPrevTo=
14ed0 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d  =0 );.    pFKey-
14ee0 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78 74  >pNextTo = pNext
14ef0 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d  To;.    pNextTo-
14f00 3e 70 50 72 65 76 54 6f 20 3d 20 70 46 4b 65 79  >pPrevTo = pFKey
14f10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  ;.  }..  /* Link
14f20 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
14f30 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73   to the table as
14f40 20 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a   the last step..
14f50 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20    */.  p->pFKey 
14f60 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79  = pFKey;.  pFKey
14f70 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20   = 0;..fk_end:. 
14f80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
14f90 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69  b, pFKey);.#endi
14fa0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
14fb0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
14fc0 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69  N_KEY) */.  sqli
14fd0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
14fe0 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b  e(db, pFromCol);
14ff0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
15000 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f  stDelete(db, pTo
15010 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Col);.}../*.** T
15020 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
15030 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e  alled when an IN
15040 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
15050 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44  E or INITIALLY D
15060 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73  EFERRED.** claus
15070 65 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72  e is seen as par
15080 74 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b  t of a foreign k
15090 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20  ey definition.  
150a0 54 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a  The isDeferred.*
150b0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31  * parameter is 1
150c0 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44   for INITIALLY D
150d0 45 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f  EFERRED and 0 fo
150e0 72 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  r INITIALLY IMME
150f0 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65  DIATE..** The be
15100 68 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f  havior of the mo
15110 73 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61  st recently crea
15120 74 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ted foreign key 
15130 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61  is adjusted.** a
15140 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76  ccordingly..*/.v
15150 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 65 72  oid sqlite3Defer
15160 46 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65  ForeignKey(Parse
15170 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73   *pParse, int is
15180 44 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64  Deferred){.#ifnd
15190 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ef SQLITE_OMIT_F
151a0 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62  OREIGN_KEY.  Tab
151b0 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79  le *pTab;.  FKey
151c0 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28   *pFKey;.  if( (
151d0 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
151e0 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20  NewTable)==0 || 
151f0 28 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70  (pFKey = pTab->p
15200 46 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72  FKey)==0 ) retur
15210 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 44  n;.  assert( isD
15220 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73  eferred==0 || is
15230 44 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f  Deferred==1 ); /
15240 2a 20 45 56 3a 20 52 2d 33 30 33 32 33 2d 32 31  * EV: R-30323-21
15250 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e  917 */.  pFKey->
15260 69 73 44 65 66 65 72 72 65 64 20 3d 20 28 75 38  isDeferred = (u8
15270 29 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e  )isDeferred;.#en
15280 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  dif.}../*.** Gen
15290 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
152a0 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72  will erase and r
152b0 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64  efill index *pId
152c0 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75  x.  This is.** u
152d0 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  sed to initializ
152e0 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65  e a newly create
152f0 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65  d index or to re
15300 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63  compute the.** c
15310 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64  ontent of an ind
15320 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74  ex in response t
15330 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  o a REINDEX comm
15340 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65  and..**.** if me
15350 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74  mRootPage is not
15360 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65   negative, it me
15370 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64  ans that the ind
15380 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63  ex is newly.** c
15390 72 65 61 74 65 64 2e 20 20 54 68 65 20 72 65 67  reated.  The reg
153a0 69 73 74 65 72 20 73 70 65 63 69 66 69 65 64 20  ister specified 
153b0 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63  by memRootPage c
153c0 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72  ontains the.** r
153d0 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
153e0 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49  of the index.  I
153f0 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
15400 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a   negative, then.
15410 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  ** the index alr
15420 65 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20  eady exists and 
15430 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20  must be cleared 
15440 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66  before being ref
15450 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65  illed and.** the
15460 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
15470 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69  r of the index i
15480 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e  s taken from pIn
15490 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74  dex->tnum..*/.st
154a0 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
154b0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72  3RefillIndex(Par
154c0 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65  se *pParse, Inde
154d0 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d  x *pIndex, int m
154e0 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54  emRootPage){.  T
154f0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
15500 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a  dex->pTable;  /*
15510 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   The table that 
15520 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  is indexed */.  
15530 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73  int iTab = pPars
15540 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f  e->nTab++;     /
15550 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75  * Btree cursor u
15560 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a  sed for pTab */.
15570 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61    int iIdx = pPa
15580 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20  rse->nTab++;    
15590 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72   /* Btree cursor
155a0 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78   used for pIndex
155b0 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 65   */.  int iSorte
155c0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
155d0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
155e0 70 65 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f 72  pened by OpenSor
155f0 74 65 72 20 28 69 66 20 69 6e 20 75 73 65 29 20  ter (if in use) 
15600 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20  */.  int addr1; 
15610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15620 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
15630 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f  f top of loop */
15640 0a 20 20 69 6e 74 20 61 64 64 72 32 3b 20 20 20  .  int addr2;   
15650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15660 20 20 2f 2a 20 41 64 64 72 65 73 73 20 74 6f 20    /* Address to 
15670 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78 74  jump to for next
15680 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   iteration */.  
15690 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20  int tnum;       
156a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
156b0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  * Root page of i
156c0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50  ndex */.  int iP
156d0 61 72 74 49 64 78 4c 61 62 65 6c 3b 20 20 20 20  artIdxLabel;    
156e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
156f0 20 74 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 74   to this label t
15700 6f 20 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a  o skip a row */.
15710 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20    Vdbe *v;      
15720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15730 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
15740 65 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74  e into this virt
15750 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20  ual machine */. 
15760 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20   KeyInfo *pKey; 
15770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15780 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69  /* KeyInfo for i
15790 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65  ndex */.  int re
157a0 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20  gRecord;        
157b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
157c0 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73  ster holding ass
157d0 65 6d 62 6c 65 64 20 69 6e 64 65 78 20 72 65 63  embled index rec
157e0 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
157f0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
15800 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  b;      /* The d
15810 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
15820 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20  on */.  int iDb 
15830 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
15840 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
15850 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  x->pSchema);..#i
15860 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15870 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
15880 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
15890 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
158a0 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70  QLITE_REINDEX, p
158b0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c  Index->zName, 0,
158c0 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
158d0 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b 0a 20  Db].zName ) ){. 
158e0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
158f0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 71 75  endif..  /* Requ
15900 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
15910 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 74 6f   on the table to
15920 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 6f 70   perform this op
15930 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  eration */.  sql
15940 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
15950 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
15960 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 2d 3e  >tnum, 1, pTab->
15970 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d 20 73  zName);..  v = s
15980 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
15990 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
159a0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
159b0 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30  ( memRootPage>=0
159c0 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20 6d   ){.    tnum = m
159d0 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 7d 65  emRootPage;.  }e
159e0 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 3d 20  lse{.    tnum = 
159f0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a 20 20  pIndex->tnum;.  
15a00 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74  }.  pKey = sqlit
15a10 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78  e3KeyInfoOfIndex
15a20 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29  (pParse, pIndex)
15a30 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
15a40 20 73 6f 72 74 65 72 20 63 75 72 73 6f 72 20 69   sorter cursor i
15a50 66 20 77 65 20 61 72 65 20 74 6f 20 75 73 65 20  f we are to use 
15a60 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f 72 74 65  one. */.  iSorte
15a70 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
15a80 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ++;.  sqlite3Vdb
15a90 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 6f  eAddOp4(v, OP_So
15aa0 72 74 65 72 4f 70 65 6e 2c 20 69 53 6f 72 74 65  rterOpen, iSorte
15ab0 72 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b  r, 0, pIndex->nK
15ac0 65 79 43 6f 6c 2c 20 28 63 68 61 72 2a 29 0a 20  eyCol, (char*). 
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ae0 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66     sqlite3KeyInf
15af0 6f 52 65 66 28 70 4b 65 79 29 2c 20 50 34 5f 4b  oRef(pKey), P4_K
15b00 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f  EYINFO);..  /* O
15b10 70 65 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 4c  pen the table. L
15b20 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
15b30 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c  rows of the tabl
15b40 65 2c 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 64  e, inserting ind
15b50 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73 20  ex.  ** records 
15b60 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e  into the sorter.
15b70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70 65   */.  sqlite3Ope
15b80 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
15b90 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Tab, iDb, pTab, 
15ba0 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
15bb0 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
15bc0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15bd0 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29  Rewind, iTab, 0)
15be0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
15bf0 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d  );.  regRecord =
15c00 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
15c10 65 67 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 73  eg(pParse);..  s
15c20 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
15c30 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 70 49  dexKey(pParse,pI
15c40 6e 64 65 78 2c 69 54 61 62 2c 72 65 67 52 65 63  ndex,iTab,regRec
15c50 6f 72 64 2c 30 2c 26 69 50 61 72 74 49 64 78 4c  ord,0,&iPartIdxL
15c60 61 62 65 6c 2c 30 2c 30 29 3b 0a 20 20 73 71 6c  abel,0,0);.  sql
15c70 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15c80 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  , OP_SorterInser
15c90 74 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52  t, iSorter, regR
15ca0 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
15cb0 33 52 65 73 6f 6c 76 65 50 61 72 74 49 64 78 4c  3ResolvePartIdxL
15cc0 61 62 65 6c 28 70 50 61 72 73 65 2c 20 69 50 61  abel(pParse, iPa
15cd0 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20 73  rtIdxLabel);.  s
15ce0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15cf0 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61  (v, OP_Next, iTa
15d00 62 2c 20 61 64 64 72 31 2b 31 29 3b 20 56 64 62  b, addr1+1); Vdb
15d10 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
15d20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
15d30 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
15d40 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
15d50 3c 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  <0 ) sqlite3Vdbe
15d60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65  AddOp2(v, OP_Cle
15d70 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ar, tnum, iDb);.
15d80 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15d90 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op4(v, OP_OpenWr
15da0 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c  ite, iIdx, tnum,
15db0 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20   iDb, .         
15dc0 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
15dd0 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49   *)pKey, P4_KEYI
15de0 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  NFO);.  sqlite3V
15df0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
15e00 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28 28  PFLAG_BULKCSR|((
15e10 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29 3f  memRootPage>=0)?
15e20 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3a 30  OPFLAG_P2ISREG:0
15e30 29 29 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20 73  ));..  addr1 = s
15e40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15e50 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
15e60 74 2c 20 69 53 6f 72 74 65 72 2c 20 30 29 3b 20  t, iSorter, 0); 
15e70 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
15e80 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 21  .  assert( pKey!
15e90 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
15ea0 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65  Failed || pParse
15eb0 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 69 66 28 20  ->nErr );.  if( 
15ec0 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
15ed0 6e 64 65 78 29 20 26 26 20 70 4b 65 79 21 3d 30  ndex) && pKey!=0
15ee0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d   ){.    int j2 =
15ef0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
15f00 65 6e 74 41 64 64 72 28 76 29 20 2b 20 33 3b 0a  entAddr(v) + 3;.
15f10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15f20 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
15f30 2c 20 30 2c 20 6a 32 29 3b 0a 20 20 20 20 61 64  , 0, j2);.    ad
15f40 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
15f50 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
15f60 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
15f70 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f  AddOp4Int(v, OP_
15f80 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69  SorterCompare, i
15f90 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52  Sorter, j2, regR
15fa0 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ecord,.         
15fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15fc0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29  pIndex->nKeyCol)
15fd0 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
15fe0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e  );.    sqlite3Un
15ff0 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  iqueConstraint(p
16000 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c  Parse, OE_Abort,
16010 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 65 6c 73   pIndex);.  }els
16020 65 7b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73  e{.    addr2 = s
16030 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
16040 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20  tAddr(v);.  }.  
16050 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16060 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61  2(v, OP_SorterDa
16070 74 61 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67  ta, iSorter, reg
16080 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
16090 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
160a0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49  OP_IdxInsert, iI
160b0 64 78 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31  dx, regRecord, 1
160c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
160d0 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
160e0 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
160f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
16100 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
16110 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
16120 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16130 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
16140 65 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64  ext, iSorter, ad
16150 64 72 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61  dr2); VdbeCovera
16160 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
16170 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
16180 61 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74  addr1);..  sqlit
16190 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
161a0 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b  OP_Close, iTab);
161b0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
161c0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
161d0 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74  , iIdx);.  sqlit
161e0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
161f0 4f 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65  OP_Close, iSorte
16200 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  r);.}../*.** All
16210 6f 63 61 74 65 20 68 65 61 70 20 73 70 61 63 65  ocate heap space
16220 20 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65   to hold an Inde
16230 78 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43  x object with nC
16240 6f 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a  ol columns..**.*
16250 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 61  * Increase the a
16260 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74  llocation size t
16270 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74  o provide an ext
16280 72 61 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  ra nExtra bytes.
16290 2a 2a 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69  ** of 8-byte ali
162a0 67 6e 65 64 20 73 70 61 63 65 20 61 66 74 65 72  gned space after
162b0 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
162c0 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a  t and return a.*
162d0 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  * pointer to thi
162e0 73 20 65 78 74 72 61 20 73 70 61 63 65 20 69 6e  s extra space in
162f0 20 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e   *ppExtra..*/.In
16300 64 65 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f  dex *sqlite3Allo
16310 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  cateIndexObject(
16320 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
16330 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
16340 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
16350 2f 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20  /.  i16 nCol,   
16360 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
16370 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  l number of colu
16380 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
16390 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
163a0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ,          /* Nu
163b0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
163c0 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20   extra space to 
163d0 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
163e0 2a 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20  **ppExtra       
163f0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
16400 65 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20  e "extra" space 
16410 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  */.){.  Index *p
16420 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16430 41 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20  Allocated index 
16440 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
16450 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
16460 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61   /* Bytes of spa
16470 63 65 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a  ce for Index obj
16480 65 63 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a  ect + arrays */.
16490 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
164a0 38 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29  8(sizeof(Index))
164b0 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
164c0 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  /* Index structu
164d0 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  re  */.         
164e0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63   ROUND8(sizeof(c
164f0 68 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20  har*)*nCol) +   
16500 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
16510 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20  zColl     */.   
16520 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69         ROUND8(si
16530 7a 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43  zeof(LogEst)*(nC
16540 6f 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20 49  ol+1) +     /* I
16550 6e 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74  ndex.aiRowLogEst
16560 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
16570 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 31         sizeof(i1
16580 36 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  6)*nCol +       
16590 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
165a0 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20  Column   */.    
165b0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
165c0 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20  eof(u8)*nCol);  
165d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
165e0 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
165f0 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44  /.  p = sqlite3D
16600 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
16610 6e 42 79 74 65 20 2b 20 6e 45 78 74 72 61 29 3b  nByte + nExtra);
16620 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
16630 63 68 61 72 20 2a 70 45 78 74 72 61 20 3d 20 28  char *pExtra = (
16640 28 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38  (char*)p)+ROUND8
16650 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b  (sizeof(Index));
16660 0a 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d  .    p->azColl =
16670 20 28 63 68 61 72 2a 2a 29 70 45 78 74 72 61 3b   (char**)pExtra;
16680 20 20 20 20 20 20 20 70 45 78 74 72 61 20 2b 3d         pExtra +=
16690 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63   ROUND8(sizeof(c
166a0 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20  har*)*nCol);.   
166b0 20 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20   p->aiRowLogEst 
166c0 3d 20 28 4c 6f 67 45 73 74 2a 29 70 45 78 74 72  = (LogEst*)pExtr
166d0 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a  a; pExtra += siz
166e0 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f  eof(LogEst)*(nCo
166f0 6c 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43  l+1);.    p->aiC
16700 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45  olumn = (i16*)pE
16710 78 74 72 61 3b 20 20 20 20 20 20 20 70 45 78 74  xtra;       pExt
16720 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36  ra += sizeof(i16
16730 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61  )*nCol;.    p->a
16740 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
16750 29 70 45 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e  )pExtra;.    p->
16760 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a  nColumn = nCol;.
16770 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d      p->nKeyCol =
16780 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a   nCol - 1;.    *
16790 70 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72  ppExtra = ((char
167a0 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20  *)p) + nByte;.  
167b0 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
167c0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
167d0 6e 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e  new index for an
167e0 20 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61   SQL table.  pNa
167f0 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68  me1.pName2 is th
16800 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
16810 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c  dex .** and pTbl
16820 4c 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65  List is the name
16830 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68   of the table th
16840 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
16850 78 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20  xed.  Both will 
16860 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20  .** be NULL for 
16870 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
16880 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69   an index that i
16890 73 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74  s created to sat
168a0 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45  isfy a.** UNIQUE
168b0 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66   constraint.  If
168c0 20 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64   pTable and pInd
168d0 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65  ex are NULL, use
168e0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
168f0 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62  le.** as the tab
16900 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
16910 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  .  pParse->pNewT
16920 61 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20  able is a table 
16930 74 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65  that is.** curre
16940 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74  ntly being const
16950 72 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41  ructed by a CREA
16960 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
16970 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20  nt..**.** pList 
16980 69 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c  is a list of col
16990 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
169a0 65 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20  ed.  pList will 
169b0 62 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a  be NULL if this.
169c0 2a 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20  ** is a primary 
169d0 6b 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f  key or unique-co
169e0 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20  nstraint on the 
169f0 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75  most recent colu
16a00 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74  mn added.** to t
16a10 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
16a20 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
16a30 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 49  ction.  .**.** I
16a40 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 63  f the index is c
16a50 72 65 61 74 65 64 20 73 75 63 63 65 73 73 66 75  reated successfu
16a60 6c 6c 79 2c 20 72 65 74 75 72 6e 20 61 20 70 6f  lly, return a po
16a70 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
16a80 20 49 6e 64 65 78 0a 2a 2a 20 73 74 72 75 63 74   Index.** struct
16a90 75 72 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  ure. This is use
16aa0 64 20 62 79 20 73 71 6c 69 74 65 33 41 64 64 50  d by sqlite3AddP
16ab0 72 69 6d 61 72 79 4b 65 79 28 29 20 74 6f 20 6d  rimaryKey() to m
16ac0 61 72 6b 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a  ark the index.**
16ad0 20 61 73 20 74 68 65 20 74 61 62 6c 65 73 20 70   as the tables p
16ae0 72 69 6d 61 72 79 20 6b 65 79 20 28 49 6e 64 65  rimary key (Inde
16af0 78 2e 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54  x.idxType==SQLIT
16b00 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52  E_IDXTYPE_PRIMAR
16b10 59 4b 45 59 29 0a 2a 2f 0a 49 6e 64 65 78 20 2a  YKEY).*/.Index *
16b20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
16b30 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
16b40 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20  rse,     /* All 
16b50 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
16b60 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
16b70 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
16b80 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
16b90 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
16ba0 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
16bb0 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
16bc0 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  ,     /* Second 
16bd0 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
16be0 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
16bf0 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
16c00 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65  blName, /* Table
16c10 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70   to index. Use p
16c20 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
16c30 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c   if 0 */.  ExprL
16c40 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
16c50 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   A list of colum
16c60 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
16c70 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
16c80 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41  r,       /* OE_A
16c90 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
16ca0 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
16cb0 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
16cc0 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20  en *pStart,     
16cd0 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
16ce0 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
16cf0 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
16d00 2f 0a 20 20 45 78 70 72 20 2a 70 50 49 57 68 65  /.  Expr *pPIWhe
16d10 72 65 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20  re,    /* WHERE 
16d20 63 6c 61 75 73 65 20 66 6f 72 20 70 61 72 74 69  clause for parti
16d30 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  al indices */.  
16d40 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20  int sortOrder,  
16d50 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72     /* Sort order
16d60 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20   of primary key 
16d70 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c  when pList==NULL
16d80 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45   */.  int ifNotE
16d90 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74  xist     /* Omit
16da0 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20   error if index 
16db0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
16dc0 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 52  /.){.  Index *pR
16dd0 65 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50  et = 0;     /* P
16de0 6f 69 6e 74 65 72 20 74 6f 20 72 65 74 75 72 6e  ointer to return
16df0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
16e00 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61  b = 0;     /* Ta
16e10 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65  ble to be indexe
16e20 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  d */.  Index *pI
16e30 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54  ndex = 0;   /* T
16e40 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63  he index to be c
16e50 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72  reated */.  char
16e60 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *zName = 0;    
16e70 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
16e80 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e  index */.  int n
16e90 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
16ea0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
16eb0 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65  racters in zName
16ec0 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a   */.  int i, j;.
16ed0 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20    DbFixer sFix; 
16ee0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73         /* For as
16ef0 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65  signing database
16f00 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65   names to pTable
16f10 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
16f20 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20  derMask;   /* 1 
16f30 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e  to honor DESC in
16f40 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67   index.  0 to ig
16f50 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  nore. */.  sqlit
16f60 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
16f70 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20  >db;.  Db *pDb; 
16f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16f90 68 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c  he specific tabl
16fa0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
16fb0 20 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73   indexed databas
16fc0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
16fe0 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
16ff0 62 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69  base that is bei
17000 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  ng written */.  
17010 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30  Token *pName = 0
17020 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
17030 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
17040 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20  index to create 
17050 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  */.  struct Expr
17060 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74  List_item *pList
17070 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f  Item; /* For loo
17080 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20  ping over pList 
17090 2a 2f 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d  */.  const Colum
170a0 6e 20 2a 70 54 61 62 43 6f 6c 3b 20 20 20 20 20  n *pTabCol;     
170b0 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d        /* A colum
170c0 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  n in the table *
170d0 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  /.  int nExtra =
170e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
170f0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c       /* Space al
17100 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78 74  located for zExt
17110 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ra[] */.  int nE
17120 78 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20 20  xtraCol;        
17130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
17140 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 63 6f  mber of extra co
17150 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a  lumns needed */.
17160 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20 3d    char *zExtra =
17170 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
17180 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63     /* Extra spac
17190 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65  e after the Inde
171a0 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e  x object */.  In
171b0 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20  dex *pPk = 0;   
171c0 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45     /* PRIMARY KE
171d0 59 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48  Y index for WITH
171e0 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73  OUT ROWID tables
171f0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
17200 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
17210 3b 20 20 20 20 20 20 2f 2a 20 4e 65 76 65 72 20  ;      /* Never 
17220 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72 69 6f  called with prio
17230 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66  r errors */.  if
17240 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
17250 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45  ed || IN_DECLARE
17260 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 67 6f 74  _VTAB ){.    got
17270 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
17280 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53  dex;.  }.  if( S
17290 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
172a0 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
172b0 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  se) ){.    goto 
172c0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
172d0 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  x;.  }..  /*.  *
172e0 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65  * Find the table
172f0 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
17300 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20  ndexed.  Return 
17310 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75  early if not fou
17320 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  nd..  */.  if( p
17330 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20  TblName!=0 ){.. 
17340 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77     /* Use the tw
17350 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d  o-part index nam
17360 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
17370 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
17380 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f   ** to search fo
17390 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69  r the table. 'Fi
173a0 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  x' the table nam
173b0 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20  e to this db.   
173c0 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69   ** before looki
173d0 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e  ng up the table.
173e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
173f0 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e  rt( pName1 && pN
17400 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20  ame2 );.    iDb 
17410 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
17420 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
17430 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
17440 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44  ame);.    if( iD
17450 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  b<0 ) goto exit_
17460 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
17470 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 20    assert( pName 
17480 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a  && pName->z );..
17490 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
174a0 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f  MIT_TEMPDB.    /
174b0 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e  * If the index n
174c0 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66  ame was unqualif
174d0 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68  ied, check if th
174e0 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  e table.    ** i
174f0 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20  s a temp table. 
17500 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64  If so, set the d
17510 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f  atabase to 1. Do
17520 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20   not do this.   
17530 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73   ** if initialis
17540 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 73  ing a database s
17550 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20  chema..    */.  
17560 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
17570 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54  busy ){.      pT
17580 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  ab = sqlite3SrcL
17590 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  istLookup(pParse
175a0 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20  , pTblName);.   
175b0 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e     if( pName2->n
175c0 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70  ==0 && pTab && p
175d0 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62  Tab->pSchema==db
175e0 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
175f0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44 62 20   ){.        iDb 
17600 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
17610 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73   }.#endif..    s
17620 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
17630 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
17640 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65  , "index", pName
17650 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
17660 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46  e3FixSrcList(&sF
17670 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 20 29 7b  ix, pTblName) ){
17680 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73  .      /* Becaus
17690 65 20 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e  e the parser con
176a0 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65  structs pTblName
176b0 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69   from a single i
176c0 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20  dentifier,.     
176d0 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72   ** sqlite3FixSr
176e0 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20  cList can never 
176f0 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61  fail. */.      a
17700 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a  ssert(0);.    }.
17710 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
17720 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65  e3LocateTableIte
17730 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 26 70 54  m(pParse, 0, &pT
17740 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20  blName->a[0]);. 
17750 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
17760 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c  allocFailed==0 |
17770 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  | pTab==0 );.   
17780 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67   if( pTab==0 ) g
17790 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
177a0 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 69  index;.    if( i
177b0 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e 61 44 62  Db==1 && db->aDb
177c0 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 21 3d 70  [iDb].pSchema!=p
177d0 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  Tab->pSchema ){.
177e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
177f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
17800 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f            "canno
17810 74 20 63 72 65 61 74 65 20 61 20 54 45 4d 50 20  t create a TEMP 
17820 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d  index on non-TEM
17830 50 20 74 61 62 6c 65 20 5c 22 25 73 5c 22 22 2c  P table \"%s\"",
17840 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62  .           pTab
17850 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
17860 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
17870 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
17880 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
17890 70 54 61 62 29 20 29 20 70 50 6b 20 3d 20 73 71  pTab) ) pPk = sq
178a0 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
178b0 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 65  ndex(pTab);.  }e
178c0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
178d0 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20   pName==0 );.   
178e0 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74 3d   assert( pStart=
178f0 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
17900 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
17910 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  le;.    if( !pTa
17920 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  b ) goto exit_cr
17930 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
17940 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
17950 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
17960 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
17970 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e   }.  pDb = &db->
17980 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73  aDb[iDb];..  ass
17990 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a  ert( pTab!=0 );.
179a0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
179b0 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69  ->nErr==0 );.  i
179c0 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
179d0 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
179e0 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
179f0 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45   .#if SQLITE_USE
17a00 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
17a10 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
17a20 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
17a30 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a  pTab->zName)==0.
17a40 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 26 26  #endif.       &&
17a50 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
17a60 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d  (&pTab->zName[7]
17a70 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29 21  ,"altertab_",9)!
17a80 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
17a90 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
17aa0 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
17ab0 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c  not be indexed",
17ac0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
17ad0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
17ae0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
17af0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17b00 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54  IT_VIEW.  if( pT
17b10 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
17b20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
17b30 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
17b40 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
17b50 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
17b60 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
17b70 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ex;.  }.#endif.#
17b80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17b90 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
17ba0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
17bb0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
17bc0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17bd0 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61  rse, "virtual ta
17be0 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  bles may not be 
17bf0 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
17c00 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
17c10 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
17c20 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  f..  /*.  ** Fin
17c30 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
17c40 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73  e index.  Make s
17c50 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74  ure there is not
17c60 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72   already another
17c70 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
17c80 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61  able with the sa
17c90 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a  me name.  .  **.
17ca0 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20    ** Exception: 
17cb0 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69   If we are readi
17cc0 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ng the names of 
17cd0 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65  permanent indice
17ce0 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  s from the.  ** 
17cf0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
17d00 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d  ble (because som
17d10 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
17d20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65  changed the sche
17d30 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65  ma) and.  ** one
17d40 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   of the index na
17d50 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74  mes collides wit
17d60 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  h the name of a 
17d70 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
17d80 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74  or.  ** index, t
17d90 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74  hen we will cont
17da0 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20  inue to process 
17db0 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a  this index..  **
17dc0 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d  .  ** If pName==
17dd0 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  0 it means that 
17de0 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c  we are.  ** deal
17df0 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61  ing with a prima
17e00 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45  ry key or UNIQUE
17e10 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65   constraint.  We
17e20 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20   have to invent 
17e30 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d  our.  ** own nam
17e40 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e  e..  */.  if( pN
17e50 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
17e60 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
17e70 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
17e80 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  e);.    if( zNam
17e90 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
17ea0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
17eb0 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
17ec0 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  ->z!=0 );.    if
17ed0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
17ee0 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
17ef0 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
17f00 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
17f10 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
17f20 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
17f30 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
17f40 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
17f50 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
17f60 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20  b, zName, 0)!=0 
17f70 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
17f80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
17f90 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
17fa0 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
17fb0 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
17fc0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
17fd0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
17fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17ff0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
18000 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
18010 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30  , pDb->zName)!=0
18020 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69   ){.      if( !i
18030 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20  fNotExist ){.   
18040 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
18050 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
18060 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65  dex %s already e
18070 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  xists", zName);.
18080 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18090 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
180a0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
180b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
180c0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
180d0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
180e0 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
180f0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18100 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  x;.    }.  }else
18110 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
18120 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20   Index *pLoop;. 
18130 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61     for(pLoop=pTa
18140 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20  b->pIndex, n=1; 
18150 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
18160 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b  op->pNext, n++){
18170 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  }.    zName = sq
18180 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
18190 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   "sqlite_autoind
181a0 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d  ex_%s_%d", pTab-
181b0 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  >zName, n);.    
181c0 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
181d0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
181e0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
181f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
18200 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a  eck for authoriz
18210 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ation to create 
18220 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23  an index..  */.#
18230 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18240 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
18250 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  .  {.    const c
18260 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e  har *zDb = pDb->
18270 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
18280 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
18290 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
182a0 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
182b0 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62  BLE(iDb), 0, zDb
182c0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
182d0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
182e0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  x;.    }.    i =
182f0 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49   SQLITE_CREATE_I
18300 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f  NDEX;.    if( !O
18310 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
18320 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54  b==1 ) i = SQLIT
18330 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
18340 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
18350 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
18360 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  arse, i, zName, 
18370 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
18380 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
18390 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
183a0 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
183b0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69  dif..  /* If pLi
183c0 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20  st==0, it means 
183d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
183e0 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20   called to make 
183f0 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b  a primary.  ** k
18400 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61  ey out of the la
18410 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20  st column added 
18420 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  to the table und
18430 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
18440 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20  .  ** So create 
18450 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73  a fake list to s
18460 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20  imulate this..  
18470 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
18480 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
18490 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
184a0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
184b0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  , 0);.    if( pL
184c0 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ist==0 ) goto ex
184d0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
184e0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  .    pList->a[0]
184f0 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
18500 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d  DbStrDup(pParse-
18510 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
18520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18530 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
18540 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
18550 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol-1].zName);.  
18560 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f    pList->a[0].so
18570 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 73 6f  rtOrder = (u8)so
18580 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
18590 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
185a0 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  w many bytes of 
185b0 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69 72  space are requir
185c0 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c  ed to store expl
185d0 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63  icitly.  ** spec
185e0 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ified collation 
185f0 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a  sequence names..
18600 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
18610 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
18620 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
18630 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
18640 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
18650 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20  f( pExpr ){.    
18660 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
18670 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
18680 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  );.      nExtra 
18690 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53  += (1 + sqlite3S
186a0 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75  trlen30(pExpr->u
186b0 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d  .zToken));.    }
186c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  .  }..  /* .  **
186d0 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e   Allocate the in
186e0 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a  dex structure. .
186f0 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73    */.  nName = s
18700 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
18710 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61 43  Name);.  nExtraC
18720 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e  ol = pPk ? pPk->
18730 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70  nKeyCol : 1;.  p
18740 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41  Index = sqlite3A
18750 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65  llocateIndexObje
18760 63 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45  ct(db, pList->nE
18770 78 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c  xpr + nExtraCol,
18780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187a0 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e         nName + n
187b0 45 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74  Extra + 1, &zExt
187c0 72 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ra);.  if( db->m
187d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
187e0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
187f0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
18800 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
18810 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49  YTE_ALIGNMENT(pI
18820 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  ndex->aiRowLogEs
18830 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  t) );.  assert( 
18840 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
18850 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43  MENT(pIndex->azC
18860 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78  oll) );.  pIndex
18870 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61  ->zName = zExtra
18880 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e  ;.  zExtra += nN
18890 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70  ame + 1;.  memcp
188a0 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
188b0 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29   zName, nName+1)
188c0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  ;.  pIndex->pTab
188d0 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e  le = pTab;.  pIn
188e0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28  dex->onError = (
188f0 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49  u8)onError;.  pI
18900 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  ndex->uniqNotNul
18910 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  l = onError!=OE_
18920 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  None;.  pIndex->
18930 69 64 78 54 79 70 65 20 3d 20 70 4e 61 6d 65 20  idxType = pName 
18940 3f 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  ? SQLITE_IDXTYPE
18950 5f 41 50 50 44 45 46 20 3a 20 53 51 4c 49 54 45  _APPDEF : SQLITE
18960 5f 49 44 58 54 59 50 45 5f 55 4e 49 51 55 45 3b  _IDXTYPE_UNIQUE;
18970 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  .  pIndex->pSche
18980 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
18990 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e  ].pSchema;.  pIn
189a0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70  dex->nKeyCol = p
189b0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
189c0 66 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20  f( pPIWhere ){. 
189d0 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
189e0 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
189f0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f  Parse, pTab, NC_
18a00 50 61 72 74 49 64 78 2c 20 70 50 49 57 68 65 72  PartIdx, pPIWher
18a10 65 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65  e, 0);.    pInde
18a20 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
18a30 20 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20   = pPIWhere;.   
18a40 20 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20   pPIWhere = 0;. 
18a50 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
18a60 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
18a70 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
18a80 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
18a90 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75  o see if we shou
18aa0 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65  ld honor DESC re
18ab0 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20  quests on index 
18ac0 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
18ad0 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
18ae0 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
18af0 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  ){.    sortOrder
18b00 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20  Mask = -1;   /* 
18b10 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20  Honor DESC */.  
18b20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f  }else{.    sortO
18b30 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20  rderMask = 0;   
18b40 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20   /* Ignore DESC 
18b50 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61  */.  }..  /* Sca
18b60 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  n the names of t
18b70 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
18b80 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
18b90 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c  dexed and.  ** l
18ba0 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  oad the column i
18bb0 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20  ndices into the 
18bc0 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  Index structure.
18bd0 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
18be0 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f  r.  ** if any co
18bf0 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e  lumn is not foun
18c00 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  d..  **.  ** TOD
18c10 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74 20 74  O:  Add a test t
18c20 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
18c30 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
18c40 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20   is not named.  
18c50 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  ** more than onc
18c60 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  e within the sam
18c70 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74  e index.  Only t
18c80 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63  he first instanc
18c90 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  e of.  ** the co
18ca0 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20 62  lumn will ever b
18cb0 65 20 75 73 65 64 20 62 79 20 74 68 65 20 6f 70  e used by the op
18cc0 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74  timizer.  Note t
18cd0 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  hat using the.  
18ce0 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d  ** same column m
18cf0 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 63 61  ore than once ca
18d00 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72 72 6f 72  nnot be an error
18d10 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
18d20 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65 61 6b 20  uld .  ** break 
18d30 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
18d40 69 62 69 6c 69 74 79 20 2d 20 69 74 20 6e 65 65  ibility - it nee
18d50 64 73 20 74 6f 20 62 65 20 61 20 77 61 72 6e 69  ds to be a warni
18d60 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ng..  */.  for(i
18d70 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c  =0, pListItem=pL
18d80 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
18d90 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69  >nExpr; i++, pLi
18da0 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63  stItem++){.    c
18db0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e  onst char *zColN
18dc0 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  ame = pListItem-
18dd0 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20  >zName;.    int 
18de0 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
18df0 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43  er;.    char *zC
18e00 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
18e10 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
18e20 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
18e30 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d  e */..    for(j=
18e40 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d  0, pTabCol=pTab-
18e50 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e  >aCol; j<pTab->n
18e60 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f  Col; j++, pTabCo
18e70 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l++){.      if( 
18e80 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
18e90 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c  ColName, pTabCol
18ea0 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ->zName)==0 ) br
18eb0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
18ec0 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c  f( j>=pTab->nCol
18ed0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18ee0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18ef0 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
18f00 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20  no column named 
18f10 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
18f20 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61  b->zName, zColNa
18f30 6d 65 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  me);.      pPars
18f40 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
18f50 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   1;.      goto e
18f60 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18f70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
18f80 72 74 28 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b  rt( j<=0x7fff );
18f90 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
18fa0 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29  olumn[i] = (i16)
18fb0 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  j;.    if( pList
18fc0 49 74 65 6d 2d 3e 70 45 78 70 72 20 29 7b 0a 20  Item->pExpr ){. 
18fd0 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a       int nColl;.
18fe0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
18ff0 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
19000 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
19010 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
19020 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
19030 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
19040 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    nColl = sqlite
19050 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29  3Strlen30(zColl)
19060 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   + 1;.      asse
19070 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c  rt( nExtra>=nCol
19080 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  l );.      memcp
19090 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c  y(zExtra, zColl,
190a0 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a   nColl);.      z
190b0 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20  Coll = zExtra;. 
190c0 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e       zExtra += n
190d0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74  Coll;.      nExt
190e0 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20  ra -= nColl;.   
190f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43   }else{.      zC
19100 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  oll = pTab->aCol
19110 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].zColl;.     
19120 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43   if( !zColl ) zC
19130 6f 6c 6c 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a  oll = "BINARY";.
19140 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64      }.    if( !d
19150 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
19160 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  !sqlite3LocateCo
19170 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
19180 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  oll) ){.      go
19190 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
191a0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
191b0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
191c0 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72  ] = zColl;.    r
191d0 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
191e0 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73  r = pListItem->s
191f0 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f  ortOrder & sortO
19200 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49  rderMask;.    pI
19210 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  ndex->aSortOrder
19220 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73  [i] = (u8)reques
19230 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  tedSortOrder;.  
19240 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c    if( pTab->aCol
19250 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29  [j].notNull==0 )
19260 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74   pIndex->uniqNot
19270 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Null = 0;.  }.  
19280 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 66  if( pPk ){.    f
19290 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e  or(j=0; j<pPk->n
192a0 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  KeyCol; j++){.  
192b0 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d      int x = pPk-
192c0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
192d0 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d      if( hasColum
192e0 6e 28 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  n(pIndex->aiColu
192f0 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79  mn, pIndex->nKey
19300 43 6f 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20 20  Col, x) ){.     
19310 20 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75     pIndex->nColu
19320 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c  mn--; .      }el
19330 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64  se{.        pInd
19340 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
19350 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  = x;.        pIn
19360 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
19370 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b   pPk->azColl[j];
19380 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
19390 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
193a0 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72   pPk->aSortOrder
193b0 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b  [j];.        i++
193c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
193d0 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70      assert( i==p
193e0 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  Index->nColumn )
193f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
19400 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
19410 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70 49 6e  i] = -1;.    pIn
19420 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
19430 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 20   "BINARY";.  }. 
19440 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
19450 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 20  owEst(pIndex);. 
19460 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65   if( pParse->pNe
19470 77 54 61 62 6c 65 3d 3d 30 20 29 20 65 73 74 69  wTable==0 ) esti
19480 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70  mateIndexWidth(p
19490 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70  Index);..  if( p
194a0 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65  Tab==pParse->pNe
194b0 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  wTable ){.    /*
194c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
194d0 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f  s been called to
194e0 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d   create an autom
194f0 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a  atic index as a.
19500 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66      ** result of
19510 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
19520 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
19530 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69  on a column defi
19540 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a  nition, or.    *
19550 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  * a PRIMARY KEY 
19560 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
19570 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63   following the c
19580 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
19590 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f  s..    ** i.e. o
195a0 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  ne of:.    **.  
195b0 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
195c0 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45  E t(x PRIMARY KE
195d0 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52  Y, y);.    ** CR
195e0 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20  EATE TABLE t(x, 
195f0 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29  y, UNIQUE(x, y))
19600 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
19610 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63  Either way, chec
19620 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
19630 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
19640 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e  s such an index.
19650 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64   If.    ** so, d
19660 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61  on't bother crea
19670 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54  ting this one. T
19680 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73  his only applies
19690 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d   to.    ** autom
196a0 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64  atically created
196b0 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20   indices. Users 
196c0 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77  can do as they w
196d0 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ish with.    ** 
196e0 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73  explicit indices
196f0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
19700 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52  Two UNIQUE or PR
19710 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
19720 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64  aints are consid
19730 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a  ered equivalent.
19740 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73      ** (and thus
19750 20 73 75 70 70 72 65 73 73 69 6e 67 20 74 68 65   suppressing the
19760 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65   second one) eve
19770 6e 20 69 66 20 74 68 65 79 20 68 61 76 65 20 64  n if they have d
19780 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20  ifferent.    ** 
19790 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20  sort orders..   
197a0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
197b0 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
197c0 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
197d0 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65 20  ences or if the 
197e0 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a  columns of.    *
197f0 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  * the constraint
19800 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65 72   occur in differ
19810 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e  ent orders, then
19820 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   the constraints
19830 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73   are.    ** cons
19840 69 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20  idered distinct 
19850 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20  and both result 
19860 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64 69  in separate indi
19870 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ces..    */.    
19880 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
19890 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
198a0 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
198b0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
198c0 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  .      int k;.  
198d0 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e      assert( IsUn
198e0 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
198f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
19900 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 21 3d   pIdx->idxType!=
19910 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41  SQLITE_IDXTYPE_A
19920 50 50 44 45 46 20 29 3b 0a 20 20 20 20 20 20 61  PPDEF );.      a
19930 73 73 65 72 74 28 20 49 73 55 6e 69 71 75 65 49  ssert( IsUniqueI
19940 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 3b 0a  ndex(pIndex) );.
19950 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
19960 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78  >nKeyCol!=pIndex
19970 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74  ->nKeyCol ) cont
19980 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
19990 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65  k=0; k<pIdx->nKe
199a0 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  yCol; k++){.    
199b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
199c0 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  z1;.        cons
199d0 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20  t char *z2;.    
199e0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
199f0 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65  Column[k]!=pInde
19a00 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29  x->aiColumn[k] )
19a10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
19a20 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  z1 = pIdx->azCol
19a30 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32  l[k];.        z2
19a40 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
19a50 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[k];.        if
19a60 28 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69  ( z1!=z2 && sqli
19a70 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a  te3StrICmp(z1, z
19a80 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  2) ) break;.    
19a90 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d    }.      if( k=
19aa0 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29  =pIdx->nKeyCol )
19ab0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
19ac0 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e  dx->onError!=pIn
19ad0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a  dex->onError ){.
19ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
19af0 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65  s constraint cre
19b00 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e  ates the same in
19b10 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75  dex as a previou
19b20 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
19b30 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66  onstraint specif
19b40 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e  ied somewhere in
19b50 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
19b60 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  E statement..   
19b70 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
19b80 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43  r the ON CONFLIC
19b90 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69  T clauses are di
19ba0 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68  fferent. If both
19bb0 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
19bc0 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61   ** constraint a
19bd0 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  nd the previous 
19be0 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74  equivalent const
19bf0 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69  raint have expli
19c00 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  cit.          **
19c10 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
19c20 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20  uses this is an 
19c30 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65  error. Otherwise
19c40 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20  , use the.      
19c50 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c      ** explicitl
19c60 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61  y specified beha
19c70 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  vior for the ind
19c80 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ex..          */
19c90 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
19ca0 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  (pIdx->onError==
19cb0 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49  OE_Default || pI
19cc0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
19cd0 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20  E_Default) ){.  
19ce0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19cf0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
19d00 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
19d10 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20     "conflicting 
19d20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
19d30 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20  ses specified", 
19d40 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
19d50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
19d60 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
19d70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
19d80 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45         pIdx->onE
19d90 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  rror = pIndex->o
19da0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  nError;.        
19db0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
19dc0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
19dd0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
19de0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19df0 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e  .  /* Link the n
19e00 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  ew Index structu
19e10 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20  re to its table 
19e20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72  and to the other
19e30 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  .  ** in-memory 
19e40 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
19e50 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  res. .  */.  if(
19e60 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
19e70 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  {.    Index *p;.
19e80 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
19e90 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
19ea0 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78  ld(db, 0, pIndex
19eb0 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
19ec0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
19ed0 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d  hInsert(&pIndex-
19ee0 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
19ef0 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  h, .            
19f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
19f10 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e  ndex->zName, pIn
19f20 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20  dex);.    if( p 
19f30 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
19f40 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
19f50 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
19f60 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
19f70 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
19f80 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 67  led = 1;.      g
19f90 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19fa0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
19fb0 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
19fc0 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
19fd0 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c  es;.    if( pTbl
19fe0 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
19ff0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
1a000 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
1a010 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1a020 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1a030 20 69 6e 69 74 69 61 6c 20 43 52 45 41 54 45 20   initial CREATE 
1a040 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
1a050 28 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c 45  (or CREATE TABLE
1a060 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64   if the.  ** ind
1a070 65 78 20 69 73 20 61 6e 20 69 6d 70 6c 69 65 64  ex is an implied
1a080 20 69 6e 64 65 78 20 66 6f 72 20 61 20 55 4e 49   index for a UNI
1a090 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  QUE or PRIMARY K
1a0a0 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 74  EY constraint) t
1a0b0 68 65 6e 0a 20 20 2a 2a 20 65 6d 69 74 20 63 6f  hen.  ** emit co
1a0c0 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74  de to allocate t
1a0d0 68 65 20 69 6e 64 65 78 20 72 6f 6f 74 70 61 67  he index rootpag
1a0e0 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61  e on disk and ma
1a0f0 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a  ke an entry for.
1a100 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
1a110 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
1a120 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70 6f  ter table and po
1a130 70 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65 78  pulate the index
1a140 20 77 69 74 68 0a 20 20 2a 2a 20 63 6f 6e 74 65   with.  ** conte
1a150 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74  nt.  But, do not
1a160 20 64 6f 20 74 68 69 73 20 69 66 20 77 65 20 61   do this if we a
1a170 72 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69 6e  re simply readin
1a180 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
1a190 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20 74  ter.  ** table t
1a1a0 6f 20 70 61 72 73 65 20 74 68 65 20 73 63 68 65  o parse the sche
1a1b0 6d 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20 69  ma, or if this i
1a1c0 6e 64 65 78 20 69 73 20 74 68 65 20 50 52 49 4d  ndex is the PRIM
1a1d0 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20 20  ARY KEY index.  
1a1e0 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54 20  ** of a WITHOUT 
1a1f0 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20 2a  ROWID table..  *
1a200 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61  *.  ** If pTblNa
1a210 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
1a220 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e  his index is gen
1a230 65 72 61 74 65 64 20 61 73 20 61 6e 20 69 6d 70  erated as an imp
1a240 6c 69 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59  lied PRIMARY KEY
1a250 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20  .  ** or UNIQUE 
1a260 69 6e 64 65 78 20 69 6e 20 61 20 43 52 45 41 54  index in a CREAT
1a270 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
1a280 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61  t.  Since the ta
1a290 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73  ble.  ** has jus
1a2a0 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  t been created, 
1a2b0 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  it contains no d
1a2c0 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ata and the inde
1a2d0 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  x initialization
1a2e0 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62  .  ** step can b
1a2f0 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  e skipped..  */.
1a300 20 20 65 6c 73 65 20 69 66 28 20 70 50 61 72 73    else if( pPars
1a310 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28 48  e->nErr==0 && (H
1a320 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c  asRowid(pTab) ||
1a330 20 70 54 62 6c 4e 61 6d 65 21 3d 30 29 20 29 7b   pTblName!=0) ){
1a340 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
1a350 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
1a360 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b     int iMem = ++
1a370 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20  pParse->nMem;.. 
1a380 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
1a390 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1a3a0 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f     if( v==0 ) go
1a3b0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
1a3c0 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43  ndex;...    /* C
1a3d0 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61  reate the rootpa
1a3e0 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ge for the index
1a3f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
1a400 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
1a410 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
1a420 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
1a430 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1a440 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c   OP_CreateIndex,
1a450 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20   iDb, iMem);..  
1a460 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20    /* Gather the 
1a470 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  complete text of
1a480 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
1a490 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f  X statement into
1a4a0 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d  .    ** the zStm
1a4b0 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  t variable.    *
1a4c0 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74  /.    if( pStart
1a4d0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   ){.      int n 
1a4e0 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e  = (int)(pParse->
1a4f0 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70  sLastToken.z - p
1a500 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73  Name->z) + pPars
1a510 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b  e->sLastToken.n;
1a520 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65  .      if( pName
1a530 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20  ->z[n-1]==';' ) 
1a540 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20  n--;.      /* A 
1a550 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68  named index with
1a560 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45   an explicit CRE
1a570 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
1a580 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74  ent */.      zSt
1a590 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
1a5a0 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45 25  ntf(db, "CREATE%
1a5b0 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20  s INDEX %.*s",. 
1a5c0 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d         onError==
1a5d0 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22  OE_None ? "" : "
1a5e0 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e 61   UNIQUE", n, pNa
1a5f0 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  me->z);.    }els
1a600 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61  e{.      /* An a
1a610 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63  utomatic index c
1a620 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49 4d  reated by a PRIM
1a630 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
1a640 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  E constraint */.
1a650 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d        /* zStmt =
1a660 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
1a670 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ""); */.      zS
1a680 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  tmt = 0;.    }..
1a690 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e      /* Add an en
1a6a0 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61  try in sqlite_ma
1a6b0 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e  ster for this in
1a6c0 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  dex.    */.    s
1a6d0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
1a6e0 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
1a6f0 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
1a700 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e  %Q.%s VALUES('in
1a710 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25  dex',%Q,%Q,#%d,%
1a720 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62  Q);",.        db
1a730 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
1a740 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
1a750 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e  Db),.        pIn
1a760 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  dex->zName,.    
1a770 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c      pTab->zName,
1a780 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20  .        iMem,. 
1a790 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20         zStmt.   
1a7a0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
1a7b0 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29  bFree(db, zStmt)
1a7c0 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74  ;..    /* Fill t
1a7d0 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64 61  he index with da
1a7e0 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20 74  ta and reparse t
1a7f0 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20  he schema. Code 
1a800 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20  an OP_Expire.   
1a810 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74   ** to invalidat
1a820 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c  e all pre-compil
1a830 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
1a840 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54     */.    if( pT
1a850 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  blName ){.      
1a860 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
1a870 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
1a880 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20  x, iMem);.      
1a890 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
1a8a0 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
1a8b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a8c0 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
1a8d0 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20  aOp(v, iDb,.    
1a8e0 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
1a8f0 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25  ntf(db, "name='%
1a900 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64  q' AND type='ind
1a910 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  ex'", pIndex->zN
1a920 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  ame));.      sql
1a930 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1a940 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 29 3b  , OP_Expire, 0);
1a950 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1a960 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20   When adding an 
1a970 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73  index to the lis
1a980 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72  t of indices for
1a990 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20   a table, make. 
1a9a0 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64   ** sure all ind
1a9b0 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f  ices labeled OE_
1a9c0 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74  Replace come aft
1a9d0 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62  er all those lab
1a9e0 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e  eled.  ** OE_Ign
1a9f0 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ore.  This is ne
1aa00 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20  cessary for the 
1aa10 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72 61 69  correct constrai
1aa20 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72  nt check.  ** pr
1aa30 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73 71 6c  ocessing (in sql
1aa40 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73  ite3GenerateCons
1aa50 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29 29 20  traintChecks()) 
1aa60 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20  as part of.  ** 
1aa70 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53 45 52  UPDATE and INSER
1aa80 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a  T statements.  .
1aa90 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
1aaa0 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c  nit.busy || pTbl
1aab0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Name==0 ){.    i
1aac0 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  f( onError!=OE_R
1aad0 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e  eplace || pTab->
1aae0 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20  pIndex==0.      
1aaf0 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64     || pTab->pInd
1ab00 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  ex->onError==OE_
1ab10 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20  Replace){.      
1ab20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20  pIndex->pNext = 
1ab30 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  pTab->pIndex;.  
1ab40 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78      pTab->pIndex
1ab50 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
1ab60 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
1ab70 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62  x *pOther = pTab
1ab80 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
1ab90 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70  while( pOther->p
1aba0 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e  Next && pOther->
1abb0 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d  pNext->onError!=
1abc0 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20  OE_Replace ){.  
1abd0 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70        pOther = p
1abe0 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
1abf0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64      }.      pInd
1ac00 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68  ex->pNext = pOth
1ac10 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
1ac20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d   pOther->pNext =
1ac30 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20   pIndex;.    }. 
1ac40 20 20 20 70 52 65 74 20 3d 20 70 49 6e 64 65 78     pRet = pIndex
1ac50 3b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30  ;.    pIndex = 0
1ac60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  ;.  }..  /* Clea
1ac70 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74  n up before exit
1ac80 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61  ing */.exit_crea
1ac90 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20  te_index:.  if( 
1aca0 70 49 6e 64 65 78 20 29 20 66 72 65 65 49 6e 64  pIndex ) freeInd
1acb0 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
1acc0 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1acd0 65 74 65 28 64 62 2c 20 70 50 49 57 68 65 72 65  ete(db, pPIWhere
1ace0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1acf0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1ad00 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
1ad10 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
1ad20 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73  , pTblName);.  s
1ad30 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1ad40 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
1ad50 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
1ad60 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e   Fill the Index.
1ad70 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79  aiRowEst[] array
1ad80 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e   with default in
1ad90 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f  formation - info
1ada0 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  rmation.** to be
1adb0 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61   used when we ha
1adc0 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41  ve not run the A
1add0 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
1ade0 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30  **.** aiRowEst[0
1adf0 5d 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f  ] is supposed to
1ae00 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
1ae10 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
1ae20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  in the index..**
1ae30 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74   Since we do not
1ae40 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d   know, guess 1 m
1ae50 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73  illion.  aiRowEs
1ae60 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[1] is an estim
1ae70 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  ate of the.** nu
1ae80 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1ae90 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d  the table that m
1aea0 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
1aeb0 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65  lar value of the
1aec0 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  .** first column
1aed0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
1aee0 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61  aiRowEst[2] is a
1aef0 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
1af00 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72  e number.** of r
1af10 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  ows that match a
1af20 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f  ny particular co
1af30 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
1af40 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73   first 2 columns
1af50 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78  .** of the index
1af60 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
1af70 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73    It must always
1af80 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
1af90 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  t.*.**          
1afa0 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69   aiRowEst[N]<=ai
1afb0 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20  RowEst[N-1].**  
1afc0 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
1afd0 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70  t[N]>=1.**.** Ap
1afe0 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77  art from that, w
1aff0 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f  e have little to
1b000 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69   go on besides i
1b010 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a  ntuition as to.*
1b020 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d  * how aiRowEst[]
1b030 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
1b040 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d  alized.  The num
1b050 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68  bers generated h
1b060 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64  ere.** are based
1b070 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75   on typical valu
1b080 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75  es found in actu
1b090 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76  al indices..*/.v
1b0a0 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75  oid sqlite3Defau
1b0b0 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a  ltRowEst(Index *
1b0c0 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20  pIdx){.  /*     
1b0d0 20 20 20 20 20 20 20 20 20 20 20 31 30 2c 20 20             10,  
1b0e0 39 2c 20 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f  9,  8,  7,  6 */
1b0f0 0a 20 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d  .  LogEst aVal[]
1b100 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c   = { 33, 32, 30,
1b110 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67   28, 26 };.  Log
1b120 45 73 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61  Est *a = pIdx->a
1b130 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e  iRowLogEst;.  in
1b140 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72  t nCopy = MIN(Ar
1b150 72 61 79 53 69 7a 65 28 61 56 61 6c 29 2c 20 70  raySize(aVal), p
1b160 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20  Idx->nKeyCol);. 
1b170 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 65   int i;..  /* Se
1b180 74 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  t the first entr
1b190 79 20 28 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  y (number of row
1b1a0 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 29 20  s in the index) 
1b1b0 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  to the estimated
1b1c0 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66   .  ** number of
1b1d0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1b1e0 6c 65 2e 20 4f 72 20 31 30 2c 20 69 66 20 74 68  le. Or 10, if th
1b1f0 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
1b200 65 72 20 6f 66 20 72 6f 77 73 20 0a 20 20 2a 2a  er of rows .  **
1b210 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73   in the table is
1b220 20 6c 65 73 73 20 74 68 61 6e 20 74 68 61 74 2e   less than that.
1b230 20 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20 70 49    */.  a[0] = pI
1b240 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  dx->pTable->nRow
1b250 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28 20 61 5b  LogEst;.  if( a[
1b260 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d 20 33  0]<33 ) a[0] = 3
1b270 33 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74  3;        assert
1b280 28 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 33==sqlite3Log
1b290 45 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a  Est(10) );..  /*
1b2a0 20 45 73 74 69 6d 61 74 65 20 74 68 61 74 20 61   Estimate that a
1b2b0 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20  [1] is 10, a[2] 
1b2c0 69 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c  is 9, a[3] is 8,
1b2d0 20 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d   a[4] is 7, a[5]
1b2e0 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65   is.  ** 6 and e
1b2f0 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 76  ach subsequent v
1b300 61 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69 73  alue (if any) is
1b310 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79   5.  */.  memcpy
1b320 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43  (&a[1], aVal, nC
1b330 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73  opy*sizeof(LogEs
1b340 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f  t));.  for(i=nCo
1b350 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e  py+1; i<=pIdx->n
1b360 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
1b370 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20    a[i] = 23;    
1b380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b390 61 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69  assert( 23==sqli
1b3a0 74 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a  te3LogEst(5) );.
1b3b0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30    }..  assert( 0
1b3c0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
1b3d0 31 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e  1) );.  if( IsUn
1b3e0 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
1b3f0 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ) a[pIdx->nKeyCo
1b400 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  l] = 0;.}../*.**
1b410 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
1b420 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74  ll drop an exist
1b430 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  ing named index.
1b440 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1b450 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
1b460 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74   DROP INDEX stat
1b470 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
1b480 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28  qlite3DropIndex(
1b490 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1b4a0 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
1b4b0 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20  nt ifExists){.  
1b4c0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
1b4d0 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
1b4e0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1b4f0 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
1b500 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1b510 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20  se->nErr==0 );  
1b520 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64   /* Never called
1b530 20 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f   with prior erro
1b540 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  rs */.  if( db->
1b550 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1b560 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1b570 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
1b580 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e  assert( pName->n
1b590 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  Src==1 );.  if( 
1b5a0 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
1b5b0 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
1b5c0 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  rse) ){.    goto
1b5d0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1b5e0 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
1b5f0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
1b600 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  x(db, pName->a[0
1b610 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
1b620 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
1b630 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
1b640 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45   ){.    if( !ifE
1b650 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73  xists ){.      s
1b660 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1b670 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
1b680 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d  index: %S", pNam
1b690 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e, 0);.    }else
1b6a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
1b6b0 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
1b6c0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61  hema(pParse, pNa
1b6d0 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
1b6e0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  se);.    }.    p
1b6f0 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
1b700 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ma = 1;.    goto
1b710 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1b720 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64  ;.  }.  if( pInd
1b730 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c  ex->idxType!=SQL
1b740 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
1b750 45 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EF ){.    sqlite
1b760 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1b770 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61  , "index associa
1b780 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20  ted with UNIQUE 
1b790 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d  ".      "or PRIM
1b7a0 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
1b7b0 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f  nt cannot be dro
1b7c0 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67  pped", 0);.    g
1b7d0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1b7e0 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  dex;.  }.  iDb =
1b7f0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
1b800 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
1b810 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e  ->pSchema);.#ifn
1b820 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b830 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
1b840 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d  {.    int code =
1b850 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
1b860 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  EX;.    Table *p
1b870 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
1b880 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  able;.    const 
1b890 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
1b8a0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
1b8b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1b8c0 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
1b8d0 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66  BLE(iDb);.    if
1b8e0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1b8f0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1b900 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
1b910 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
1b920 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1b930 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
1b940 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
1b950 42 20 26 26 20 69 44 62 20 29 20 63 6f 64 65 20  B && iDb ) code 
1b960 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
1b970 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
1b980 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1b990 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
1b9a0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
1b9b0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
1b9c0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1b9d0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1b9e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1b9f0 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
1ba00 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
1ba10 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72  the index and fr
1ba20 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
1ba30 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ble */.  v = sql
1ba40 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1ba50 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
1ba60 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1ba70 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1ba80 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
1ba90 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
1baa0 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
1bab0 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
1bac0 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e  OM %Q.%s WHERE n
1bad0 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65 3d  ame=%Q AND type=
1bae0 27 69 6e 64 65 78 27 22 2c 0a 20 20 20 20 20 20  'index'",.      
1baf0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
1bb00 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
1bb10 45 28 69 44 62 29 2c 20 70 49 6e 64 65 78 2d 3e  E(iDb), pIndex->
1bb20 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
1bb30 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61   sqlite3ClearSta
1bb40 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20  tTables(pParse, 
1bb50 69 44 62 2c 20 22 69 64 78 22 2c 20 70 49 6e 64  iDb, "idx", pInd
1bb60 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ex->zName);.    
1bb70 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
1bb80 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
1bb90 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
1bba0 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
1bbb0 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  ndex->tnum, iDb)
1bbc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1bbd0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72  eAddOp4(v, OP_Dr
1bbe0 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c  opIndex, iDb, 0,
1bbf0 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d   0, pIndex->zNam
1bc00 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  e, 0);.  }..exit
1bc10 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73  _drop_index:.  s
1bc20 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1bc30 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ete(db, pName);.
1bc40 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20  }../*.** pArray 
1bc50 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1bc60 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65  an array of obje
1bc70 63 74 73 2e 20 45 61 63 68 20 6f 62 6a 65 63 74  cts. Each object
1bc80 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79   in the.** array
1bc90 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65   is szEntry byte
1bca0 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73 20  s in size. This 
1bcb0 72 6f 75 74 69 6e 65 20 75 73 65 73 20 73 71 6c  routine uses sql
1bcc0 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a  ite3DbRealloc().
1bcd0 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  ** to extend the
1bce0 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 74   array so that t
1bcf0 68 65 72 65 20 69 73 20 73 70 61 63 65 20 66 6f  here is space fo
1bd00 72 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 20 61  r a new object a
1bd10 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a  t the end..**.**
1bd20 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
1bd30 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a  ion is called, *
1bd40 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73  pnEntry contains
1bd50 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
1bd60 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72 61  e of.** the arra
1bd70 79 20 28 69 6e 20 65 6e 74 72 69 65 73 20 2d 20  y (in entries - 
1bd80 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  so the allocatio
1bd90 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74 72 79 29  n is ((*pnEntry)
1bda0 20 2a 20 73 7a 45 6e 74 72 79 29 20 62 79 74 65   * szEntry) byte
1bdb0 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a  s.** in total)..
1bdc0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 61  **.** If the rea
1bdd0 6c 6c 6f 63 28 29 20 69 73 20 73 75 63 63 65 73  lloc() is succes
1bde0 73 66 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f  sful (i.e. if no
1bdf0 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f   OOM condition o
1be00 63 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73  ccurs), the.** s
1be10 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
1be20 6f 72 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  or the new objec
1be30 74 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e  t is zeroed, *pn
1be40 45 6e 74 72 79 20 75 70 64 61 74 65 64 20 74 6f  Entry updated to
1be50 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 65 20  .** reflect the 
1be60 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20  new size of the 
1be70 61 72 72 61 79 20 61 6e 64 20 61 20 70 6f 69 6e  array and a poin
1be80 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 61  ter to the new a
1be90 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74  llocation.** ret
1bea0 75 72 6e 65 64 2e 20 2a 70 49 64 78 20 69 73 20  urned. *pIdx is 
1beb0 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
1bec0 20 6f 66 20 74 68 65 20 6e 65 77 20 61 72 72 61   of the new arra
1bed0 79 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20  y entry in this 
1bee0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  case..**.** Othe
1bef0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 72 65  rwise, if the re
1bf00 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a  alloc() fails, *
1bf10 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 2d  pIdx is set to -
1bf20 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61  1, *pnEntry rema
1bf30 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  ins.** unchanged
1bf40 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 70   and a copy of p
1bf50 41 72 72 61 79 20 72 65 74 75 72 6e 65 64 2e 0a  Array returned..
1bf60 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
1bf70 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
1bf80 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1bf90 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1bfa0 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61   to notify of ma
1bfb0 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f  lloc failures */
1bfc0 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c  .  void *pArray,
1bfd0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
1bfe0 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74   objects.  Might
1bff0 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20   be reallocated 
1c000 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79  */.  int szEntry
1c010 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  ,      /* Size o
1c020 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e  f each object in
1c030 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20   the array */.  
1c040 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20  int *pnEntry,   
1c050 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
1c060 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79  bjects currently
1c070 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74   in use */.  int
1c080 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f   *pIdx         /
1c090 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65  * Write the inde
1c0a0 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20  x of a new slot 
1c0b0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  here */.){.  cha
1c0c0 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  r *z;.  int n = 
1c0d0 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28 20  *pnEntry;.  if( 
1c0e0 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29  (n & (n-1))==0 )
1c0f0 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 28  {.    int sz = (
1c100 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b  n==0) ? 1 : 2*n;
1c110 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20  .    void *pNew 
1c120 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
1c130 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20 73  oc(db, pArray, s
1c140 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20  z*szEntry);.    
1c150 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1c160 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b       *pIdx = -1;
1c170 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41  .      return pA
1c180 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rray;.    }.    
1c190 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20  pArray = pNew;. 
1c1a0 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29   }.  z = (char*)
1c1b0 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74  pArray;.  memset
1c1c0 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d  (&z[n * szEntry]
1c1d0 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20  , 0, szEntry);. 
1c1e0 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b   *pIdx = n;.  ++
1c1f0 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75  *pnEntry;.  retu
1c200 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a  rn pArray;.}../*
1c210 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
1c220 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
1c230 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43  given IdList.  C
1c240 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69  reate a new IdLi
1c250 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
1c260 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64  ..**.** A new Id
1c270 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
1c280 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
1c290 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
1c2a0 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
1c2b0 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69  dListAppend(sqli
1c2c0 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
1c2d0 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
1c2e0 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  Token){.  int i;
1c2f0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1c300 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
1c310 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1c320 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64  ro(db, sizeof(Id
1c330 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
1c340 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1c350 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
1c360 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72  t->a = sqlite3Ar
1c370 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
1c380 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69     db,.      pLi
1c390 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a  st->a,.      siz
1c3a0 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
1c3b0 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e  ,.      &pList->
1c3c0 6e 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20  nId,.      &i.  
1c3d0 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  );.  if( i<0 ){.
1c3e0 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1c3f0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
1c400 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
1c410 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  ;.  }.  pList->a
1c420 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
1c430 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1c440 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
1c450 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
1c460 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
1c470 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64   IdList..*/.void
1c480 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1c490 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
1c4a0 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  , IdList *pList)
1c4b0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1c4c0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1c4d0 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
1c4e0 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
1c4f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1c500 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
1c510 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
1c520 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1c530 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a  (db, pList->a);.
1c540 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1c550 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
1c560 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1c570 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
1c580 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
1c590 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
1c5a0 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
1c5b0 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
1c5c0 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
1c5d0 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
1c5e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1c5f0 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
1c600 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1c610 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
1c620 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
1c630 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
1c640 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1c650 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1c660 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
1c670 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
1c680 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
1c690 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73 70  ** Expand the sp
1c6a0 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
1c6b0 72 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  r the given SrcL
1c6c0 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a  ist object by.**
1c6d0 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61   creating nExtra
1c6e0 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e   new slots begin
1c6f0 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20  ning at iStart. 
1c700 20 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20   iStart is zero 
1c710 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c  based..** New sl
1c720 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ots are zeroed..
1c730 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1c740 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72 63  e, suppose a Src
1c750 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63  List initially c
1c760 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72  ontains two entr
1c770 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20  ies: A,B..** To 
1c780 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74  append 3 new ent
1c790 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e  ries onto the en
1c7a0 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a  d, do this:.**.*
1c7b0 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  *    sqlite3SrcL
1c7c0 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
1c7d0 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a  Srclist, 3, 2);.
1c7e0 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
1c7f0 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f  call above it wo
1c800 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c  uld contain:  A,
1c810 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69   B, nil, nil, ni
1c820 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74  l..** If the iSt
1c830 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64  art argument had
1c840 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20   been 1 instead 
1c850 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72  of 2, then the r
1c860 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68  esult.** would h
1c870 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69  ave been:  A, ni
1c880 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20  l, nil, nil, B. 
1c890 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20   To prepend the 
1c8a0 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68  new slots,.** th
1c8b0 65 20 69 53 74 61 72 74 20 76 61 6c 75 65 20 77  e iStart value w
1c8c0 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20  ould be 0.  The 
1c8d0 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c  result then woul
1c8e0 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69  d.** be: nil, ni
1c8f0 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a  l, nil, A, B..**
1c900 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
1c910 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
1c920 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 73 20   the SrcList is 
1c930 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 65 0a  unchanged.  The.
1c940 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ** db->mallocFai
1c950 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20 62 65  led flag will be
1c960 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f   set to true..*/
1c970 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
1c980 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
1c990 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1c9a0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1c9b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
1c9c0 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72  notify of OOM er
1c9d0 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73  rors */.  SrcLis
1c9e0 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  t *pSrc,     /* 
1c9f0 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62  The SrcList to b
1ca00 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20  e enlarged */.  
1ca10 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
1ca20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ca30 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64  new slots to add
1ca40 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f   to pSrc->a[] */
1ca50 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20 20 20  .  int iStart   
1ca60 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
1ca70 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66  n pSrc->a[] of f
1ca80 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f  irst new slot */
1ca90 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
1caa0 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
1cab0 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61  ng on calling pa
1cac0 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73  rameters */.  as
1cad0 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20  sert( iStart>=0 
1cae0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  );.  assert( nEx
1caf0 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  tra>=1 );.  asse
1cb00 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
1cb10 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
1cb20 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a  =pSrc->nSrc );..
1cb30 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64    /* Allocate ad
1cb40 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69  ditional space i
1cb50 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66  f needed */.  if
1cb60 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e 53 72  ( (u32)pSrc->nSr
1cb70 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e  c+nExtra>pSrc->n
1cb80 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63  Alloc ){.    Src
1cb90 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
1cba0 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72  int nAlloc = pSr
1cbb0 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a  c->nSrc+nExtra;.
1cbc0 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20      int nGot;.  
1cbd0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1cbe0 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53  DbRealloc(db, pS
1cbf0 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rc,.            
1cc00 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29     sizeof(*pSrc)
1cc10 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69   + (nAlloc-1)*si
1cc20 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29  zeof(pSrc->a[0])
1cc30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77   );.    if( pNew
1cc40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
1cc50 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
1cc60 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
1cc70 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20  eturn pSrc;.    
1cc80 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65  }.    pSrc = pNe
1cc90 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73  w;.    nGot = (s
1cca0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69  qlite3DbMallocSi
1ccb0 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73  ze(db, pNew) - s
1ccc0 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69  izeof(*pSrc))/si
1ccd0 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29  zeof(pSrc->a[0])
1cce0 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41  +1;.    pSrc->nA
1ccf0 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a 20 20 7d  lloc = nGot;.  }
1cd00 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73  ..  /* Move exis
1cd10 74 69 6e 67 20 73 6c 6f 74 73 20 74 68 61 74 20  ting slots that 
1cd20 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65 20 6e  come after the n
1cd30 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20 73 6c  ewly inserted sl
1cd40 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20  ots.  ** out of 
1cd50 74 68 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72  the way */.  for
1cd60 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b  (i=pSrc->nSrc-1;
1cd70 20 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29   i>=iStart; i--)
1cd80 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b  {.    pSrc->a[i+
1cd90 6e 45 78 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e  nExtra] = pSrc->
1cda0 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63  a[i];.  }.  pSrc
1cdb0 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74 72 61  ->nSrc += nExtra
1cdc0 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65  ;..  /* Zero the
1cdd0 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   newly allocated
1cde0 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73   slots */.  mems
1cdf0 65 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61  et(&pSrc->a[iSta
1ce00 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  rt], 0, sizeof(p
1ce10 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72  Src->a[0])*nExtr
1ce20 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61  a);.  for(i=iSta
1ce30 72 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78  rt; i<iStart+nEx
1ce40 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  tra; i++){.    p
1ce50 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
1ce60 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  r = -1;.  }..  /
1ce70 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1ce80 65 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67  er to the enlarg
1ce90 65 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  ed SrcList */.  
1cea0 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a  return pSrc;.}..
1ceb0 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
1cec0 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  new table name t
1ced0 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  o the given SrcL
1cee0 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
1cef0 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a  ew SrcList if.**
1cf00 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77   need be.  A new
1cf10 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65   entry is create
1cf20 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  d in the SrcList
1cf30 20 65 76 65 6e 20 69 66 20 70 54 61 62 6c 65 20   even if pTable 
1cf40 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41  is NULL..**.** A
1cf50 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75   SrcList is retu
1cf60 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
1cf70 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d   there is an OOM
1cf80 20 65 72 72 6f 72 2e 20 20 54 68 65 20 72 65 74   error.  The ret
1cf90 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74  urned.** SrcList
1cfa0 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61   might be the sa
1cfb0 6d 65 20 61 73 20 74 68 65 20 53 72 63 4c 69 73  me as the SrcLis
1cfc0 74 20 74 68 61 74 20 77 61 73 20 69 6e 70 75 74  t that was input
1cfd0 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a   or it might be.
1cfe0 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49  ** a new one.  I
1cff0 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64  f an OOM error d
1d000 6f 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  oes occurs, then
1d010 20 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65   the prior value
1d020 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61   of pList.** tha
1d030 74 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68  t is input to th
1d040 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75  is routine is au
1d050 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65  tomatically free
1d060 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74  d..**.** If pDat
1d070 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c  abase is not nul
1d080 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
1d090 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
1d0a0 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61  n optional.** da
1d0b0 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66  tabase name pref
1d0c0 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20  ix.  Like this: 
1d0d0 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65   "database.table
1d0e0 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73  ".  The pDatabas
1d0f0 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  e.** points to t
1d100 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
1d110 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69  d the pTable poi
1d120 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nts to the datab
1d130 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65  ase name..** The
1d140 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61   SrcList.a[].zNa
1d150 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c  me field is fill
1d160 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
1d170 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67  e name which mig
1d180 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20  ht.** come from 
1d190 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61  pTable (if pData
1d1a0 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72  base is NULL) or
1d1b0 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e   from pDatabase.
1d1c0 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b    .** SrcList.a[
1d1d0 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66  ].zDatabase is f
1d1e0 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
1d1f0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f  atabase name fro
1d200 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20  m pTable,.** or 
1d210 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20  with NULL if no 
1d220 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63  database is spec
1d230 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ified..**.** In 
1d240 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
1d250 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  call like this:.
1d260 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
1d270 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1d280 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a  nd(D,A,B,0);.**.
1d290 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74  ** Then B is a t
1d2a0 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
1d2b0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
1d2c0 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20  is unspecified. 
1d2d0 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69   If called.** li
1d2e0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1d2f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1d300 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
1d310 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,C);.**.** Then
1d320 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20   C is the table 
1d330 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68  name and B is th
1d340 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
1d350 20 20 49 66 20 43 20 69 73 20 64 65 66 69 6e 65    If C is define
1d360 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73 20  d.** then so is 
1d370 42 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  B.  In other wor
1d380 64 73 2c 20 77 65 20 6e 65 76 65 72 20 68 61 76  ds, we never hav
1d390 65 20 61 20 63 61 73 65 20 77 68 65 72 65 3a 0a  e a case where:.
1d3a0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
1d3b0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1d3c0 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a  nd(D,A,0,C);.**.
1d3d0 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c 65 20 61  ** Both pTable a
1d3e0 6e 64 20 70 44 61 74 61 62 61 73 65 20 61 72 65  nd pDatabase are
1d3f0 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 71   assumed to be q
1d400 75 6f 74 65 64 2e 20 20 54 68 65 79 20 61 72 65  uoted.  They are
1d410 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66   dequoted.** bef
1d420 6f 72 65 20 62 65 69 6e 67 20 61 64 64 65 64 20  ore being added 
1d430 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 2e 0a  to the SrcList..
1d440 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
1d450 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1d460 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1d470 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
1d480 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
1d490 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  of malloc failur
1d4a0 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  es */.  SrcList 
1d4b0 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41  *pList,     /* A
1d4c0 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72  ppend to this Sr
1d4d0 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61  cList. NULL crea
1d4e0 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73  tes a new SrcLis
1d4f0 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  t */.  Token *pT
1d500 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61  able,      /* Ta
1d510 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  ble to append */
1d520 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  .  Token *pDatab
1d530 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ase    /* Databa
1d540 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  se of the table 
1d550 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
1d560 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1d570 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44  em;.  assert( pD
1d580 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54  atabase==0 || pT
1d590 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43  able!=0 );  /* C
1d5a0 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74  annot have C wit
1d5b0 68 6f 75 74 20 42 20 2a 2f 0a 20 20 69 66 28 20  hout B */.  if( 
1d5c0 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
1d5d0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
1d5e0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
1d5f0 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20  sizeof(SrcList) 
1d600 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
1d610 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1d620 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
1d630 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 69  c = 1;.  }.  pLi
1d640 73 74 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  st = sqlite3SrcL
1d650 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
1d660 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e  List, 1, pList->
1d670 6e 53 72 63 29 3b 0a 20 20 69 66 28 20 64 62 2d  nSrc);.  if( db-
1d680 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1d690 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
1d6a0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
1d6b0 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ist);.    return
1d6c0 20 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20   0;.  }.  pItem 
1d6d0 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
1d6e0 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66  t->nSrc-1];.  if
1d6f0 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
1d700 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29  Database->z==0 )
1d710 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  {.    pDatabase 
1d720 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
1d730 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20  Database ){.    
1d740 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70  Token *pTemp = p
1d750 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44  Database;.    pD
1d760 61 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65  atabase = pTable
1d770 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70  ;.    pTable = p
1d780 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65  Temp;.  }.  pIte
1d790 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
1d7a0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1d7b0 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 70  db, pTable);.  p
1d7c0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
1d7d0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1d7e0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61  mToken(db, pData
1d7f0 62 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  base);.  return 
1d800 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
1d810 41 73 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f  Assign VdbeCurso
1d820 72 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20  r index numbers 
1d830 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  to all tables in
1d840 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f   a SrcList.*/.vo
1d850 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1d860 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50  tAssignCursors(P
1d870 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1d880 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
1d890 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1d8a0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1d8b0 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70  Item;.  assert(p
1d8c0 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e  List || pParse->
1d8d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1d8e0 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
1d8f0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  ){.    for(i=0, 
1d900 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
1d910 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
1d920 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1d930 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69      if( pItem->i
1d940 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61  Cursor>=0 ) brea
1d950 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  k;.      pItem->
1d960 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  iCursor = pParse
1d970 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
1d980 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
1d990 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
1d9a0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
1d9b0 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
1d9c0 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
1d9d0 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d  ->pSrc);.      }
1d9e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1d9f0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
1da00 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63  tire SrcList inc
1da10 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73  luding all its s
1da20 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  ubstructure..*/.
1da30 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
1da40 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
1da50 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a  3 *db, SrcList *
1da60 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1da70 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1da80 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1da90 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1daa0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49  return;.  for(pI
1dab0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
1dac0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  0; i<pList->nSrc
1dad0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1dae0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1daf0 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44  ee(db, pItem->zD
1db00 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
1db10 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1db20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
1db30 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1db40 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  (db, pItem->zAli
1db50 61 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  as);.    sqlite3
1db60 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
1db70 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20 73  ->zIndex);.    s
1db80 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
1db90 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61  e(db, pItem->pTa
1dba0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  b);.    sqlite3S
1dbb0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
1dbc0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pItem->pSelect);
1dbd0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1dbe0 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
1dbf0 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ->pOn);.    sqli
1dc00 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
1dc10 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e  db, pItem->pUsin
1dc20 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
1dc30 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1dc40 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
1dc50 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1dc60 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
1dc70 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74  r to add a new t
1dc80 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  erm to the.** en
1dc90 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46  d of a growing F
1dca0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ROM clause.  The
1dcb0 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
1dcc0 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a  s the part of.**
1dcd0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1dce0 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
1dcf0 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74  y been construct
1dd00 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c  ed.  "p" is NULL
1dd10 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74  .** if this is t
1dd20 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66  he first term of
1dd30 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1dd40 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  .  pTable and pD
1dd50 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74  atabase.** are t
1dd60 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
1dd70 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73  able and databas
1dd80 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
1dd90 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ROM clause term.
1dda0 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73  .** pDatabase is
1ddb0 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74   NULL if the dat
1ddc0 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69  abase name quali
1ddd0 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20  fier is missing 
1dde0 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63  - the.** usual c
1ddf0 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72  ase.  If the ter
1de00 6d 20 68 61 73 20 61 6e 20 61 6c 69 61 73 2c 20  m has an alias, 
1de10 74 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e  then pAlias poin
1de20 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69  ts to the.** ali
1de30 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68  as token.  If th
1de40 65 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71  e term is a subq
1de50 75 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71  uery, then pSubq
1de60 75 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53  uery is the.** S
1de70 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
1de80 74 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72  that the subquer
1de90 79 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20  y encodes.  The 
1dea0 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44  pTable and.** pD
1deb0 61 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65  atabase paramete
1dec0 72 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20  rs are NULL for 
1ded0 73 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65  subqueries.  The
1dee0 20 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a   pOn and pUsing.
1def0 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72  ** parameters ar
1df00 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
1df10 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e   the ON and USIN
1df20 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a  G clauses..**.**
1df30 20 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72   Return a new Sr
1df40 63 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f  cList which enco
1df50 64 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20  des is the FROM 
1df60 77 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20  with the new.** 
1df70 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53  term added..*/.S
1df80 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
1df90 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
1dfa0 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Term(.  Parse *p
1dfb0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
1dfc0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
1dfd0 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
1dfe0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1dff0 2f 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74  /* The left part
1e000 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
1e010 75 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e  use already seen
1e020 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
1e030 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ble,          /*
1e040 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
1e050 6c 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65  le to add to the
1e060 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
1e070 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61    Token *pDataba
1e080 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  se,       /* Nam
1e090 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1e0a0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61  e containing pTa
1e0b0 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
1e0c0 70 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20  pAlias,         
1e0d0 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61   /* The right-ha
1e0e0 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41  nd side of the A
1e0f0 53 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  S subexpression 
1e100 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75  */.  Select *pSu
1e110 62 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20  bquery,      /* 
1e120 41 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20  A subquery used 
1e130 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61  in place of a ta
1e140 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78  ble name */.  Ex
1e150 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20  pr *pOn,        
1e160 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20        /* The ON 
1e170 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e  clause of a join
1e180 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55   */.  IdList *pU
1e190 73 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a  sing          /*
1e1a0 20 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   The USING claus
1e1b0 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29  e of a join */.)
1e1c0 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
1e1d0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1e1e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1e1f0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
1e200 28 20 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20  ( !p && (pOn || 
1e210 70 55 73 69 6e 67 29 20 29 7b 0a 20 20 20 20 73  pUsing) ){.    s
1e220 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1e230 50 61 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63  Parse, "a JOIN c
1e240 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65  lause is require
1e250 64 20 62 65 66 6f 72 65 20 25 73 22 2c 20 0a 20  d before %s", . 
1e260 20 20 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22       (pOn ? "ON"
1e270 20 3a 20 22 55 53 49 4e 47 22 29 0a 20 20 20 20   : "USING").    
1e280 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65  );.    goto appe
1e290 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20  nd_from_error;. 
1e2a0 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33   }.  p = sqlite3
1e2b0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62  SrcListAppend(db
1e2c0 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61  , p, pTable, pDa
1e2d0 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
1e2e0 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e  ==0 || NEVER(p->
1e2f0 6e 53 72 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nSrc==0) ){.    
1e300 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
1e310 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 49  _error;.  }.  pI
1e320 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
1e330 53 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74  Src-1];.  assert
1e340 28 20 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20  ( pAlias!=0 );. 
1e350 20 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29   if( pAlias->n )
1e360 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c  {.    pItem->zAl
1e370 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ias = sqlite3Nam
1e380 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
1e390 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49  Alias);.  }.  pI
1e3a0 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70  tem->pSelect = p
1e3b0 53 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65  Subquery;.  pIte
1e3c0 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20  m->pOn = pOn;.  
1e3d0 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20  pItem->pUsing = 
1e3e0 70 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e  pUsing;.  return
1e3f0 20 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f   p;.. append_fro
1e400 6d 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72  m_error:.  asser
1e410 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  t( p==0 );.  sql
1e420 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1e430 62 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74  b, pOn);.  sqlit
1e440 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1e450 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71  b, pUsing);.  sq
1e460 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
1e470 65 28 64 62 2c 20 70 53 75 62 71 75 65 72 79 29  e(db, pSubquery)
1e480 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1e490 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e  ./*.** Add an IN
1e4a0 44 45 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20  DEXED BY or NOT 
1e4b0 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 74  INDEXED clause t
1e4c0 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  o the most recen
1e4d0 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c  tly added .** el
1e4e0 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75  ement of the sou
1e4f0 72 63 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20  rce-list passed 
1e500 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
1e510 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  gument..*/.void 
1e520 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e  sqlite3SrcListIn
1e530 64 65 78 65 64 42 79 28 50 61 72 73 65 20 2a 70  dexedBy(Parse *p
1e540 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
1e550 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78  p, Token *pIndex
1e560 65 64 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28  edBy){.  assert(
1e570 20 70 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29   pIndexedBy!=0 )
1e580 3b 0a 20 20 69 66 28 20 70 20 26 26 20 41 4c 57  ;.  if( p && ALW
1e590 41 59 53 28 70 2d 3e 6e 53 72 63 3e 30 29 20 29  AYS(p->nSrc>0) )
1e5a0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
1e5b0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1e5c0 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63   = &p->a[p->nSrc
1e5d0 2d 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1];.    assert(
1e5e0 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78   pItem->notIndex
1e5f0 65 64 3d 3d 30 20 26 26 20 70 49 74 65 6d 2d 3e  ed==0 && pItem->
1e600 7a 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20  zIndex==0 );.   
1e610 20 69 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d   if( pIndexedBy-
1e620 3e 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78  >n==1 && !pIndex
1e630 65 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  edBy->z ){.     
1e640 20 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58   /* A "NOT INDEX
1e650 45 44 22 20 63 6c 61 75 73 65 20 77 61 73 20 73  ED" clause was s
1e660 75 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72  upplied. See par
1e670 73 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63  se.y .      ** c
1e680 6f 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78 65  onstruct "indexe
1e690 64 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69  d_opt" for detai
1e6a0 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74  ls. */.      pIt
1e6b0 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d  em->notIndexed =
1e6c0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
1e6d0 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 49 6e 64       pItem->zInd
1e6e0 65 78 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ex = sqlite3Name
1e6f0 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
1e700 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79  ->db, pIndexedBy
1e710 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
1e720 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64  /*.** When build
1e730 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c  ing up a FROM cl
1e740 61 75 73 65 20 69 6e 20 74 68 65 20 70 61 72 73  ause in the pars
1e750 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  er, the join ope
1e760 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74  rator.** is init
1e770 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74  ially attached t
1e780 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61  o the left opera
1e790 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64  nd.  But the cod
1e7a0 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65  e generator.** e
1e7b0 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20  xpects the join 
1e7c0 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f  operator to be o
1e7d0 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  n the right oper
1e7e0 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  and.  This routi
1e7f0 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c  ne.** Shifts all
1e800 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20   join operators 
1e810 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
1e820 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65  ht for an entire
1e830 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e   FROM.** clause.
1e840 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20  .**.** Example: 
1e850 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e  Suppose the join
1e860 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a   is like this:.*
1e870 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41  *.**           A
1e880 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a   natural cross j
1e890 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oin B.**.** The 
1e8a0 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74  operator is "nat
1e8b0 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22  ural cross join"
1e8c0 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f  .  The A and B o
1e8d0 70 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72  perands are stor
1e8e0 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d  ed.** in p->a[0]
1e8f0 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65   and p->a[1], re
1e900 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65  spectively.  The
1e910 20 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c   parser initiall
1e920 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20  y stores the.** 
1e930 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e  operator with A.
1e940 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
1e950 68 69 66 74 73 20 74 68 61 74 20 6f 70 65 72 61  hifts that opera
1e960 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a  tor over to B..*
1e970 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
1e980 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79  cListShiftJoinTy
1e990 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a  pe(SrcList *p){.
1e9a0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
1e9b0 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74  nt i;.    assert
1e9c0 28 20 70 2d 3e 61 20 7c 7c 20 70 2d 3e 6e 53 72  ( p->a || p->nSr
1e9d0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  c==0 );.    for(
1e9e0 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30  i=p->nSrc-1; i>0
1e9f0 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d  ; i--){.      p-
1ea00 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  >a[i].jointype =
1ea10 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74   p->a[i-1].joint
1ea20 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ype;.    }.    p
1ea30 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20  ->a[0].jointype 
1ea40 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
1ea50 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61  * Begin a transa
1ea60 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
1ea70 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61  lite3BeginTransa
1ea80 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
1ea90 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a  rse, int type){.
1eaa0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1eab0 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
1eac0 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  i;..  assert( pP
1ead0 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20  arse!=0 );.  db 
1eae0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1eaf0 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
1eb00 0a 2f 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  ./*  if( db->aDb
1eb10 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
1eb20 75 72 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71  urn; */.  if( sq
1eb30 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1eb40 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
1eb50 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49  ANSACTION, "BEGI
1eb60 4e 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  N", 0, 0) ){.   
1eb70 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76   return;.  }.  v
1eb80 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1eb90 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1eba0 20 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20   !v ) return;.  
1ebb0 69 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46  if( type!=TK_DEF
1ebc0 45 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72  ERRED ){.    for
1ebd0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
1ebe0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
1ebf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1ec00 2c 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  , OP_Transaction
1ec10 2c 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45  , i, (type==TK_E
1ec20 58 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20  XCLUSIVE)+1);.  
1ec30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
1ec40 73 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a  sesBtree(v, i);.
1ec50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1ec60 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1ec70 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
1ec80 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0, 0);.}../*.** 
1ec90 43 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63  Commit a transac
1eca0 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
1ecb0 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61  ite3CommitTransa
1ecc0 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ction(Parse *pPa
1ecd0 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  rse){.  Vdbe *v;
1ece0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1ecf0 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  se!=0 );.  asser
1ed00 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30  t( pParse->db!=0
1ed10 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
1ed20 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1ed30 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
1ed40 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c  CTION, "COMMIT",
1ed50 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65   0, 0) ){.    re
1ed60 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  turn;.  }.  v = 
1ed70 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1ed80 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
1ed90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1eda0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
1edb0 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29  utoCommit, 1, 0)
1edc0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
1edd0 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61  ollback a transa
1ede0 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ction.*/.void sq
1edf0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61  lite3RollbackTra
1ee00 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a  nsaction(Parse *
1ee10 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20  pParse){.  Vdbe 
1ee20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *v;..  assert( p
1ee30 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73  Parse!=0 );.  as
1ee40 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62  sert( pParse->db
1ee50 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  !=0 );.  if( sql
1ee60 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1ee70 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
1ee80 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42  NSACTION, "ROLLB
1ee90 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20  ACK", 0, 0) ){. 
1eea0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1eeb0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
1eec0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1eed0 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69  f( v ){.    sqli
1eee0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1eef0 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20   OP_AutoCommit, 
1ef00 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  1, 1);.  }.}../*
1ef10 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1ef20 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  n is called by t
1ef30 68 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69  he parser when i
1ef40 74 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61  t parses a comma
1ef50 6e 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a  nd to create,.**
1ef60 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
1ef70 62 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65  back an SQL save
1ef80 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20  point. .*/.void 
1ef90 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74  sqlite3Savepoint
1efa0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1efb0 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70  int op, Token *p
1efc0 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Name){.  char *z
1efd0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1efe0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
1eff0 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  se->db, pName);.
1f000 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
1f010 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
1f020 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1f030 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  se);.#ifndef SQL
1f040 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
1f050 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69  ZATION.    stati
1f060 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63  c const char * c
1f070 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42  onst az[] = { "B
1f080 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22  EGIN", "RELEASE"
1f090 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a  , "ROLLBACK" };.
1f0a0 20 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56      assert( !SAV
1f0b0 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20  EPOINT_BEGIN && 
1f0c0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1f0d0 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e  E==1 && SAVEPOIN
1f0e0 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b  T_ROLLBACK==2 );
1f0f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1f100 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74  !v || sqlite3Aut
1f110 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1f120 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c  QLITE_SAVEPOINT,
1f130 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20   az[op], zName, 
1f140 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
1f150 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
1f160 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
1f170 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1f180 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
1f190 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61  eAddOp4(v, OP_Sa
1f1a0 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20  vepoint, op, 0, 
1f1b0 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e  0, zName, P4_DYN
1f1c0 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  AMIC);.  }.}../*
1f1d0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
1f1e0 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20  e TEMP database 
1f1f0 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69  is open and avai
1f200 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20  lable for use.  
1f210 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  Return.** the nu
1f220 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20  mber of errors. 
1f230 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72   Leave any error
1f240 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65   messages in the
1f250 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72   pParse structur
1f260 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1f270 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73  3OpenTempDatabas
1f280 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
1f290 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
1f2a0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1f2b0 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  if( db->aDb[1].p
1f2c0 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65  Bt==0 && !pParse
1f2d0 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  ->explain ){.   
1f2e0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72   int rc;.    Btr
1f2f0 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61  ee *pBt;.    sta
1f300 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c  tic const int fl
1f310 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20  ags = .         
1f320 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1f330 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20  DWRITE |.       
1f340 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43     SQLITE_OPEN_C
1f350 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20  REATE |.        
1f360 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
1f370 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20  CLUSIVE |.      
1f380 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1f390 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
1f3a0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1f3b0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a  _OPEN_TEMP_DB;..
1f3c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f3d0 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56  BtreeOpen(db->pV
1f3e0 66 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c  fs, 0, db, &pBt,
1f3f0 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20   0, flags);.    
1f400 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f410 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1f420 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1f430 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  e, "unable to op
1f440 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64  en a temporary d
1f450 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20  atabase ".      
1f460 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72    "file for stor
1f470 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ing temporary ta
1f480 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50  bles");.      pP
1f490 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20  arse->rc = rc;. 
1f4a0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1f4b0 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62     }.    db->aDb
1f4c0 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20  [1].pBt = pBt;. 
1f4d0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
1f4e0 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b  Db[1].pSchema );
1f4f0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
1f500 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74  NOMEM==sqlite3Bt
1f510 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  reeSetPageSize(p
1f520 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65  Bt, db->nextPage
1f530 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a  size, -1, 0) ){.
1f540 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
1f550 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
1f560 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1f570 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1f580 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72  ;.}../*.** Recor
1f590 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  d the fact that 
1f5a0 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
1f5b0 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62  e will need to b
1f5c0 65 20 76 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f  e verified.** fo
1f5d0 72 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20  r database iDb. 
1f5e0 20 54 68 65 20 63 6f 64 65 20 74 6f 20 61 63 74   The code to act
1f5f0 75 61 6c 6c 79 20 76 65 72 69 66 79 20 74 68 65  ually verify the
1f600 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a   schema cookie.*
1f610 2a 20 77 69 6c 6c 20 6f 63 63 75 72 20 61 74 20  * will occur at 
1f620 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74  the end of the t
1f630 6f 70 2d 6c 65 76 65 6c 20 56 44 42 45 20 61 6e  op-level VDBE an
1f640 64 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  d will be genera
1f650 74 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79  ted.** later, by
1f660 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
1f670 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  ding()..*/.void 
1f680 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
1f690 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70  ySchema(Parse *p
1f6a0 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
1f6b0 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
1f6c0 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
1f6d0 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
1f6e0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e);.  sqlite3 *d
1f6f0 62 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 64  b = pToplevel->d
1f700 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44  b;..  assert( iD
1f710 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
1f720 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
1f730 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
1f740 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29  t!=0 || iDb==1 )
1f750 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c  ;.  assert( iDb<
1f760 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
1f770 48 45 44 2b 32 20 29 3b 0a 20 20 61 73 73 65 72  HED+2 );.  asser
1f780 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
1f790 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
1f7a0 62 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 44  b, 0) );.  if( D
1f7b0 62 4d 61 73 6b 54 65 73 74 28 70 54 6f 70 6c 65  bMaskTest(pTople
1f7c0 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c  vel->cookieMask,
1f7d0 20 69 44 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20   iDb)==0 ){.    
1f7e0 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65  DbMaskSet(pTople
1f7f0 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c  vel->cookieMask,
1f800 20 69 44 62 29 3b 0a 20 20 20 20 70 54 6f 70 6c   iDb);.    pTopl
1f810 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75  evel->cookieValu
1f820 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62  e[iDb] = db->aDb
1f830 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73  [iDb].pSchema->s
1f840 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20  chema_cookie;.  
1f850 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
1f860 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
1f870 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
1f880 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 54  nTempDatabase(pT
1f890 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a  oplevel);.    }.
1f8a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
1f8b0 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20  argument zDb is 
1f8c0 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20  NULL, then call 
1f8d0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
1f8e0 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61  ySchema() for ea
1f8f0 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20  ch .** attached 
1f900 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77  database. Otherw
1f910 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66  ise, invoke it f
1f920 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
1f930 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a  named zDb only..
1f940 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
1f950 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
1f960 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
1f970 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
1f980 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  zDb){.  sqlite3 
1f990 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1f9a0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
1f9b0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
1f9c0 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
1f9d0 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
1f9e0 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
1f9f0 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30  Bt && (!zDb || 0
1fa00 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
1fa10 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65  (zDb, pDb->zName
1fa20 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  )) ){.      sqli
1fa30 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
1fa40 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ema(pParse, i);.
1fa50 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1fa60 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
1fa70 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
1fa80 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
1fa90 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
1faa0 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
1fab0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
1fac0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1fad0 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
1fae0 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
1faf0 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
1fb00 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
1fb10 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
1fb20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
1fb30 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
1fb40 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
1fb50 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
1fb60 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e   the setStatemen
1fb70 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
1fb80 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
1fb90 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
1fba0 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
1fbb0 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
1fbc0 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
1fbd0 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
1fbe0 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
1fbf0 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
1fc00 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
1fc10 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
1fc20 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
1fc30 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
1fc40 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
1fc50 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
1fc60 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
1fc70 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
1fc80 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
1fc90 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
1fca0 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
1fcb0 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
1fcc0 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
1fcd0 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
1fce0 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
1fcf0 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
1fd00 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
1fd10 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1fd20 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
1fd30 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
1fd40 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
1fd50 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
1fd60 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
1fd70 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
1fd80 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  rse);.  sqlite3C
1fd90 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
1fda0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
1fdb0 44 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65  DbMaskSet(pTople
1fdc0 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c 20  vel->writeMask, 
1fdd0 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  iDb);.  pTopleve
1fde0 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  l->isMultiWrite 
1fdf0 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b  |= setStatement;
1fe00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
1fe10 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
1fe20 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20  ement currently 
1fe30 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1fe40 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a  on might write.*
1fe50 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
1fe60 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20  entry (example: 
1fe70 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77  deleting one row
1fe80 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   then inserting 
1fe90 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65  another,.** inse
1fea0 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72  rting multiple r
1feb0 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20  ows in a table, 
1fec0 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72  or inserting a r
1fed0 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  ow and index ent
1fee0 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20  ries.).** If an 
1fef0 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74  abort occurs aft
1ff00 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65  er some of these
1ff10 20 77 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d   writes have com
1ff20 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20  pleted, then it 
1ff30 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73  will.** be neces
1ff40 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65  sary to undo the
1ff50 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65   completed write
1ff60 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1ff70 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72  e3MultiWrite(Par
1ff80 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50  se *pParse){.  P
1ff90 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
1ffa0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
1ffb0 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
1ffc0 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d    pToplevel->isM
1ffd0 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d  ultiWrite = 1;.}
1ffe0 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64  ../* .** The cod
1fff0 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c  e generator call
20000 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
20010 66 20 69 73 20 64 69 73 63 6f 76 65 72 73 20 74  f is discovers t
20020 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73  hat it is.** pos
20030 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61  sible to abort a
20040 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72   statement prior
20050 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20   to completion. 
20060 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a   In order to .**
20070 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62   perform this ab
20080 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72  ort without corr
20090 75 70 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  upting the datab
200a0 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ase, we need to 
200b0 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61  make.** sure tha
200c0 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
200d0 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  is protected by 
200e0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
200f0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  saction..**.** T
20100 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f  echnically, we o
20110 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20  nly need to set 
20120 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61  the mayAbort fla
20130 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75  g if the.** isMu
20140 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20 77 61  ltiWrite flag wa
20150 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74  s previously set
20160 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 74 69  .  There is a ti
20170 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
20180 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 61   such that the a
20190 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20  bort must occur 
201a0 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77  after the multiw
201b0 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  rite.  This make
201c0 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d  s.** some statem
201d0 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74  ents involving t
201e0 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c  he REPLACE confl
201f0 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
20200 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61  lgorithm.** go a
20210 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20   little faster. 
20220 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61   But taking adva
20230 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 74 69  ntage of this ti
20240 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
20250 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64   makes it more d
20260 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76  ifficult to prov
20270 65 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  e that the code 
20280 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a  is correct (in .
20290 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69  ** particular, i
202a0 74 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  t prevents us fr
202b0 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66  om writing an ef
202c0 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65  fective.** imple
202d0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c  mentation of sql
202e0 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
202f0 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20  rt()) and so we 
20300 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74  have chosen.** t
20310 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66 65 20  o take the safe 
20320 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74  route and skip t
20330 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  he optimization.
20340 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20350 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a  MayAbort(Parse *
20360 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65  pParse){.  Parse
20370 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
20380 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
20390 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  el(pParse);.  pT
203a0 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72  oplevel->mayAbor
203b0 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
203c0 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
203d0 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65 20  that causes the 
203e0 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61  vdbe to return a
203f0 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
20400 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68  INT.** error. Th
20410 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65  e onError parame
20420 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ter determines w
20430 68 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66  hich (if any) of
20440 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
20450 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74  * and/or current
20460 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
20470 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
20480 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74  void sqlite3Halt
20490 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
204a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
204b0 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
204c0 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  xt */.  int errC
204d0 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78 74  ode,      /* ext
204e0 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65  ended error code
204f0 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
20500 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74  r,      /* Const
20510 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20  raint type */.  
20520 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20 20  char *p4,       
20530 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61    /* Error messa
20540 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79 70  ge */.  i8 p4typ
20550 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34 5f  e,        /* P4_
20560 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52 41  STATIC or P4_TRA
20570 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70  NSIENT */.  u8 p
20580 35 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f 2a  5Errmsg       /*
20590 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65 20   P5_ErrMsg type 
205a0 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
205b0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
205c0 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
205d0 72 74 28 20 28 65 72 72 43 6f 64 65 26 30 78 66  rt( (errCode&0xf
205e0 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
205f0 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f  RAINT );.  if( o
20600 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74  nError==OE_Abort
20610 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d   ){.    sqlite3M
20620 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
20630 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
20640 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48  beAddOp4(v, OP_H
20650 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e  alt, errCode, on
20660 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34  Error, 0, p4, p4
20670 74 79 70 65 29 3b 0a 20 20 69 66 28 20 70 35 45  type);.  if( p5E
20680 72 72 6d 73 67 20 29 20 73 71 6c 69 74 65 33 56  rrmsg ) sqlite3V
20690 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
206a0 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a  5Errmsg);.}../*.
206b0 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61  ** Code an OP_Ha
206c0 6c 74 20 64 75 65 20 74 6f 20 55 4e 49 51 55 45  lt due to UNIQUE
206d0 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20   or PRIMARY KEY 
206e0 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
206f0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
20700 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74  lite3UniqueConst
20710 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
20720 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
20730 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
20740 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
20750 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69       /* Constrai
20760 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e 64  nt type */.  Ind
20770 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 2f  ex *pIdx       /
20780 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74  * The index that
20790 20 74 72 69 67 67 65 72 73 20 74 68 65 20 63 6f   triggers the co
207a0 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20  nstraint */.){. 
207b0 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 69   char *zErr;.  i
207c0 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d  nt j;.  StrAccum
207d0 20 65 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c 65   errMsg;.  Table
207e0 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70   *pTab = pIdx->p
207f0 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74 65  Table;..  sqlite
20800 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 65  3StrAccumInit(&e
20810 72 72 4d 73 67 2c 20 30 2c 20 30 2c 20 32 30 30  rrMsg, 0, 0, 200
20820 29 3b 0a 20 20 65 72 72 4d 73 67 2e 64 62 20 3d  );.  errMsg.db =
20830 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66   pParse->db;.  f
20840 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
20850 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nKeyCol; j++){. 
20860 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20     char *zCol = 
20870 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d  pTab->aCol[pIdx-
20880 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  >aiColumn[j]].zN
20890 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 6a 20 29  ame;.    if( j )
208a0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
208b0 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20  Append(&errMsg, 
208c0 22 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20 73 71  ", ", 2);.    sq
208d0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
208e0 65 6e 64 41 6c 6c 28 26 65 72 72 4d 73 67 2c 20  endAll(&errMsg, 
208f0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
20900 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
20910 6d 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c  mAppend(&errMsg,
20920 20 22 2e 22 2c 20 31 29 3b 0a 20 20 20 20 73 71   ".", 1);.    sq
20930 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
20940 65 6e 64 41 6c 6c 28 26 65 72 72 4d 73 67 2c 20  endAll(&errMsg, 
20950 7a 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 7a 45 72  zCol);.  }.  zEr
20960 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63  r = sqlite3StrAc
20970 63 75 6d 46 69 6e 69 73 68 28 26 65 72 72 4d 73  cumFinish(&errMs
20980 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 6c  g);.  sqlite3Hal
20990 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
209a0 73 65 2c 20 0a 20 20 20 20 49 73 50 72 69 6d 61  se, .    IsPrima
209b0 72 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29  ryKeyIndex(pIdx)
209c0 20 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   ? SQLITE_CONSTR
209d0 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 20  AINT_PRIMARYKEY 
209e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
209f0 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 53               : S
20a00 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
20a10 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45  _UNIQUE,.    onE
20a20 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44  rror, zErr, P4_D
20a30 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74  YNAMIC, P5_Const
20a40 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a  raintUnique);.}.
20a50 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
20a60 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 6e  OP_Halt due to n
20a70 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 2e  on-unique rowid.
20a80 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
20a90 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28  RowidConstraint(
20aa0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
20ab0 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
20ac0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
20ad0 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
20ae0 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
20af0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20  ution algorithm 
20b00 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
20b10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
20b20 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f 6e  ble with the non
20b30 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a 2f  -unique rowid */
20b40 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73   .){.  char *zMs
20b50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  g;.  int rc;.  i
20b60 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d  f( pTab->iPKey>=
20b70 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20  0 ){.    zMsg = 
20b80 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
20b90 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25  Parse->db, "%s.%
20ba0 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  s", pTab->zName,
20bb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20bc0 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
20bd0 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65  >aCol[pTab->iPKe
20be0 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  y].zName);.    r
20bf0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
20c00 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59  RAINT_PRIMARYKEY
20c10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
20c20 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
20c30 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c  intf(pParse->db,
20c40 20 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54 61   "%s.rowid", pTa
20c50 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  b->zName);.    r
20c60 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
20c70 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d  RAINT_ROWID;.  }
20c80 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f  .  sqlite3HaltCo
20c90 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
20ca0 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d   rc, onError, zM
20cb0 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a  sg, P4_DYNAMIC,.
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cd0 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74          P5_Const
20ce0 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a  raintUnique);.}.
20cf0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
20d00 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73  see if pIndex us
20d10 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  es the collating
20d20 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
20d30 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
20d40 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20   if it does and 
20d50 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73  false if it does
20d60 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   not..*/.#ifndef
20d70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
20d80 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20  NDEX.static int 
20d90 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63  collationMatch(c
20da0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
20db0 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29  , Index *pIndex)
20dc0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
20dd0 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b  ert( zColl!=0 );
20de0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
20df0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  ndex->nColumn; i
20e00 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
20e10 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d  har *z = pIndex-
20e20 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
20e30 61 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20  assert( z!=0 || 
20e40 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
20e50 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66 28  [i]<0 );.    if(
20e60 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
20e70 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71  n[i]>=0 && 0==sq
20e80 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
20e90 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
20ea0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
20eb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
20ec0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
20ed0 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e  Recompute all in
20ee0 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68  dices of pTab th
20ef0 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61  at use the colla
20f00 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
20f10 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c  oll..** If pColl
20f20 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
20f30 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
20f40 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64  f pTab..*/.#ifnd
20f50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
20f60 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f  EINDEX.static vo
20f70 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28  id reindexTable(
20f80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
20f90 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72  able *pTab, char
20fa0 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
20fb0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
20fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20fd0 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
20fe0 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
20ff0 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d  /..  for(pIndex=
21000 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
21010 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e  ndex; pIndex=pIn
21020 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  dex->pNext){.   
21030 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c   if( zColl==0 ||
21040 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
21050 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29  zColl, pIndex) )
21060 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20  {.      int iDb 
21070 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
21080 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
21090 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
210a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
210b0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
210c0 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
210d0 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
210e0 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
210f0 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31  arse, pIndex, -1
21100 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
21110 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
21120 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
21130 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  es of all tables
21140 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
21150 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69  s where the.** i
21160 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63  ndices use the c
21170 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
21180 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f  e pColl.  If pCo
21190 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d  ll==0 then recom
211a0 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69  pute.** all indi
211b0 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a  ces everywhere..
211c0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
211d0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
211e0 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64  tatic void reind
211f0 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73  exDatabases(Pars
21200 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20  e *pParse, char 
21210 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
21220 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20   Db *pDb;       
21230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21240 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  A single databas
21250 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  e */.  int iDb; 
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21270 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
21280 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
21290 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
212a0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
212b0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
212c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
212d0 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20   HashElem *k;   
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
212f0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
21300 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a   tables in pDb *
21310 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21330 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
21340 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20  e database */.. 
21350 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
21360 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
21370 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a 20  exes(db) );  /* 
21380 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68 65 6d  Needed for schem
21390 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f  a access */.  fo
213a0 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d  r(iDb=0, pDb=db-
213b0 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  >aDb; iDb<db->nD
213c0 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29  b; iDb++, pDb++)
213d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44  {.    assert( pD
213e0 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  b!=0 );.    for(
213f0 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  k=sqliteHashFirs
21400 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
21410 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b  >tblHash);  k; k
21420 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
21430 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  k)){.      pTab 
21440 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65  = (Table*)sqlite
21450 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20  HashData(k);.   
21460 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
21470 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43  pParse, pTab, zC
21480 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oll);.    }.  }.
21490 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
214a0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
214b0 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f  r the REINDEX co
214c0 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  mmand..**.**    
214d0 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20      REINDEX     
214e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214f0 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20         -- 1.**  
21500 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c        REINDEX  <
21510 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20  collation>      
21520 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a           -- 2.**
21530 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
21540 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74   ?<database>.?<t
21550 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a  ablename>  -- 3.
21560 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
21570 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
21580 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20  <indexname>  -- 
21590 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63  4.**.** Form 1 c
215a0 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65  auses all indice
215b0 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  s in all attache
215c0 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62  d databases to b
215d0 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f  e rebuilt..** Fo
215e0 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c  rm 2 rebuilds al
215f0 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
21600 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
21610 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a  use the named.**
21620 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
21630 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e  ion.  Forms 3 an
21640 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20  d 4 rebuild the 
21650 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61  named index or a
21660 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73  ll.** indices as
21670 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
21680 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a  e named table..*
21690 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
216a0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f  _OMIT_REINDEX.vo
216b0 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65  id sqlite3Reinde
216c0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
216d0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
216e0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a  Token *pName2){.
216f0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
21700 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
21710 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
21720 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65  nce to be reinde
21730 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  xed, or NULL */.
21740 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
21750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21760 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   Name of a table
21770 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63   or index */.  c
21780 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20  onst char *zDb; 
21790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
217a0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
217b0 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  se */.  Table *p
217c0 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
217d0 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
217e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
217f0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
21800 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
21810 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
21820 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
21830 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
21840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21850 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
21860 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
21870 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
21880 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
21890 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
218a0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
218b0 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b  Token *pObjName;
218c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
218d0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
218e0 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20   or index to be 
218f0 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20  reindexed */..  
21900 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
21910 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
21920 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
21930 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
21940 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
21950 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
21960 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
21970 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
21980 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
21990 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
219a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
219b0 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d  }..  if( pName1=
219c0 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  =0 ){.    reinde
219d0 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
219e0 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  e, 0);.    retur
219f0 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e  n;.  }else if( N
21a00 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20  EVER(pName2==0) 
21a10 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20  || pName2->z==0 
21a20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  ){.    char *zCo
21a30 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ll;.    assert( 
21a40 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20  pName1->z );.   
21a50 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
21a60 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
21a70 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31  arse->db, pName1
21a80 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c  );.    if( !zCol
21a90 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  l ) return;.    
21aa0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
21ab0 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
21ac0 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30  NC(db), zColl, 0
21ad0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  );.    if( pColl
21ae0 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65   ){.      reinde
21af0 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
21b00 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, zColl);.     
21b10 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
21b20 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  b, zColl);.     
21b30 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
21b40 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
21b50 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
21b60 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
21b70 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
21b80 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
21b90 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a  e2, &pObjName);.
21ba0 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
21bb0 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  turn;.  z = sqli
21bc0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
21bd0 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a  (db, pObjName);.
21be0 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
21bf0 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d  urn;.  zDb = db-
21c00 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
21c10 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
21c20 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
21c30 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54  , zDb);.  if( pT
21c40 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  ab ){.    reinde
21c50 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
21c60 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Tab, 0);.    sql
21c70 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
21c80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
21c90 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
21ca0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
21cb0 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71  b, z, zDb);.  sq
21cc0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
21cd0 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  z);.  if( pIndex
21ce0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
21cf0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
21d00 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
21d10 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  b);.    sqlite3R
21d20 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
21d30 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
21d40 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
21d50 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
21d60 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
21d70 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  e to identify th
21d80 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72  e object to be r
21d90 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65  eindexed");.}.#e
21da0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
21db0 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72  rn a KeyInfo str
21dc0 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20 61  ucture that is a
21dd0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
21de0 68 65 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a  he given Index..
21df0 2a 2a 0a 2a 2a 20 54 68 65 20 4b 65 79 49 6e 66  **.** The KeyInf
21e00 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  o structure for 
21e10 61 6e 20 69 6e 64 65 78 20 69 73 20 63 61 63 68  an index is cach
21e20 65 64 20 69 6e 20 74 68 65 20 49 6e 64 65 78 20  ed in the Index 
21e30 6f 62 6a 65 63 74 2e 0a 2a 2a 20 53 6f 20 74 68  object..** So th
21e40 65 72 65 20 6d 69 67 68 74 20 62 65 20 6d 75 6c  ere might be mul
21e50 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  tiple references
21e60 20 74 6f 20 74 68 65 20 72 65 74 75 72 6e 65 64   to the returned
21e70 20 70 6f 69 6e 74 65 72 2e 20 20 54 68 65 0a 2a   pointer.  The.*
21e80 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  * caller should 
21e90 6e 6f 74 20 74 72 79 20 74 6f 20 6d 6f 64 69 66  not try to modif
21ea0 79 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62  y the KeyInfo ob
21eb0 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
21ec0 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e  caller should in
21ed0 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b 65 79 49  voke sqlite3KeyI
21ee0 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e 20 74 68  nfoUnref() on th
21ef0 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63  e returned objec
21f00 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73  t.** when it has
21f10 20 66 69 6e 69 73 68 65 64 20 75 73 69 6e 67 20   finished using 
21f20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a  it..*/.KeyInfo *
21f30 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
21f40 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
21f50 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  rse, Index *pIdx
21f60 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
21f70 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30  >nErr ) return 0
21f80 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
21f90 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
21fa0 48 45 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70  HE.  if( pIdx->p
21fb0 4b 65 79 49 6e 66 6f 20 26 26 20 70 49 64 78 2d  KeyInfo && pIdx-
21fc0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 21 3d 70  >pKeyInfo->db!=p
21fd0 50 61 72 73 65 2d 3e 64 62 20 29 7b 0a 20 20 20  Parse->db ){.   
21fe0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
21ff0 6e 72 65 66 28 70 49 64 78 2d 3e 70 4b 65 79 49  nref(pIdx->pKeyI
22000 6e 66 6f 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e  nfo);.    pIdx->
22010 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20  pKeyInfo = 0;.  
22020 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
22030 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Idx->pKeyInfo==0
22040 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
22050 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49     int nCol = pI
22060 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  dx->nColumn;.   
22070 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78   int nKey = pIdx
22080 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 4b  ->nKeyCol;.    K
22090 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20  eyInfo *pKey;.  
220a0 20 20 69 66 28 20 70 49 64 78 2d 3e 75 6e 69 71    if( pIdx->uniq
220b0 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  NotNull ){.     
220c0 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b   pKey = sqlite3K
220d0 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72  eyInfoAlloc(pPar
220e0 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43  se->db, nKey, nC
220f0 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 20 20 7d 65  ol-nKey);.    }e
22100 6c 73 65 7b 0a 20 20 20 20 20 20 70 4b 65 79 20  lse{.      pKey 
22110 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
22120 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
22130 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20  , nCol, 0);.    
22140 7d 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29  }.    if( pKey )
22150 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
22160 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
22170 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20  Writeable(pKey) 
22180 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
22190 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
221a0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43          char *zC
221b0 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
221c0 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 61  ll[i];.        a
221d0 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20  ssert( zColl!=0 
221e0 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 2d  );.        pKey-
221f0 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 74 72 63  >aColl[i] = strc
22200 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52 59  mp(zColl,"BINARY
22210 22 29 3d 3d 30 20 3f 20 30 20 3a 0a 20 20 20 20  ")==0 ? 0 :.    
22220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22230 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63        sqlite3Loc
22240 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
22250 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, zColl);.     
22260 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72     pKey->aSortOr
22270 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61  der[i] = pIdx->a
22280 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
22290 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
222a0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
222b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b          sqlite3K
222c0 65 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79  eyInfoUnref(pKey
222d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
222e0 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 70 4b          pIdx->pK
222f0 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 3b 0a 20  eyInfo = pKey;. 
22300 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
22310 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
22320 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 49 64 78  3KeyInfoRef(pIdx
22330 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 7d 0a 0a  ->pKeyInfo);.}..
22340 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22350 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54  MIT_CTE./* .** T
22360 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
22370 6e 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65 72 20  nvoked once per 
22380 43 54 45 20 62 79 20 74 68 65 20 70 61 72 73 65  CTE by the parse
22390 72 20 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20  r while parsing 
223a0 61 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73  a .** WITH claus
223b0 65 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c  e. .*/.With *sql
223c0 69 74 65 33 57 69 74 68 41 64 64 28 0a 20 20 50  ite3WithAdd(.  P
223d0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
223e0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
223f0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
22400 69 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20  ith *pWith,     
22410 20 20 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69         /* Existi
22420 6e 67 20 57 49 54 48 20 63 6c 61 75 73 65 2c 20  ng WITH clause, 
22430 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b  or NULL */.  Tok
22440 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20  en *pName,      
22450 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
22460 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65  the common-table
22470 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
22480 70 41 72 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a  pArglist,     /*
22490 20 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e   Optional column
224a0 20 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72 20 74   name list for t
224b0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65  he table */.  Se
224c0 6c 65 63 74 20 2a 70 51 75 65 72 79 20 20 20 20  lect *pQuery    
224d0 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 75        /* Query u
224e0 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  sed to initializ
224f0 65 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29  e the table */.)
22500 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
22510 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
22520 57 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68  With *pNew;.  ch
22530 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a  ar *zName;..  /*
22540 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
22550 43 54 45 20 6e 61 6d 65 20 69 73 20 75 6e 69 71  CTE name is uniq
22560 75 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 57  ue within this W
22570 49 54 48 20 63 6c 61 75 73 65 2e 20 49 66 0a 20  ITH clause. If. 
22580 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61   ** not, store a
22590 6e 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50  n error in the P
225a0 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 20  arse structure. 
225b0 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  */.  zName = sql
225c0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
225d0 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  n(pParse->db, pN
225e0 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
225f0 65 20 26 26 20 70 57 69 74 68 20 29 7b 0a 20 20  e && pWith ){.  
22600 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
22610 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e  (i=0; i<pWith->n
22620 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
22630 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
22640 43 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68  Cmp(zName, pWith
22650 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
22660 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
22670 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
22680 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 57  se, "duplicate W
22690 49 54 48 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20  ITH table name: 
226a0 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
226b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
226c0 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20    if( pWith ){. 
226d0 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
226e0 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 20 2b 20  izeof(*pWith) + 
226f0 28 73 69 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61  (sizeof(pWith->a
22700 5b 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43  [1]) * pWith->nC
22710 74 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  te);.    pNew = 
22720 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
22730 28 64 62 2c 20 70 57 69 74 68 2c 20 6e 42 79 74  (db, pWith, nByt
22740 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
22750 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
22760 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
22770 73 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 29 3b  sizeof(*pWith));
22780 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a  .  }.  assert( z
22790 4e 61 6d 65 21 3d 30 20 7c 7c 20 70 4e 65 77 3d  Name!=0 || pNew=
227a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
227b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
227c0 3d 3d 30 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29  ==0 || pNew==0 )
227d0 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  ;..  if( pNew==0
227e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
227f0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
22800 2c 20 70 41 72 67 6c 69 73 74 29 3b 0a 20 20 20  , pArglist);.   
22810 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
22820 6c 65 74 65 28 64 62 2c 20 70 51 75 65 72 79 29  lete(db, pQuery)
22830 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
22840 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
22850 20 20 20 20 70 4e 65 77 20 3d 20 70 57 69 74 68      pNew = pWith
22860 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
22870 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74  New->a[pNew->nCt
22880 65 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 51 75  e].pSelect = pQu
22890 65 72 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ery;.    pNew->a
228a0 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 43 6f  [pNew->nCte].pCo
228b0 6c 73 20 3d 20 70 41 72 67 6c 69 73 74 3b 0a 20  ls = pArglist;. 
228c0 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
228d0 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d 20 7a  >nCte].zName = z
228e0 4e 61 6d 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  Name;.    pNew->
228f0 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 45  a[pNew->nCte].zE
22900 72 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77  rr = 0;.    pNew
22910 2d 3e 6e 43 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20  ->nCte++;.  }.. 
22920 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
22930 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
22940 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
22950 57 69 74 68 20 6f 62 6a 65 63 74 20 70 61 73 73  With object pass
22960 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
22970 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f   argument..*/.vo
22980 69 64 20 73 71 6c 69 74 65 33 57 69 74 68 44 65  id sqlite3WithDe
22990 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
229a0 2c 20 57 69 74 68 20 2a 70 57 69 74 68 29 7b 0a  , With *pWith){.
229b0 20 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20    if( pWith ){. 
229c0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
229d0 72 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e  r(i=0; i<pWith->
229e0 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCte; i++){.    
229f0 20 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43    struct Cte *pC
22a00 74 65 20 3d 20 26 70 57 69 74 68 2d 3e 61 5b 69  te = &pWith->a[i
22a10 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
22a20 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
22a30 62 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 29 3b  b, pCte->pCols);
22a40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
22a50 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
22a60 43 74 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  Cte->pSelect);. 
22a70 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
22a80 65 65 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61  ee(db, pCte->zNa
22a90 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  me);.    }.    s
22aa0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22ab0 20 70 57 69 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23   pWith);.  }.}.#
22ac0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
22ad0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  d(SQLITE_OMIT_CT
22ae0 45 29 20 2a 2f 0a                                E) */.