/ Hex Artifact Content
Login

Artifact 5bfeea8f302ec2926c9eea321a61daea92a29fa4:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0d90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0da0: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0db0: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0dc0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0dd0: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0de0: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0df0: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0e00: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e10: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e20: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0e30: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0e40: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0e50: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0e60: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0e70: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0e80: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0e90: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0ea0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0eb0: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0ec0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0ed0: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0ee0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0ef0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0f00: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0f10: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f20: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0f30: 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *v;..  assert( 
0f40: 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
0f50: 6c 3d 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  l==0 );.  db = p
0f60: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0f70: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0f80: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
0f90: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
0fa0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0fb0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
0fc0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65  return;..  /* Be
0fd0: 67 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e  gin by generatin
0fe0: 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69  g some terminati
0ff0: 6f 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65  on code at the e
1000: 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76  nd of the.  ** v
1010: 64 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f  dbe program.  */
1020: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1030: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1040: 20 61 73 73 65 72 74 28 20 21 70 50 61 72 73 65   assert( !pParse
1050: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a  ->isMultiWrite .
1060: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
1070: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
1080: 6f 72 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d  ort(v, pParse->m
1090: 61 79 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28  ayAbort));.  if(
10a0: 20 76 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28   v ){.    while(
10b0: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
10c0: 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 76 2c  tePriorOpcode(v,
10d0: 20 4f 50 5f 43 6c 6f 73 65 29 20 29 7b 7d 0a 20   OP_Close) ){}. 
10e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10f0: 64 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29  dOp0(v, OP_Halt)
1100: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
1110: 6f 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69  okie mask contai
1120: 6e 73 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 65  ns one bit for e
1130: 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
1140: 65 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28  e open..    ** (
1150: 42 69 74 20 30 20 69 73 20 66 6f 72 20 6d 61 69  Bit 0 is for mai
1160: 6e 2c 20 62 69 74 20 31 20 69 73 20 66 6f 72 20  n, bit 1 is for 
1170: 74 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72  temp, and so for
1180: 74 68 2e 29 20 20 42 69 74 73 20 61 72 65 0a 20  th.)  Bits are. 
1190: 20 20 20 2a 2a 20 73 65 74 20 66 6f 72 20 65 61     ** set for ea
11a0: 63 68 20 64 61 74 61 62 61 73 65 20 74 68 61 74  ch database that
11b0: 20 69 73 20 75 73 65 64 2e 20 20 47 65 6e 65 72   is used.  Gener
11c0: 61 74 65 20 63 6f 64 65 20 74 6f 20 73 74 61 72  ate code to star
11d0: 74 20 61 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  t a.    ** trans
11e0: 61 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75  action on each u
11f0: 73 65 64 20 64 61 74 61 62 61 73 65 20 61 6e 64  sed database and
1200: 20 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 73   to verify the s
1210: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20  chema cookie.   
1220: 20 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73 65 64   ** on each used
1230: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a   database..    *
1240: 2f 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  /.    if( db->ma
1250: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26  llocFailed==0 &&
1260: 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65   (pParse->cookie
1270: 4d 61 73 6b 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Mask || pParse->
1280: 70 43 6f 6e 73 74 45 78 70 72 29 20 29 7b 0a 20  pConstExpr) ){. 
1290: 20 20 20 20 20 79 44 62 4d 61 73 6b 20 6d 61 73       yDbMask mas
12a0: 6b 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  k;.      int iDb
12b0: 2c 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72  , i;.      asser
12c0: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  t( sqlite3VdbeGe
12d0: 74 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64  tOp(v, 0)->opcod
12e0: 65 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20  e==OP_Init );.  
12f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a      sqlite3VdbeJ
1300: 75 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20  umpHere(v, 0);. 
1310: 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30 2c 20       for(iDb=0, 
1320: 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e  mask=1; iDb<db->
1330: 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69  nDb; mask<<=1, i
1340: 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Db++){.        i
1350: 66 28 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73  f( (mask & pPars
1360: 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d  e->cookieMask)==
1370: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1380: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1390: 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
13a0: 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  b);.        sqli
13b0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74  te3VdbeAddOp4Int
13c0: 28 76 2c 0a 20 20 20 20 20 20 20 20 20 20 4f 50  (v,.          OP
13d0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20  _Transaction,   
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20   /* Opcode */.  
1400: 20 20 20 20 20 20 20 20 69 44 62 2c 20 20 20 20          iDb,    
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31             /* P1
1430: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 28 6d   */.          (m
1440: 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 77 72  ask & pParse->wr
1450: 69 74 65 4d 61 73 6b 29 21 3d 30 2c 20 20 20 20  iteMask)!=0,    
1460: 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 20 20   /* P2 */.      
1470: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
1480: 69 65 56 61 6c 75 65 5b 69 44 62 5d 2c 20 20 20  ieValue[iDb],   
1490: 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a         /* P3 */.
14a0: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44            db->aD
14b0: 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[iDb].pSchema->
14c0: 69 47 65 6e 65 72 61 74 69 6f 6e 20 20 2f 2a 20  iGeneration  /* 
14d0: 50 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 3b  P4 */.        );
14e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
14f0: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 20  >init.busy==0 ) 
1500: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1510: 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20  eP5(v, 1);.     
1520: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1530: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1540: 42 4c 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  BLE.      for(i=
1550: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74  0; i<pParse->nVt
1560: 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20  abLock; i++){.  
1570: 20 20 20 20 20 20 63 68 61 72 20 2a 76 74 61 62        char *vtab
1580: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
1590: 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
15a0: 70 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f  pParse->apVtabLo
15b0: 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ck[i]);.        
15c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
15d0: 34 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20  4(v, OP_VBegin, 
15e0: 30 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50  0, 0, 0, vtab, P
15f0: 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d  4_VTAB);.      }
1600: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
1610: 56 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65  VtabLock = 0;.#e
1620: 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f  ndif..      /* O
1630: 6e 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b  nce all the cook
1640: 69 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65  ies have been ve
1650: 72 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73  rified and trans
1660: 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20  actions opened, 
1670: 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e  .      ** obtain
1680: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
1690: 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20  ble-locks. This 
16a0: 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73  is a no-op unles
16b0: 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  s the .      ** 
16c0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61  shared-cache fea
16d0: 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  ture is enabled.
16e0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16f0: 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  codeTableLocks(p
1700: 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f  Parse);..      /
1710: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79  * Initialize any
1720: 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64   AUTOINCREMENT d
1730: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 72  ata structures r
1740: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a  equired..      *
1750: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41  /.      sqlite3A
1760: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69  utoincrementBegi
1770: 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  n(pParse);..    
1780: 20 20 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61    /* Code consta
1790: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  nt expressions t
17a0: 68 61 74 20 77 68 65 72 65 20 66 61 63 74 6f 72  hat where factor
17b0: 65 64 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20  ed out of inner 
17c0: 6c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69  loops */.      i
17d0: 66 28 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73  f( pParse->pCons
17e0: 74 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  tExpr ){.       
17f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d   ExprList *pEL =
1800: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1810: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61  xpr;.        pPa
1820: 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74  rse->okConstFact
1830: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  or = 0;.        
1840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e  for(i=0; i<pEL->
1850: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1860: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1870: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1880: 45 4c 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  EL->a[i].pExpr, 
1890: 70 45 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e  pEL->a[i].u.iCon
18a0: 73 74 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20  stExprReg);.    
18b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
18c0: 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c       /* Finally,
18d0: 20 6a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68   jump back to th
18e0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
18f0: 68 65 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f  he executable co
1900: 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  de. */.      sql
1910: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1920: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 31 29  , OP_Goto, 0, 1)
1930: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20  ;.    }.  }...  
1940: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20  /* Get the VDBE 
1950: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f  program ready fo
1960: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f  r execution.  */
1970: 0a 20 20 69 66 28 20 76 20 26 26 20 41 4c 57 41  .  if( v && ALWA
1980: 59 53 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  YS(pParse->nErr=
1990: 3d 30 29 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c  =0) && !db->mall
19a0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
19b0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
19c0: 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 30 20 29  iCacheLevel==0 )
19d0: 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 73 20 61  ;  /* Disables a
19e0: 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73 20 6d 61  nd re-enables ma
19f0: 74 63 68 20 2a 2f 0a 20 20 20 20 2f 2a 20 41 20  tch */.    /* A 
1a00: 6d 69 6e 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63  minimum of one c
1a10: 75 72 73 6f 72 20 69 73 20 72 65 71 75 69 72 65  ursor is require
1a20: 64 20 69 66 20 61 75 74 6f 69 6e 63 72 65 6d 65  d if autoincreme
1a30: 6e 74 20 69 73 20 75 73 65 64 0a 20 20 20 20 2a  nt is used.    *
1a40: 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 61 36    See ticket [a6
1a50: 39 36 33 37 39 63 31 66 30 38 38 36 36 5d 20 2a  96379c1f08866] *
1a60: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  /.    if( pParse
1a70: 2d 3e 70 41 69 6e 63 21 3d 30 20 26 26 20 70 50  ->pAinc!=0 && pP
1a80: 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 30 20 29 20  arse->nTab==0 ) 
1a90: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 31  pParse->nTab = 1
1aa0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1ab0: 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50  eMakeReady(v, pP
1ac0: 61 72 73 65 29 3b 0a 20 20 20 20 70 50 61 72 73  arse);.    pPars
1ad0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44  e->rc = SQLITE_D
1ae0: 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ONE;.    pParse-
1af0: 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30  >colNamesSet = 0
1b00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1b10: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49  Parse->rc = SQLI
1b20: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
1b30: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30  pParse->nTab = 0
1b40: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
1b50: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1b60: 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72  nSet = 0;.  pPar
1b70: 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20  se->nVar = 0;.  
1b80: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61  pParse->cookieMa
1b90: 73 6b 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sk = 0;.}../*.**
1ba0: 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20   Run the parser 
1bb0: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
1bc0: 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69  or recursively i
1bd0: 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72  n order to gener
1be0: 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20  ate.** code for 
1bf0: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
1c00: 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65  t given onto the
1c10: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72   end of the pPar
1c20: 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75  se context.** cu
1c30: 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
1c40: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65  nstruction.  Whe
1c50: 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20  n the parser is 
1c60: 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a  run recursively.
1c70: 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65  ** this way, the
1c80: 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69   final OP_Halt i
1c90: 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61  s not appended a
1ca0: 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c  nd other initial
1cb0: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66  ization.** and f
1cc0: 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70  inalization step
1cd0: 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65  s are omitted be
1ce0: 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20  cause those are 
1cf0: 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a  handling by the.
1d00: 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72  ** outermost par
1d10: 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65  ser..**.** Not e
1d20: 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73  verything is nes
1d30: 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63  table.  This fac
1d40: 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65  ility is designe
1d50: 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49  d to permit.** I
1d60: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61  NSERT, UPDATE, a
1d70: 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74  nd DELETE operat
1d80: 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c  ions against SQL
1d90: 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65  ITE_MASTER.  Use
1da0: 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20  .** care if you 
1db0: 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f  decide to try to
1dc0: 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e   use this routin
1dd0: 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  e for some other
1de0: 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f   purposes..*/.vo
1df0: 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  id sqlite3Nested
1e00: 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61  Parse(Parse *pPa
1e10: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
1e20: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
1e30: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
1e40: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68  char *zSql;.  ch
1e50: 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
1e60: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1e70: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64   pParse->db;.# d
1e80: 65 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28  efine SAVE_SZ  (
1e90: 73 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20  sizeof(Parse) - 
1ea0: 6f 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e  offsetof(Parse,n
1eb0: 56 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76  Var)).  char sav
1ec0: 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a  eBuf[SAVE_SZ];..
1ed0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1ee0: 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  rr ) return;.  a
1ef0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1f00: 65 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20  ested<10 );  /* 
1f10: 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f  Nesting should o
1f20: 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65  nly be of limite
1f30: 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f  d depth */.  va_
1f40: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
1f50: 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  t);.  zSql = sql
1f60: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c  ite3VMPrintf(db,
1f70: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
1f80: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69   va_end(ap);.  i
1f90: 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
1fa0: 20 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41    return;   /* A
1fb0: 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   malloc must hav
1fc0: 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a  e failed */.  }.
1fd0: 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64    pParse->nested
1fe0: 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76  ++;.  memcpy(sav
1ff0: 65 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e  eBuf, &pParse->n
2000: 56 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20  Var, SAVE_SZ);. 
2010: 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d   memset(&pParse-
2020: 3e 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53  >nVar, 0, SAVE_S
2030: 5a 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e  Z);.  sqlite3Run
2040: 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a  Parser(pParse, z
2050: 53 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  Sql, &zErrMsg);.
2060: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2070: 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
2080: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
2090: 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70  , zSql);.  memcp
20a0: 79 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  y(&pParse->nVar,
20b0: 20 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53   saveBuf, SAVE_S
20c0: 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65  Z);.  pParse->ne
20d0: 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sted--;.}../*.**
20e0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d   Locate the in-m
20f0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20  emory structure 
2100: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61  that describes a
2110: 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
2120: 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69  base.** table gi
2130: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2140: 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28  that table and (
2150: 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20  optionally) the 
2160: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  name of the.** d
2170: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2180: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  ng the table.  R
2190: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
21a0: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49  t found..**.** I
21b0: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30  f zDatabase is 0
21c0: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  , all databases 
21d0: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72  are searched for
21e0: 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 74   the table and t
21f0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74 63  he.** first matc
2200: 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72 65  hing table is re
2210: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65  turned.  (No che
2220: 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69 63  cking for duplic
2230: 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d  ate table.** nam
2240: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68  es is done.)  Th
2250: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69  e search order i
2260: 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68  s TEMP first, th
2270: 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e  en MAIN, then an
2280: 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20 64  y.** auxiliary d
2290: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 20 75  atabases added u
22a0: 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20  sing the ATTACH 
22b0: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53  command..**.** S
22c0: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c  ee also sqlite3L
22d0: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f  ocateTable()..*/
22e0: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 46  .Table *sqlite3F
22f0: 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65 33  indTable(sqlite3
2300: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
2310: 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63   *zName, const c
2320: 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29 7b  har *zDatabase){
2330: 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b  .  Table *p = 0;
2340: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
2350: 6e 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28  nName;.  assert(
2360: 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 6e   zName!=0 );.  n
2370: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
2380: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
2390: 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20   /* All mutexes 
23a0: 61 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  are required for
23b0: 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20   schema access. 
23c0: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f   Make sure we ho
23d0: 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73  ld them. */.  as
23e0: 73 65 72 74 28 20 7a 44 61 74 61 62 61 73 65 21  sert( zDatabase!
23f0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  =0 || sqlite3Btr
2400: 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
2410: 73 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69  s(db) );.  for(i
2420: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
2430: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2440: 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29     int j = (i<2)
2450: 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a   ? i^1 : i;   /*
2460: 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66   Search TEMP bef
2470: 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20  ore MAIN */.    
2480: 69 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30  if( zDatabase!=0
2490: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
24a0: 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62  mp(zDatabase, db
24b0: 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20  ->aDb[j].zName) 
24c0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
24d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
24e0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
24f0: 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20  b, j, 0) );.    
2500: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
2510: 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e  ind(&db->aDb[j].
2520: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
2530: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
2540: 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65  .    if( p ) bre
2550: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
2560: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   p;.}../*.** Loc
2570: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
2580: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
2590: 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72   describes a par
25a0: 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
25b0: 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20  .** table given 
25c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
25d0: 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69   table and (opti
25e0: 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65  onally) the name
25f0: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
2600: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
2610: 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
2620: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
2630: 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65  und.  Also leave
2640: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73   an.** error mes
2650: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
2660: 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
2670: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
2680: 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
2690: 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69  ne and sqlite3Fi
26a0: 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61  ndTable() is tha
26b0: 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  t this.** routin
26c0: 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f  e leaves an erro
26d0: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
26e0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65  rse->zErrMsg whe
26f0: 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e  re.** sqlite3Fin
2700: 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f  dTable() does no
2710: 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  t..*/.Table *sql
2720: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
2730: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2740: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e  ,         /* con
2750: 74 65 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f  text in which to
2760: 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a   report errors *
2770: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20  /.  int isView, 
2780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2790: 75 65 20 69 66 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ue if looking fo
27a0: 72 20 61 20 56 49 45 57 20 72 61 74 68 65 72 20  r a VIEW rather 
27b0: 74 68 61 6e 20 61 20 54 41 42 4c 45 20 2a 2f 0a  than a TABLE */.
27c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
27d0: 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame,     /* Name
27e0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65   of the table we
27f0: 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72   are looking for
2800: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2810: 20 2a 7a 44 62 61 73 65 20 20 20 20 20 2f 2a 20   *zDbase     /* 
2820: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
2830: 62 61 73 65 2e 20 20 4d 69 67 68 74 20 62 65 20  base.  Might be 
2840: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  NULL */.){.  Tab
2850: 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61  le *p;..  /* Rea
2860: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
2870: 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72  chema. If an err
2880: 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
2890: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
28a0: 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20  e.  ** and code 
28b0: 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
28c0: 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  turn NULL. */.  
28d0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
28e0: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
28f0: 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
2900: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
2910: 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64   p = sqlite3Find
2920: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
2930: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29  , zName, zDbase)
2940: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
2950: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2960: 7a 4d 73 67 20 3d 20 69 73 56 69 65 77 20 3f 20  zMsg = isView ? 
2970: 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22 20 3a  "no such view" :
2980: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 22   "no such table"
2990: 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73 65  ;.    if( zDbase
29a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
29c0: 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a  , "%s: %s.%s", z
29d0: 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61  Msg, zDbase, zNa
29e0: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
29f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2a00: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
2a10: 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 4e  s: %s", zMsg, zN
2a20: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
2a30: 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
2a40: 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  ema = 1;.  }.  r
2a50: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
2a60: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  * Locate the tab
2a70: 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  le identified by
2a80: 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   *p..**.** This 
2a90: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
2aa0: 75 6e 64 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  und sqlite3Locat
2ab0: 65 54 61 62 6c 65 28 29 2e 20 54 68 65 20 64 69  eTable(). The di
2ac0: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
2ad0: 0a 2a 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  .** sqlite3Locat
2ae0: 65 54 61 62 6c 65 28 29 20 61 6e 64 20 74 68 69  eTable() and thi
2af0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68  s function is th
2b00: 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
2b10: 20 72 65 73 74 72 69 63 74 73 0a 2a 2a 20 74 68   restricts.** th
2b20: 65 20 73 65 61 72 63 68 20 74 6f 20 73 63 68 65  e search to sche
2b30: 6d 61 20 28 70 2d 3e 70 53 63 68 65 6d 61 29 20  ma (p->pSchema) 
2b40: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c  if it is not NUL
2b50: 4c 2e 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61  L. p->pSchema ma
2b60: 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c  y be.** non-NULL
2b70: 20 69 66 20 69 74 20 69 73 20 70 61 72 74 20 6f   if it is part o
2b80: 66 20 61 20 76 69 65 77 20 6f 72 20 74 72 69 67  f a view or trig
2b90: 67 65 72 20 70 72 6f 67 72 61 6d 20 64 65 66 69  ger program defi
2ba0: 6e 69 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73  nition. See.** s
2bb0: 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
2bc0: 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  () for details..
2bd0: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
2be0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d  3LocateTableItem
2bf0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
2c00: 65 2c 20 0a 20 20 69 6e 74 20 69 73 56 69 65 77  e, .  int isView
2c10: 2c 20 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  , .  struct SrcL
2c20: 69 73 74 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a 20  ist_item *p.){. 
2c30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2c40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
2c50: 53 63 68 65 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e  Schema==0 || p->
2c60: 7a 44 61 74 61 62 61 73 65 3d 3d 30 20 29 3b 0a  zDatabase==0 );.
2c70: 20 20 69 66 28 20 70 2d 3e 70 53 63 68 65 6d 61    if( p->pSchema
2c80: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 20   ){.    int iDb 
2c90: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
2ca0: 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
2cb0: 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
2cc0: 20 20 20 20 7a 44 62 20 3d 20 70 50 61 72 73 65      zDb = pParse
2cd0: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  ->db->aDb[iDb].z
2ce0: 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Name;.  }else{. 
2cf0: 20 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74     zDb = p->zDat
2d00: 61 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74  abase;.  }.  ret
2d10: 75 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  urn sqlite3Locat
2d20: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  eTable(pParse, i
2d30: 73 56 69 65 77 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  sView, p->zName,
2d40: 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zDb);.}../*.** 
2d50: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
2d60: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
2d70: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a  hat describes .*
2d80: 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  * a particular i
2d90: 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e  ndex given the n
2da0: 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65  ame of that inde
2db0: 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d  x.** and the nam
2dc0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2dd0: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
2de0: 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65  the index..** Re
2df0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
2e00: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
2e10: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
2e20: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
2e30: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
2e40: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64  the.** table and
2e50: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
2e60: 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 74  ing index is ret
2e70: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
2e80: 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c  king.** for dupl
2e90: 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65  icate index name
2ea0: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
2eb0: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
2ec0: 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20  .** TEMP first, 
2ed0: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
2ee0: 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61  any auxiliary da
2ef0: 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a  tabases added.**
2f00: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
2f10: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e  H command..*/.In
2f20: 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  dex *sqlite3Find
2f30: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
2f40: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
2f50: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
2f60: 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20   *zDb){.  Index 
2f70: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
2f80: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73  .  int nName = s
2f90: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2fa0: 4e 61 6d 65 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20  Name);.  /* All 
2fb0: 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71 75  mutexes are requ
2fc0: 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20  ired for schema 
2fd0: 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75  access.  Make su
2fe0: 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e  re we hold them.
2ff0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44   */.  assert( zD
3000: 62 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42  b!=0 || sqlite3B
3010: 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
3020: 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66 6f 72  xes(db) );.  for
3030: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
3040: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
3050: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
3060: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f  2) ? i^1 : i;  /
3070: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
3080: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
3090: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
30a0: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53   = db->aDb[j].pS
30b0: 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72  chema;.    asser
30c0: 74 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  t( pSchema );.  
30d0: 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c    if( zDb && sql
30e0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
30f0: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d   db->aDb[j].zNam
3100: 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  e) ) continue;. 
3110: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
3120: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
3130: 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20  d(db, j, 0) );. 
3140: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
3150: 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d  shFind(&pSchema-
3160: 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c  >idxHash, zName,
3170: 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   nName);.    if(
3180: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
3190: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
31a0: 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65  *.** Reclaim the
31b0: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
31c0: 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74  an index.*/.stat
31d0: 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65  ic void freeInde
31e0: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  x(sqlite3 *db, I
31f0: 6e 64 65 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65  ndex *p){.#ifnde
3200: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e  f SQLITE_OMIT_AN
3210: 41 4c 59 5a 45 0a 20 20 73 71 6c 69 74 65 33 44  ALYZE.  sqlite3D
3220: 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c 65  eleteIndexSample
3230: 73 28 64 62 2c 20 70 29 3b 0a 23 65 6e 64 69 66  s(db, p);.#endif
3240: 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 7c 7c 20  .  if( db==0 || 
3250: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
3260: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65 79  ==0 ) sqlite3Key
3270: 49 6e 66 6f 55 6e 72 65 66 28 70 2d 3e 70 4b 65  InfoUnref(p->pKe
3280: 79 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65  yInfo);.  sqlite
3290: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
32a0: 70 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  p->pPartIdxWhere
32b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
32c0: 65 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66  ee(db, p->zColAf
32d0: 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 52  f);.  if( p->isR
32e0: 65 73 69 7a 65 64 20 29 20 73 71 6c 69 74 65 33  esized ) sqlite3
32f0: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a  DbFree(db, p->az
3300: 43 6f 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  Coll);.  sqlite3
3310: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
3320: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
3330: 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64  index called zId
3340: 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66  xName which is f
3350: 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61  ound in the data
3360: 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c  base iDb,.** unl
3370: 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66  ike that index f
3380: 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68  rom its Table th
3390: 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  en remove the in
33a0: 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  dex from.** the 
33b0: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
33c0: 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65   and free all me
33d0: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
33e0: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
33f0: 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f  th the index..*/
3400: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
3410: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
3420: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  x(sqlite3 *db, i
3430: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
3440: 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20  ar *zIdxName){. 
3450: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
3460: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61 73    int len;.  Has
3470: 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73  h *pHash;..  ass
3480: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
3490: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
34a0: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61  iDb, 0) );.  pHa
34b0: 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  sh = &db->aDb[iD
34c0: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  b].pSchema->idxH
34d0: 61 73 68 3b 0a 20 20 6c 65 6e 20 3d 20 73 71 6c  ash;.  len = sql
34e0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64  ite3Strlen30(zId
34f0: 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78  xName);.  pIndex
3500: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
3510: 73 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78  sert(pHash, zIdx
3520: 4e 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b 0a 20  Name, len, 0);. 
3530: 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 64   if( ALWAYS(pInd
3540: 65 78 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ex) ){.    if( p
3550: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70  Index->pTable->p
3560: 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b  Index==pIndex ){
3570: 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
3580: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20  Table->pIndex = 
3590: 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20  pIndex->pNext;. 
35a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35b0: 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20  Index *p;.      
35c0: 2f 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e  /* Justification
35d0: 20 6f 66 20 41 4c 57 41 59 53 28 29 3b 20 20 54   of ALWAYS();  T
35e0: 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65  he index must be
35f0: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 0a   on the list of.
3600: 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73        ** indices
3610: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20 70  . */.      p = p
3620: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70  Index->pTable->p
3630: 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69  Index;.      whi
3640: 6c 65 28 20 41 4c 57 41 59 53 28 70 29 20 26 26  le( ALWAYS(p) &&
3650: 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65   p->pNext!=pInde
3660: 78 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78  x ){ p = p->pNex
3670: 74 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41  t; }.      if( A
3680: 4c 57 41 59 53 28 70 20 26 26 20 70 2d 3e 70 4e  LWAYS(p && p->pN
3690: 65 78 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b 0a  ext==pIndex) ){.
36a0: 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
36b0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
36c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36d0: 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64 62      freeIndex(db
36e0: 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  , pIndex);.  }. 
36f0: 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
3700: 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
3710: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f  es;.}../*.** Loo
3720: 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 69  k through the li
3730: 73 74 20 6f 66 20 6f 70 65 6e 20 64 61 74 61 62  st of open datab
3740: 61 73 65 20 66 69 6c 65 73 20 69 6e 20 64 62 2d  ase files in db-
3750: 3e 61 44 62 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a  >aDb[] and if.**
3760: 20 61 6e 79 20 68 61 76 65 20 62 65 65 6e 20 63   any have been c
3770: 6c 6f 73 65 64 2c 20 72 65 6d 6f 76 65 20 74 68  losed, remove th
3780: 65 6d 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  em from the list
3790: 2e 20 20 52 65 61 6c 6c 6f 63 61 74 65 20 74 68  .  Reallocate th
37a0: 65 0a 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d 20 73  e.** db->aDb[] s
37b0: 74 72 75 63 74 75 72 65 20 74 6f 20 61 20 73 6d  tructure to a sm
37c0: 61 6c 6c 65 72 20 73 69 7a 65 2c 20 69 66 20 70  aller size, if p
37d0: 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45  ossible..**.** E
37e0: 6e 74 72 79 20 30 20 28 74 68 65 20 22 6d 61 69  ntry 0 (the "mai
37f0: 6e 22 20 64 61 74 61 62 61 73 65 29 20 61 6e 64  n" database) and
3800: 20 65 6e 74 72 79 20 31 20 28 74 68 65 20 22 74   entry 1 (the "t
3810: 65 6d 70 22 20 64 61 74 61 62 61 73 65 29 0a 2a  emp" database).*
3820: 2a 20 61 72 65 20 6e 65 76 65 72 20 63 61 6e 64  * are never cand
3830: 69 64 61 74 65 73 20 66 6f 72 20 62 65 69 6e 67  idates for being
3840: 20 63 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76   collapsed..*/.v
3850: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61  oid sqlite3Colla
3860: 70 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79  pseDatabaseArray
3870: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
3880: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72   int i, j;.  for
3890: 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44  (i=j=2; i<db->nD
38a0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  b; i++){.    str
38b0: 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64  uct Db *pDb = &d
38c0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
38d0: 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29  f( pDb->pBt==0 )
38e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
38f0: 62 46 72 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a  bFree(db, pDb->z
3900: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62  Name);.      pDb
3910: 2d 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ->zName = 0;.   
3920: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
3930: 20 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29   }.    if( j<i )
3940: 7b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  {.      db->aDb[
3950: 6a 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b  j] = db->aDb[i];
3960: 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a  .    }.    j++;.
3970: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62    }.  memset(&db
3980: 2d 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62  ->aDb[j], 0, (db
3990: 2d 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28  ->nDb-j)*sizeof(
39a0: 64 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20  db->aDb[j]));.  
39b0: 64 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69  db->nDb = j;.  i
39c0: 66 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26  f( db->nDb<=2 &&
39d0: 20 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44   db->aDb!=db->aD
39e0: 62 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d  bStatic ){.    m
39f0: 65 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61  emcpy(db->aDbSta
3a00: 74 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a  tic, db->aDb, 2*
3a10: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30  sizeof(db->aDb[0
3a20: 5d 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ]));.    sqlite3
3a30: 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61  DbFree(db, db->a
3a40: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
3a50: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
3a60: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
3a70: 65 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20  eset the schema 
3a80: 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
3a90: 20 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20 20   at index iDb.  
3aa0: 41 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a 2a  Also reset the.*
3ab0: 2a 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a  * TEMP schema..*
3ac0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
3ad0: 73 65 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c  setOneSchema(sql
3ae0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
3af0: 62 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20  b){.  Db *pDb;. 
3b00: 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d   assert( iDb<db-
3b10: 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  >nDb );..  /* Ca
3b20: 73 65 20 31 3a 20 20 52 65 73 65 74 20 74 68 65  se 1:  Reset the
3b30: 20 73 69 6e 67 6c 65 20 73 63 68 65 6d 61 20 69   single schema i
3b40: 64 65 6e 74 69 66 69 65 64 20 62 79 20 69 44 62  dentified by iDb
3b50: 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   */.  pDb = &db-
3b60: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 61 73 73  >aDb[iDb];.  ass
3b70: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
3b80: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
3b90: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 61 73 73  iDb, 0) );.  ass
3ba0: 65 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d  ert( pDb->pSchem
3bb0: 61 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  a!=0 );.  sqlite
3bc0: 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62  3SchemaClear(pDb
3bd0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 20 20 2f  ->pSchema);..  /
3be0: 2a 20 49 66 20 61 6e 79 20 64 61 74 61 62 61 73  * If any databas
3bf0: 65 20 6f 74 68 65 72 20 74 68 61 6e 20 54 45 4d  e other than TEM
3c00: 50 20 69 73 20 72 65 73 65 74 2c 20 74 68 65 6e  P is reset, then
3c10: 20 61 6c 73 6f 20 72 65 73 65 74 20 54 45 4d 50   also reset TEMP
3c20: 0a 20 20 2a 2a 20 73 69 6e 63 65 20 54 45 4d 50  .  ** since TEMP
3c30: 20 6d 69 67 68 74 20 62 65 20 68 6f 6c 64 69 6e   might be holdin
3c40: 67 20 74 72 69 67 67 65 72 73 20 74 68 61 74 20  g triggers that 
3c50: 72 65 66 65 72 65 6e 63 65 20 74 61 62 6c 65 73  reference tables
3c60: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68   in the.  ** oth
3c70: 65 72 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  er database..  *
3c80: 2f 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20 29  /.  if( iDb!=1 )
3c90: 7b 0a 20 20 20 20 70 44 62 20 3d 20 26 64 62 2d  {.    pDb = &db-
3ca0: 3e 61 44 62 5b 31 5d 3b 0a 20 20 20 20 61 73 73  >aDb[1];.    ass
3cb0: 65 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d  ert( pDb->pSchem
3cc0: 61 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  a!=0 );.    sqli
3cd0: 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70  te3SchemaClear(p
3ce0: 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Db->pSchema);.  
3cf0: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
3d00: 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73  *.** Erase all s
3d10: 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f  chema informatio
3d20: 6e 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63  n from all attac
3d30: 68 65 64 20 64 61 74 61 62 61 73 65 73 20 28 69  hed databases (i
3d40: 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69  ncluding.** "mai
3d50: 6e 22 20 61 6e 64 20 22 74 65 6d 70 22 29 20 66  n" and "temp") f
3d60: 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  or a single data
3d70: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
3d80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3d90: 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
3da0: 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69  fConnection(sqli
3db0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
3dc0: 69 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  i;.  sqlite3Btre
3dd0: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
3de0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
3df0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44  nDb; i++){.    D
3e00: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
3e10: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
3e20: 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
3e30: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
3e40: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
3e50: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ema);.    }.  }.
3e60: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
3e70: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
3e80: 6e 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 56  nges;.  sqlite3V
3e90: 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62  tabUnlockList(db
3ea0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
3eb0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
3ec0: 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65   sqlite3Collapse
3ed0: 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62  DatabaseArray(db
3ee0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
3ef0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
3f00: 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74  ed when a commit
3f10: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64   occurs..*/.void
3f20: 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
3f30: 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71  ternalChanges(sq
3f40: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62  lite3 *db){.  db
3f50: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
3f60: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
3f70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
3f80: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
3f90: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ed for the colum
3fa0: 6e 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62  n names of a tab
3fb0: 6c 65 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a  le or view (the.
3fc0: 2a 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20  ** Table.aCol[] 
3fd0: 61 72 72 61 79 29 2e 0a 2a 2f 0a 73 74 61 74 69  array)..*/.stati
3fe0: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c  c void sqliteDel
3ff0: 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73  eteColumnNames(s
4000: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
4010: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e  e *pTable){.  in
4020: 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  t i;.  Column *p
4030: 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Col;.  assert( p
4040: 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66  Table!=0 );.  if
4050: 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65  ( (pCol = pTable
4060: 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20  ->aCol)!=0 ){.  
4070: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
4080: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  ble->nCol; i++, 
4090: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73  pCol++){.      s
40a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
40b0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
40c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
40d0: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
40e0: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73  >pDflt);.      s
40f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4100: 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20   pCol->zDflt);. 
4110: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
4120: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79  ee(db, pCol->zTy
4130: 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pe);.      sqlit
4140: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
4150: 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  l->zColl);.    }
4160: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4170: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61  ee(db, pTable->a
4180: 43 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  Col);.  }.}../*.
4190: 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65  ** Remove the me
41a0: 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74  mory data struct
41b0: 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ures associated 
41c0: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a  with the given.*
41d0: 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61  * Table.  No cha
41e0: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
41f0: 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f   disk by this ro
4200: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  utine..**.** Thi
4210: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64  s routine just d
4220: 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20  eletes the data 
4230: 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64  structure.  It d
4240: 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a  oes not unlink.*
4250: 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61  * the table data
4260: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
4270: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
4280: 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73   But it does des
4290: 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73  troy.** memory s
42a0: 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65  tructures of the
42b0: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72   indices and for
42c0: 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69  eign keys associ
42d0: 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68  ated with .** th
42e0: 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
42f0: 68 65 20 64 62 20 70 61 72 61 6d 65 74 65 72 20  he db parameter 
4300: 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74  is optional.  It
4310: 20 69 73 20 6e 65 65 64 65 64 20 69 66 20 74 68   is needed if th
4320: 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a  e Table object .
4330: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b  ** contains look
4340: 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28  aside memory.  (
4350: 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e  Table objects in
4360: 20 74 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e   the schema do n
4370: 6f 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73  ot use.** lookas
4380: 69 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20  ide memory, but 
4390: 73 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54  some ephemeral T
43a0: 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e  able objects do.
43b0: 29 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20  )  Or the.** db 
43c0: 70 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65  parameter can be
43d0: 20 75 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70   used with db->p
43e0: 6e 42 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d  nBytesFreed to m
43f0: 65 61 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72  easure the memor
4400: 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65  y.** used by the
4410: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a   Table object..*
4420: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
4430: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
4440: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54  3 *db, Table *pT
4450: 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  able){.  Index *
4460: 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a  pIndex, *pNext;.
4470: 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20    TESTONLY( int 
4480: 6e 4c 6f 6f 6b 61 73 69 64 65 3b 20 29 20 2f 2a  nLookaside; ) /*
4490: 20 55 73 65 64 20 74 6f 20 76 65 72 69 66 79 20   Used to verify 
44a0: 6c 6f 6f 6b 61 73 69 64 65 20 6e 6f 74 20 75 73  lookaside not us
44b0: 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 2a 2f  ed for schema */
44c0: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 54 61  ..  assert( !pTa
44d0: 62 6c 65 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 6e  ble || pTable->n
44e0: 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 44  Ref>0 );..  /* D
44f0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
4500: 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65   table until the
4510: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
4520: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a   reaches zero. *
4530: 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20  /.  if( !pTable 
4540: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
4550: 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ((!db || db->pnB
4560: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26  ytesFreed==0) &&
4570: 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52 65 66   (--pTable->nRef
4580: 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  )>0) ) return;..
4590: 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
45a0: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  number of outsta
45b0: 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20  nding lookaside 
45c0: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 73  allocations in s
45d0: 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20 20 2a  chema Tables.  *
45e0: 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67  * prior to doing
45f0: 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70 65 72   any free() oper
4600: 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 73  ations.  Since s
4610: 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64 6f 20  chema Tables do 
4620: 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f  not use.  ** loo
4630: 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e 75 6d  kaside, this num
4640: 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63  ber should not c
4650: 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 54 45 53 54  hange. */.  TEST
4660: 4f 4e 4c 59 28 20 6e 4c 6f 6f 6b 61 73 69 64 65  ONLY( nLookaside
4670: 20 3d 20 28 64 62 20 26 26 20 28 70 54 61 62 6c   = (db && (pTabl
4680: 65 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  e->tabFlags & TF
4690: 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 29 20  _Ephemeral)==0) 
46a0: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
46b0: 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6c             db->l
46c0: 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 3a 20  ookaside.nOut : 
46d0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  0 );..  /* Delet
46e0: 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73  e all indices as
46f0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
4700: 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66  is table. */.  f
4710: 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62  or(pIndex = pTab
4720: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  le->pIndex; pInd
4730: 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74  ex; pIndex=pNext
4740: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
4750: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
4760: 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
4770: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c  ->pSchema==pTabl
4780: 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  e->pSchema );.  
4790: 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
47a0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
47b0: 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
47c0: 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e  zName = pIndex->
47d0: 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54 45  zName; .      TE
47e0: 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a  STONLY ( Index *
47f0: 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65 33  pOld = ) sqlite3
4800: 48 61 73 68 49 6e 73 65 72 74 28 0a 20 20 20 20  HashInsert(.    
4810: 20 20 20 20 20 26 70 49 6e 64 65 78 2d 3e 70 53       &pIndex->pS
4820: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
4830: 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74  zName, sqlite3St
4840: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 20 30  rlen30(zName), 0
4850: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
4860: 61 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c  assert( db==0 ||
4870: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
4880: 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
4890: 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20  Index->pSchema) 
48a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
48b0: 20 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c   pOld==pIndex ||
48c0: 20 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20   pOld==0 );.    
48d0: 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28  }.    freeIndex(
48e0: 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d  db, pIndex);.  }
48f0: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e  ..  /* Delete an
4900: 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  y foreign keys a
4910: 74 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20  ttached to this 
4920: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69  table. */.  sqli
4930: 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20  te3FkDelete(db, 
4940: 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44  pTable);..  /* D
4950: 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20  elete the Table 
4960: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
4970: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 44  ..  */.  sqliteD
4980: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
4990: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
49a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
49b0: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
49c0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
49d0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43  e(db, pTable->zC
49e0: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
49f0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
4a00: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
4a10: 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
4a20: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
4a30: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
4a40: 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65  elete(db, pTable
4a50: 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69  ->pCheck);.#endi
4a60: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
4a70: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
4a80: 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  LE.  sqlite3Vtab
4a90: 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65  Clear(db, pTable
4aa0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
4ab0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
4ac0: 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72  able);..  /* Ver
4ad0: 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b  ify that no look
4ae0: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73  aside memory was
4af0: 20 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20   used by schema 
4b00: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65  tables */.  asse
4b10: 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d  rt( nLookaside==
4b20: 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d  0 || nLookaside=
4b30: 3d 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e  =db->lookaside.n
4b40: 4f 75 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Out );.}../*.** 
4b50: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
4b60: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
4b70: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
4b80: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
4b90: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
4ba0: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
4bb0: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
4bc0: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
4bd0: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
4be0: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
4bf0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
4c00: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
4c10: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
4c20: 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b  e *p;.  Db *pDb;
4c30: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
4c40: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
4c50: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
4c60: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
4c70: 28 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20  ( zTabName );.  
4c80: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
4c90: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
4ca0: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
4cb0: 74 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61  testcase( zTabNa
4cc0: 6d 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20  me[0]==0 );  /* 
4cd0: 5a 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c  Zero-length tabl
4ce0: 65 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f  e names are allo
4cf0: 77 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26  wed */.  pDb = &
4d00: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
4d10: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
4d20: 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68  nsert(&pDb->pSch
4d30: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54  ema->tblHash, zT
4d40: 61 62 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  abName,.        
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d60: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
4d70: 7a 54 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20 20  zTabName),0);.  
4d80: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
4d90: 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d  le(db, p);.  db-
4da0: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
4db0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
4dc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
4dd0: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
4de0: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
4df0: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
4e00: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
4e10: 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  en.  Space to ho
4e20: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
4e30: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74  string.** is obt
4e40: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
4e50: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
4e60: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
4e70: 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
4e80: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e  nction..**.** An
4e90: 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b  y quotation mark
4ea0: 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20  s (ex:  "name", 
4eb0: 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20  'name', [name], 
4ec0: 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a  or `name`) that.
4ed0: 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20  ** surround the 
4ee0: 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65  body of the toke
4ef0: 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a  n are removed..*
4f00: 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20  *.** Tokens are 
4f10: 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74  often just point
4f20: 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69  ers into the ori
4f30: 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61  ginal SQL text a
4f40: 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74  nd so.** are not
4f50: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
4f60: 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72   and are not per
4f70: 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65  sistent.  The re
4f80: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a  turned string.**
4f90: 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61   is \000 termina
4fa0: 74 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69  ted and is persi
4fb0: 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a  stent..*/.char *
4fc0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
4fd0: 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  oken(sqlite3 *db
4fe0: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
4ff0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
5000: 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
5010: 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
5020: 65 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20  e3DbStrNDup(db, 
5030: 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c  (char*)pName->z,
5040: 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20   pName->n);.    
5050: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
5060: 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Name);.  }else{.
5070: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20      zName = 0;. 
5080: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d   }.  return zNam
5090: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  e;.}../*.** Open
50a0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
50b0: 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20  er table stored 
50c0: 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62  in database numb
50d0: 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72  er iDb for.** wr
50e0: 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65  iting. The table
50f0: 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67   is opened using
5100: 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f   cursor 0..*/.vo
5110: 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61  id sqlite3OpenMa
5120: 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20  sterTable(Parse 
5130: 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  *p, int iDb){.  
5140: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
5150: 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73  3GetVdbe(p);.  s
5160: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
5170: 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52  p, iDb, MASTER_R
5180: 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54  OOT, 1, SCHEMA_T
5190: 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71  ABLE(iDb));.  sq
51a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
51b0: 6e 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  nt(v, OP_OpenWri
51c0: 74 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f  te, 0, MASTER_RO
51d0: 4f 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69  OT, iDb, 5);.  i
51e0: 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b  f( p->nTab==0 ){
51f0: 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31  .    p->nTab = 1
5200: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
5210: 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70  arameter zName p
5220: 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74  oints to a nul-t
5230: 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72  erminated buffer
5240: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
5250: 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74  name.** of a dat
5260: 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22  abase ("main", "
5270: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
5280: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
5290: 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75   db). This.** fu
52a0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
52b0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
52c0: 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69  named database i
52d0: 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a  n db->aDb[], or.
52e0: 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d  ** -1 if the nam
52f0: 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20  ed db cannot be 
5300: 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
5310: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
5320: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
5330: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
5340: 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20  .  int i = -1;  
5350: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
5360: 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  se number */.  i
5370: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
5380: 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 69 6e 74  Db *pDb;.    int
5390: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
53a0: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  en30(zName);.   
53b0: 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d   for(i=(db->nDb-
53c0: 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62  1), pDb=&db->aDb
53d0: 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  [i]; i>=0; i--, 
53e0: 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  pDb--){.      if
53f0: 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  ( (!OMIT_TEMPDB 
5400: 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d  || i!=1 ) && n==
5410: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
5420: 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a  pDb->zName) && .
5430: 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c            0==sql
5440: 69 74 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d  ite3StrICmp(pDb-
5450: 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29  >zName, zName) )
5460: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
5470: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5480: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
5490: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65  ../*.** The toke
54a0: 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e  n *pName contain
54b0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
54c0: 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72  database (either
54d0: 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74   "main" or.** "t
54e0: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
54f0: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
5500: 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e  db). This routin
5510: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
5520: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61   index of the na
5530: 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20  med database in 
5540: 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31  db->aDb[], or -1
5550: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62   if the named db
5560: 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78   .** does not ex
5570: 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ist..*/.int sqli
5580: 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65  te3FindDb(sqlite
5590: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
55a0: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  ame){.  int i;  
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
55d0: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
55e0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
55f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5600: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
5610: 65 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69  e we are searchi
5620: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d  ng for */.  zNam
5630: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
5640: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
5650: 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74  me);.  i = sqlit
5660: 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c  e3FindDbName(db,
5670: 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74   zName);.  sqlit
5680: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
5690: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b  me);.  return i;
56a0: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65  .}../* The table
56b0: 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67   or view or trig
56c0: 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73  ger name is pass
56d0: 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ed to this routi
56e0: 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a  ne via tokens.**
56f0: 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d   pName1 and pNam
5700: 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65  e2. If the table
5710: 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20   name was fully 
5720: 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65  qualified, for e
5730: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52  xample:.**.** CR
5740: 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79  EATE TABLE xxx.y
5750: 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a  yy (...);.** .**
5760: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
5770: 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64  set to "xxx" and
5780: 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f   pName2 "yyy". O
5790: 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
57a0: 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   if.** the table
57b0: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
57c0: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
57d0: 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45  e.:.**.** CREATE
57e0: 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b   TABLE yyy(...);
57f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  .**.** Then pNam
5800: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79  e1 is set to "yy
5810: 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73  y" and pName2 is
5820: 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   ""..**.** This 
5830: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
5840: 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74   *ppUnqual point
5850: 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  er to point at t
5860: 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31  he token (pName1
5870: 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74   or.** pName2) t
5880: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75  hat stores the u
5890: 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65  nqualified table
58a0: 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65   name.  The inde
58b0: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  x of the.** data
58c0: 62 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65  base "xxx" is re
58d0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
58e0: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
58f0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
5900: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
5910: 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e  ing and code gen
5920: 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20  erating context 
5930: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
5940: 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e1,      /* The 
5950: 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d  "xxx" in the nam
5960: 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22  e "xxx.yyy" or "
5970: 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  xxx" */.  Token 
5980: 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a  *pName2,      /*
5990: 20 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68   The "yyy" in th
59a0: 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22  e name "xxx.yyy"
59b0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55   */.  Token **pU
59c0: 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69  nqual     /* Wri
59d0: 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  te the unqualifi
59e0: 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68  ed object name h
59f0: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
5a00: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
5a10: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5a20: 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ase holding the 
5a30: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
5a40: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
5a50: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 41 4c 57  ->db;..  if( ALW
5a60: 41 59 53 28 70 4e 61 6d 65 32 21 3d 30 29 20 26  AYS(pName2!=0) &
5a70: 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b  & pName2->n>0 ){
5a80: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  .    if( db->ini
5a90: 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20  t.busy ) {.     
5aa0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5ab0: 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70  (pParse, "corrup
5ac0: 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20  t database");.  
5ad0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
5ae0: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
5af0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a   -1;.    }.    *
5b00: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32  pUnqual = pName2
5b10: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
5b20: 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e  te3FindDb(db, pN
5b30: 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69  ame1);.    if( i
5b40: 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  Db<0 ){.      sq
5b50: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5b60: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64  arse, "unknown d
5b70: 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61  atabase %T", pNa
5b80: 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72  me1);.      pPar
5b90: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
5ba0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
5bb0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
5bc0: 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74  assert( db->init
5bd0: 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69  .iDb==0 || db->i
5be0: 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
5bf0: 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69  iDb = db->init.i
5c00: 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c  Db;.    *pUnqual
5c10: 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20   = pName1;.  }. 
5c20: 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a   return iDb;.}..
5c30: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
5c40: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  ne is used to ch
5c50: 65 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38  eck if the UTF-8
5c60: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73   string zName is
5c70: 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75   a legal.** unqu
5c80: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72  alified name for
5c90: 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62   a new schema ob
5ca0: 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64  ject (table, ind
5cb0: 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74  ex, view or.** t
5cc0: 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d  rigger). All nam
5cd0: 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63  es are legal exc
5ce0: 65 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62  ept those that b
5cf0: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74  egin with the st
5d00: 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f  ring.** "sqlite_
5d10: 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77  " (in upper, low
5d20: 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65  er or mixed case
5d30: 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20  ). This portion 
5d40: 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65  of the namespace
5d50: 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20  .** is reserved 
5d60: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65  for internal use
5d70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5d80: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
5d90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
5da0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
5db0: 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  ){.  if( !pParse
5dc0: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ->db->init.busy 
5dd0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  && pParse->neste
5de0: 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  d==0 .          
5df0: 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  && (pParse->db->
5e00: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57  flags & SQLITE_W
5e10: 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20  riteSchema)==0. 
5e20: 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
5e30: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
5e40: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
5e50: 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   7) ){.    sqlit
5e60: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
5e70: 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20  e, "object name 
5e80: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
5e90: 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20  ernal use: %s", 
5ea0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
5eb0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
5ec0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
5ed0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
5ee0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49  * Return the PRI
5ef0: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f  MARY KEY index o
5f00: 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64  f a table.*/.Ind
5f10: 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61  ex *sqlite3Prima
5f20: 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65  ryKeyIndex(Table
5f30: 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78   *pTab){.  Index
5f40: 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61   *p;.  for(p=pTa
5f50: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20  b->pIndex; p && 
5f60: 70 2d 3e 61 75 74 6f 49 6e 64 65 78 21 3d 32 3b  p->autoIndex!=2;
5f70: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20   p=p->pNext){}. 
5f80: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
5f90: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
5fa0: 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70  olumn of index p
5fb0: 49 64 78 20 74 68 61 74 20 63 6f 72 72 65 73 70  Idx that corresp
5fc0: 6f 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a 2a  onds to table.**
5fd0: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20 52   column iCol.  R
5fe0: 65 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74 20  eturn -1 if not 
5ff0: 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73 71  found..*/.i16 sq
6000: 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64  lite3ColumnOfInd
6010: 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  ex(Index *pIdx, 
6020: 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74  i16 iCol){.  int
6030: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
6040: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
6050: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 43  i++){.    if( iC
6060: 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ol==pIdx->aiColu
6070: 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 69  mn[i] ) return i
6080: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
6090: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  1;.}../*.** Begi
60a0: 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61  n constructing a
60b0: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72 65   new table repre
60c0: 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d  sentation in mem
60d0: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  ory.  This is.**
60e0: 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73 65   the first of se
60f0: 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75  veral action rou
6100: 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20 63  tines that get c
6110: 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73  alled in respons
6120: 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45  e.** to a CREATE
6130: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
6140: 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72  .  In particular
6150: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
6160: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65  s called.** afte
6170: 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20  r seeing tokens 
6180: 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54 41  "CREATE" and "TA
6190: 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61 62  BLE" and the tab
61a0: 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54  le name. The isT
61b0: 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74  emp.** flag is t
61c0: 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  rue if the table
61d0: 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65   should be store
61e0: 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61  d in the auxilia
61f0: 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ry database.** f
6200: 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
6210: 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
6220: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
6230: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20  is normally the 
6240: 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65  case.** when the
6250: 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50   "TEMP" or "TEMP
6260: 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f  ORARY" keyword o
6270: 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e  ccurs in between
6280: 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54  .** CREATE and T
6290: 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ABLE..**.** The 
62a0: 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64  new table record
62b0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
62c0: 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72 73  and put in pPars
62d0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a  e->pNewTable..**
62e0: 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   As more of the 
62f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
6300: 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64  tement is parsed
6310: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74  , additional act
6320: 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20  ion.** routines 
6330: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74  will be called t
6340: 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72  o add more infor
6350: 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72  mation to this r
6360: 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65  ecord..** At the
6370: 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
6380: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
6390: 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45  nt, the sqlite3E
63a0: 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e  ndTable() routin
63b0: 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74  e.** is called t
63c0: 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63  o complete the c
63d0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74  onstruction of t
63e0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63  he new table rec
63f0: 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ord..*/.void sql
6400: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a  ite3StartTable(.
6410: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6420: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
6430: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
6440: 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69  *pName1,   /* Fi
6450: 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  rst part of the 
6460: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
6470: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54  e or view */.  T
6480: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
6490: 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f  /* Second part o
64a0: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
64b0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
64c0: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
64d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
64e0: 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50 20   this is a TEMP 
64f0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  table */.  int i
6500: 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54  sView,      /* T
6510: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
6520: 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69   VIEW */.  int i
6530: 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54  sVirtual,   /* T
6540: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
6550: 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a   VIRTUAL table *
6560: 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20  /.  int noErr   
6570: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
6580: 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65  ng if table alre
6590: 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
65a0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  .  Table *pTable
65b0: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  ;.  char *zName 
65c0: 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65  = 0; /* The name
65d0: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
65e0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  e */.  sqlite3 *
65f0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
6600: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
6610: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
6620: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
6630: 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  r to create the 
6640: 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f  table in */.  To
6650: 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f  ken *pName;    /
6660: 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61  * Unqualified na
6670: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
6680: 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20  to create */..  
6690: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20  /* The table or 
66a0: 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65  view name to cre
66b0: 61 74 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  ate is passed to
66c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
66d0: 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e  a tokens.  ** pN
66e0: 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e  ame1 and pName2.
66f0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61   If the table na
6700: 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61  me was fully qua
6710: 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d  lified, for exam
6720: 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  ple:.  **.  ** C
6730: 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e  REATE TABLE xxx.
6740: 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20  yyy (...);.  ** 
6750: 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  .  ** Then pName
6760: 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78  1 is set to "xxx
6770: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79  " and pName2 "yy
6780: 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72  y". On the other
6790: 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68   hand if.  ** th
67a0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20  e table name is 
67b0: 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  not fully qualif
67c0: 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a  ied, i.e.:.  **.
67d0: 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
67e0: 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a  E yyy(...);.  **
67f0: 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  .  ** Then pName
6800: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
6810: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
6820: 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ""..  **.  ** Th
6830: 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74  e call below set
6840: 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e  s the pName poin
6850: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
6860: 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65  the token (pName
6870: 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32  1 or.  ** pName2
6880: 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68  ) that stores th
6890: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61  e unqualified ta
68a0: 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61  ble name. The va
68b0: 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20  riable iDb is.  
68c0: 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e  ** set to the in
68d0: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
68e0: 61 73 65 20 74 68 61 74 20 74 68 65 20 74 61 62  ase that the tab
68f0: 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f  le or view is to
6900: 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64   be.  ** created
6910: 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20   in..  */.  iDb 
6920: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
6930: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
6940: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
6950: 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c  ame);.  if( iDb<
6960: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
6970: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
6980: 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61 6d  & isTemp && pNam
6990: 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21 3d  e2->n>0 && iDb!=
69a0: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63  1 ){.    /* If c
69b0: 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74  reating a temp t
69c0: 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d  able, the name m
69d0: 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66  ay not be qualif
69e0: 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20 20 20  ied. Unless .   
69f0: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
6a00: 20 6e 61 6d 65 20 69 73 20 22 74 65 6d 70 22 20   name is "temp" 
6a10: 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20 20 20  anyway.  */.    
6a20: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6a30: 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61  pParse, "tempora
6a40: 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75  ry table name mu
6a50: 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65  st be unqualifie
6a60: 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d");.    return;
6a70: 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54  .  }.  if( !OMIT
6a80: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6a90: 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20  p ) iDb = 1;..  
6aa0: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
6ab0: 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a  en = *pName;.  z
6ac0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
6ad0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
6ae0: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
6af0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
6b00: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
6b10: 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
6b20: 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
6b30: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67   zName) ){.    g
6b40: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
6b50: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28  error;.  }.  if(
6b60: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31   db->init.iDb==1
6b70: 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23   ) isTemp = 1;.#
6b80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6b90: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
6ba0: 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 54 65  .  assert( (isTe
6bb0: 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20  mp & 1)==isTemp 
6bc0: 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  );.  {.    int c
6bd0: 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ode;.    char *z
6be0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
6bf0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28  ].zName;.    if(
6c00: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
6c10: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
6c20: 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f  _INSERT, SCHEMA_
6c30: 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30  TABLE(isTemp), 0
6c40: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
6c50: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
6c60: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
6c70: 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a    if( isView ){.
6c80: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
6c90: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
6ca0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
6cb0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
6cc0: 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20  _TEMP_VIEW;.    
6cd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6ce0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
6cf0: 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20  REATE_VIEW;.    
6d00: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
6d10: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
6d20: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
6d30: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
6d40: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
6d50: 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
6d60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6d70: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
6d80: 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20  REATE_TABLE;.   
6d90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
6da0: 66 28 20 21 69 73 56 69 72 74 75 61 6c 20 26 26  f( !isVirtual &&
6db0: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
6dc0: 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
6dd0: 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29  zName, 0, zDb) )
6de0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
6df0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
6e00: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
6e10: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
6e20: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e   the new table n
6e30: 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c  ame does not col
6e40: 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69  lide with an exi
6e50: 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78  sting.  ** index
6e60: 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69   or table name i
6e70: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
6e80: 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65  ase.  Issue an e
6e90: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a  rror message if.
6ea0: 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54 68    ** it does. Th
6eb0: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
6ec0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
6ed0: 62 65 69 6e 67 20 70 61 72 73 65 64 20 77 61 73  being parsed was
6ee0: 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20   passed.  ** to 
6ef0: 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61  an sqlite3_decla
6f00: 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e 20  re_vtab() call. 
6f10: 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c  In that case onl
6f20: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
6f30: 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70 65  es.  ** and type
6f40: 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20  s will be used, 
6f50: 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e  so there is no n
6f60: 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20  eed to test for 
6f70: 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20 63  namespace.  ** c
6f80: 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  ollisions..  */.
6f90: 20 20 69 66 28 20 21 49 4e 5f 44 45 43 4c 41 52    if( !IN_DECLAR
6fa0: 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 63 68  E_VTAB ){.    ch
6fb0: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
6fc0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
6fd0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
6fe0: 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
6ff0: 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
7000: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
7010: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
7020: 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 73  }.    pTable = s
7030: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
7040: 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b  db, zName, zDb);
7050: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20  .    if( pTable 
7060: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f  ){.      if( !no
7070: 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Err ){.        s
7080: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7090: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54  Parse, "table %T
70a0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
70b0: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , pName);.      
70c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
70d0: 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
70e0: 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20  .busy );.       
70f0: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
7100: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
7110: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
7120: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
7130: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
7140: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
7150: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
7160: 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29  zName, zDb)!=0 )
7170: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
7180: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7190: 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
71a0: 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64  y an index named
71b0: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
71c0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
71d0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
71e0: 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20  }.  }..  pTable 
71f0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7200: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
7210: 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20  (Table));.  if( 
7220: 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  pTable==0 ){.   
7230: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
7240: 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 72 73  d = 1;.    pPars
7250: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  e->rc = SQLITE_N
7260: 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65  OMEM;.    pParse
7270: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
7280: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7290: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
72a0: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
72b0: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b  e;.  pTable->iPK
72c0: 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c  ey = -1;.  pTabl
72d0: 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  e->pSchema = db-
72e0: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
72f0: 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65  a;.  pTable->nRe
7300: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 6c 65 2d  f = 1;.  pTable-
7310: 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 34 38 35  >nRowEst = 10485
7320: 37 36 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  76;.  assert( pP
7330: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
7340: 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =0 );.  pParse->
7350: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
7360: 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  le;..  /* If thi
7370: 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73  s is the magic s
7380: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
7390: 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74  able used by aut
73a0: 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a  oincrement,.  **
73b0: 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70   then record a p
73c0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74  ointer to this t
73d0: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
73e0: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
73f0: 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ure.  ** so that
7400: 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64   INSERT can find
7410: 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c   the table easil
7420: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
7430: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
7440: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20  INCREMENT.  if( 
7450: 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20  !pParse->nested 
7460: 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  && strcmp(zName,
7470: 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
7480: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  e")==0 ){.    as
7490: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
74a0: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
74b0: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
74c0: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
74d0: 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c  >pSeqTab = pTabl
74e0: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
74f0: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
7500: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
7510: 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74  at will insert t
7520: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
7530: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51  into.  ** the SQ
7540: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
7550: 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74  e.  Note in part
7560: 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d  icular that we m
7570: 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a  ust go ahead.  *
7580: 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74  * and allocate t
7590: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
75a0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65   for the table e
75b0: 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72  ntry now.  Befor
75c0: 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41  e any.  ** PRIMA
75d0: 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
75e0: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61   keywords are pa
75f0: 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79  rsed.  Those key
7600: 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65  words will cause
7610: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f  .  ** indices to
7620: 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
7630: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
7640: 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72   must come befor
7650: 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  e the .  ** indi
7660: 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ces.  Hence, the
7670: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
7680: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73  or the table mus
7690: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  t be allocated. 
76a0: 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   ** now..  */.  
76b0: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
76c0: 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  sy && (v = sqlit
76d0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
76e0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
76f0: 20 6a 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c   j1;.    int fil
7700: 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74  eFormat;.    int
7710: 20 72 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67   reg1, reg2, reg
7720: 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  3;.    sqlite3Be
7730: 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
7740: 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
7750: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
7760: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7770: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73 56  ABLE.    if( isV
7780: 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20  irtual ){.      
7790: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
77a0: 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b  0(v, OP_VBegin);
77b0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
77c0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
77d0: 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e 63  e format and enc
77e0: 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61 74  oding in the dat
77f0: 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20 62  abase have not b
7800: 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a 2a  een set, .    **
7810: 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a 20   set them now.. 
7820: 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20 3d     */.    reg1 =
7830: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
7840: 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  d = ++pParse->nM
7850: 65 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20 70  em;.    reg2 = p
7860: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20 3d  Parse->regRoot =
7870: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
7880: 0a 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70 50  .    reg3 = ++pP
7890: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
78a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
78b0: 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b  3(v, OP_ReadCook
78c0: 69 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20 42  ie, iDb, reg3, B
78d0: 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54  TREE_FILE_FORMAT
78e0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
78f0: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
7900: 44 62 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71  Db);.    j1 = sq
7910: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
7920: 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b  v, OP_If, reg3);
7930: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
7940: 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74  ;.    fileFormat
7950: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
7960: 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c  SQLITE_LegacyFil
7970: 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20  eFmt)!=0 ?.     
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 3a               1 :
7990: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45   SQLITE_MAX_FILE
79a0: 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c  _FORMAT;.    sql
79b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
79c0: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66 69  , OP_Integer, fi
79d0: 6c 65 46 6f 72 6d 61 74 2c 20 72 65 67 33 29 3b  leFormat, reg3);
79e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
79f0: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
7a00: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52  Cookie, iDb, BTR
7a10: 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20  EE_FILE_FORMAT, 
7a20: 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg3);.    sqlit
7a30: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
7a40: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 45 4e 43 28  OP_Integer, ENC(
7a50: 64 62 29 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  db), reg3);.    
7a60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7a70: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
7a80: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54 45  e, iDb, BTREE_TE
7a90: 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 72 65 67  XT_ENCODING, reg
7aa0: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
7ab0: 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
7ac0: 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  1);..    /* This
7ad0: 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61 20   just creates a 
7ae0: 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63  place-holder rec
7af0: 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  ord in the sqlit
7b00: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a  e_master table..
7b10: 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72      ** The recor
7b20: 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e  d created does n
7b30: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68  ot contain anyth
7b40: 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c  ing yet.  It wil
7b50: 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20  l be replaced.  
7b60: 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c    ** by the real
7b70: 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67   entry in code g
7b80: 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c 69  enerated at sqli
7b90: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20  te3EndTable().. 
7ba0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
7bb0: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e   rowid for the n
7bc0: 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74  ew entry is left
7bd0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50 61   in register pPa
7be0: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20  rse->regRowid.. 
7bf0: 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70     ** The root p
7c00: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
7c10: 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6c  e new table is l
7c20: 65 66 74 20 69 6e 20 72 65 67 20 70 50 61 72 73  eft in reg pPars
7c30: 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20  e->regRoot..    
7c40: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 61 6e 64  ** The rowid and
7c50: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
7c60: 72 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 65  r values are nee
7c70: 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20  ded by the code 
7c80: 74 68 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69  that.    ** sqli
7c90: 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c  te3EndTable will
7ca0: 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a   generate..    *
7cb0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
7cc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
7cd0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
7ce0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
7cf0: 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69  TABLE).    if( i
7d00: 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75  sView || isVirtu
7d10: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
7d20: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7d30: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
7d40: 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65  reg2);.    }else
7d50: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
7d60: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 64 64 72      pParse->addr
7d70: 43 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 56  CrTab = sqlite3V
7d80: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7d90: 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62  CreateTable, iDb
7da0: 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 0a 20  , reg2);.    }. 
7db0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
7dc0: 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73 65  sterTable(pParse
7dd0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
7de0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7df0: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c   OP_NewRowid, 0,
7e00: 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69   reg1);.    sqli
7e10: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7e20: 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67   OP_Null, 0, reg
7e30: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
7e40: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
7e50: 49 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c  Insert, 0, reg3,
7e60: 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69   reg1);.    sqli
7e70: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
7e80: 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44  v, OPFLAG_APPEND
7e90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7ea0: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43  beAddOp0(v, OP_C
7eb0: 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  lose);.  }..  /*
7ec0: 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72   Normal (non-err
7ed0: 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20  or) return. */. 
7ee0: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49   return;..  /* I
7ef0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
7f00: 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20  s, we jump here 
7f10: 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  */.begin_table_e
7f20: 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44  rror:.  sqlite3D
7f30: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
7f40: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
7f50: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
7f60: 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61  is used to compa
7f70: 72 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 69  re two strings i
7f80: 6e 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69  n a case-insensi
7f90: 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20  tive manner..** 
7fa0: 49 74 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66  It is slightly f
7fb0: 61 73 74 65 72 20 74 68 61 6e 20 63 61 6c 6c 69  aster than calli
7fc0: 6e 67 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  ng sqlite3StrICm
7fd0: 70 28 29 20 64 69 72 65 63 74 6c 79 2c 20 62 75  p() directly, bu
7fe0: 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c 61  t.** produces la
7ff0: 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rger code..**.**
8000: 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d   WARNING: This m
8010: 61 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70  acro is not comp
8020: 61 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20  atible with the 
8030: 73 74 72 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e  strcmp() family.
8040: 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74   It.** returns t
8050: 72 75 65 20 69 66 20 74 68 65 20 74 77 6f 20 73  rue if the two s
8060: 74 72 69 6e 67 73 20 61 72 65 20 65 71 75 61 6c  trings are equal
8070: 2c 20 6f 74 68 65 72 77 69 73 65 20 66 61 6c 73  , otherwise fals
8080: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54  e..*/.#define ST
8090: 52 49 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73  RICMP(x, y) (\.s
80a0: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
80b0: 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68  er[*(unsigned ch
80c0: 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a  ar *)(x)]==   \.
80d0: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
80e0: 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63  wer[*(unsigned c
80f0: 68 61 72 20 2a 29 28 79 29 5d 20 20 20 20 20 5c  har *)(y)]     \
8100: 0a 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43  .&& sqlite3StrIC
8110: 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d  mp((x)+1,(y)+1)=
8120: 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  =0 )../*.** Add 
8130: 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20  a new column to 
8140: 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
8150: 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
8160: 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ucted..**.** The
8170: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
8180: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20  is routine once 
8190: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
81a0: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69  declaration.** i
81b0: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
81c0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c   statement.  sql
81d0: 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29  ite3StartTable()
81e0: 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20   gets called.** 
81f0: 66 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69  first to get thi
8200: 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e  ngs going.  Then
8210: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
8220: 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68   called for each
8230: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76  .** column..*/.v
8240: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
8250: 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72  lumn(Parse *pPar
8260: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  se, Token *pName
8270: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
8280: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
8290: 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  z;.  Column *pCo
82a0: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
82b0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
82c0: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
82d0: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
82e0: 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 53 51  ) return;.#if SQ
82f0: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a  LITE_MAX_COLUMN.
8300: 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e    if( p->nCol+1>
8310: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
8320: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
8330: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8340: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8350: 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73  too many columns
8360: 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d   on %s", p->zNam
8370: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  e);.    return;.
8380: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d    }.#endif.  z =
8390: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
83a0: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
83b0: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
83c0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30  eturn;.  for(i=0
83d0: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
83e0: 29 7b 0a 20 20 20 20 69 66 28 20 53 54 52 49 43  ){.    if( STRIC
83f0: 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d  MP(z, p->aCol[i]
8400: 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  .zName) ){.     
8410: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8420: 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63  (pParse, "duplic
8430: 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ate column name:
8440: 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20   %s", z);.      
8450: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
8460: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , z);.      retu
8470: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rn;.    }.  }.  
8480: 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30  if( (p->nCol & 0
8490: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f  x7)==0 ){.    Co
84a0: 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20  lumn *aNew;.    
84b0: 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  aNew = sqlite3Db
84c0: 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43  Realloc(db,p->aC
84d0: 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73  ol,(p->nCol+8)*s
84e0: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
84f0: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77  ));.    if( aNew
8500: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
8510: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
8520: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
8530: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43  .    }.    p->aC
8540: 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20  ol = aNew;.  }. 
8550: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
8560: 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d  [p->nCol];.  mem
8570: 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a  set(pCol, 0, siz
8580: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
8590: 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20  ;.  pCol->zName 
85a0: 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74  = z;. .  /* If t
85b0: 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20  here is no type 
85c0: 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d  specified, colum
85d0: 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61  ns have the defa
85e0: 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a  ult affinity.  *
85f0: 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65  * 'NONE'. If the
8600: 72 65 20 69 73 20 61 20 74 79 70 65 20 73 70 65  re is a type spe
8610: 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c  cified, then sql
8620: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
8630: 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  e() will.  ** be
8640: 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20   called next to 
8650: 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  set pCol->affini
8660: 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20  ty correctly..  
8670: 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  */.  pCol->affin
8680: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
8690: 5f 4e 4f 4e 45 3b 0a 20 20 70 43 6f 6c 2d 3e 73  _NONE;.  pCol->s
86a0: 7a 45 73 74 20 3d 20 31 3b 0a 20 20 70 2d 3e 6e  zEst = 1;.  p->n
86b0: 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Col++;.}../*.** 
86c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
86d0: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
86e0: 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68  rser while in th
86f0: 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70  e middle of.** p
8700: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
8710: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
8720: 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63    A "NOT NULL" c
8730: 6f 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a  onstraint has.**
8740: 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20   been seen on a 
8750: 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f  column.  This ro
8760: 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e  utine sets the n
8770: 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a  otNull flag on.*
8780: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72  * the column cur
8790: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
87a0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
87b0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74  id sqlite3AddNot
87c0: 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72  Null(Parse *pPar
87d0: 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29  se, int onError)
87e0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
87f0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
8800: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d  Table;.  if( p==
8810: 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43  0 || NEVER(p->nC
8820: 6f 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a  ol<1) ) return;.
8830: 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f    p->aCol[p->nCo
8840: 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28  l-1].notNull = (
8850: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f  u8)onError;.}../
8860: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f  *.** Scan the co
8870: 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a  lumn type name z
8880: 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79  Type (length nTy
8890: 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74  pe) and return t
88a0: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
88b0: 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a   affinity type..
88c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
88d0: 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69  ne does a case-i
88e0: 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63  ndependent searc
88f0: 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74  h of zType for t
8900: 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67  he .** substring
8910: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
8920: 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65  ng table. If one
8930: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
8940: 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20  gs is.** found, 
8950: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
8960: 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65  g affinity is re
8970: 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65  turned. If zType
8980: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72   contains.** mor
8990: 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68  e than one of th
89a0: 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e  e substrings, en
89b0: 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65  tries toward the
89c0: 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20   top of .** the 
89d0: 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72  table take prior
89e0: 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ity. For example
89f0: 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42  , if zType is 'B
8a00: 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c  LOBINT', .** SQL
8a10: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
8a20: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
8a30: 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20  ** Substring    
8a40: 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d   | Affinity.** -
8a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8a70: 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20  ** 'INT'        
8a80: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   | SQLITE_AFF_IN
8a90: 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20  TEGER.** 'CHAR' 
8aa0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8ab0: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f  AFF_TEXT.** 'CLO
8ac0: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
8ad0: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
8ae0: 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53  TEXT'        | S
8af0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
8b00: 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'BLOB'        
8b10: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  | SQLITE_AFF_NON
8b20: 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20  E.** 'REAL'     
8b30: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
8b40: 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20  REAL.** 'FLOA'  
8b50: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
8b60: 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42  FF_REAL.** 'DOUB
8b70: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
8b80: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a  E_AFF_REAL.**.**
8b90: 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
8ba0: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
8bb0: 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72  e above table ar
8bc0: 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49  e found,.** SQLI
8bd0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69  TE_AFF_NUMERIC i
8be0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63  s returned..*/.c
8bf0: 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e  har sqlite3Affin
8c00: 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68  ityType(const ch
8c10: 61 72 20 2a 7a 49 6e 2c 20 75 38 20 2a 70 73 7a  ar *zIn, u8 *psz
8c20: 45 73 74 29 7b 0a 20 20 75 33 32 20 68 20 3d 20  Est){.  u32 h = 
8c30: 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20  0;.  char aff = 
8c40: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
8c50: 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  IC;.  const char
8c60: 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20   *zChar = 0;..  
8c70: 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74  if( zIn==0 ) ret
8c80: 75 72 6e 20 61 66 66 3b 0a 20 20 77 68 69 6c 65  urn aff;.  while
8c90: 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20  ( zIn[0] ){.    
8ca0: 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c  h = (h<<8) + sql
8cb0: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
8cc0: 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20  [(*zIn)&0xff];. 
8cd0: 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66     zIn++;.    if
8ce0: 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b  ( h==(('c'<<24)+
8cf0: 28 27 68 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('h'<<16)+('a'<<
8d00: 38 29 2b 27 72 27 29 20 29 7b 20 20 20 20 20 20  8)+'r') ){      
8d10: 20 20 20 20 20 20 20 2f 2a 20 43 48 41 52 20 2a         /* CHAR *
8d20: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
8d30: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
8d40: 20 20 20 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e       zChar = zIn
8d50: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8d60: 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27  h==(('c'<<24)+('
8d70: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
8d80: 2b 27 62 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'b') ){       /
8d90: 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * CLOB */.      
8da0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
8db0: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
8dc0: 20 69 66 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32   if( h==(('t'<<2
8dd0: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 78  4)+('e'<<16)+('x
8de0: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
8df0: 20 20 20 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20      /* TEXT */. 
8e00: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
8e10: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
8e20: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
8e30: 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  b'<<24)+('l'<<16
8e40: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
8e50: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42           /* BLOB
8e60: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 28   */.        && (
8e70: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
8e80: 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d  NUMERIC || aff==
8e90: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 29  SQLITE_AFF_REAL)
8ea0: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
8eb0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
8ec0: 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 5b 30  .      if( zIn[0
8ed0: 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61 72 20 3d  ]=='(' ) zChar =
8ee0: 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51   zIn;.#ifndef SQ
8ef0: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
8f00: 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c  NG_POINT.    }el
8f10: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c  se if( h==(('r'<
8f20: 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28  <24)+('e'<<16)+(
8f30: 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20  'a'<<8)+'l')    
8f40: 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f        /* REAL */
8f50: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
8f60: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
8f70: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
8f80: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
8f90: 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  AL;.    }else if
8fa0: 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b  ( h==(('f'<<24)+
8fb0: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
8fc0: 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20 20  8)+'a')         
8fd0: 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20   /* FLOA */.    
8fe0: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
8ff0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
9000: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
9010: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
9020: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9030: 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c  (('d'<<24)+('o'<
9040: 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62  <16)+('u'<<8)+'b
9050: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ')          /* D
9060: 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  OUB */.        &
9070: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
9080: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
9090: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
90a0: 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66  AFF_REAL;.#endif
90b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
90c0: 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28  h&0x00FFFFFF)==(
90d0: 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c  ('i'<<16)+('n'<<
90e0: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a  8)+'t') ){    /*
90f0: 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66   INT */.      af
9100: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  f = SQLITE_AFF_I
9110: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72  NTEGER;.      br
9120: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
9130: 20 20 2f 2a 20 49 66 20 70 73 7a 45 73 74 20 69    /* If pszEst i
9140: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72  s not NULL, stor
9150: 65 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  e an estimate of
9160: 20 74 68 65 20 66 69 65 6c 64 20 73 69 7a 65 2e   the field size.
9170: 20 20 54 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d    The.  ** estim
9180: 61 74 65 20 69 73 20 73 63 61 6c 65 64 20 73 6f  ate is scaled so
9190: 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
91a0: 66 20 61 6e 20 69 6e 74 65 67 65 72 20 69 73 20  f an integer is 
91b0: 31 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 73 7a  1.  */.  if( psz
91c0: 45 73 74 20 29 7b 0a 20 20 20 20 2a 70 73 7a 45  Est ){.    *pszE
91d0: 73 74 20 3d 20 31 3b 20 20 20 2f 2a 20 64 65 66  st = 1;   /* def
91e0: 61 75 6c 74 20 73 69 7a 65 20 69 73 20 61 70 70  ault size is app
91f0: 72 6f 78 20 34 20 62 79 74 65 73 20 2a 2f 0a 20  rox 4 bytes */. 
9200: 20 20 20 69 66 28 20 61 66 66 3c 3d 53 51 4c 49     if( aff<=SQLI
9210: 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
9220: 20 20 20 20 20 69 66 28 20 7a 43 68 61 72 20 29       if( zChar )
9230: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
9240: 20 7a 43 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20   zChar[0] ){.   
9250: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
9260: 65 33 49 73 64 69 67 69 74 28 7a 43 68 61 72 5b  e3Isdigit(zChar[
9270: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0]) ){.         
9280: 20 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20     int v = 0;.  
9290: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
92a0: 33 47 65 74 49 6e 74 33 32 28 7a 43 68 61 72 2c  3GetInt32(zChar,
92b0: 20 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &v);.          
92c0: 20 20 76 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20    v = v/4 + 1;. 
92d0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76             if( v
92e0: 3e 32 35 35 20 29 20 76 20 3d 20 32 35 35 3b 0a  >255 ) v = 255;.
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 73 7a              *psz
9300: 45 73 74 20 3d 20 76 3b 20 2f 2a 20 42 4c 4f 42  Est = v; /* BLOB
9310: 28 6b 29 2c 20 56 41 52 43 48 41 52 28 6b 29 2c  (k), VARCHAR(k),
9320: 20 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d 28 6b   CHAR(k) -> r=(k
9330: 2f 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20 20  /4+1) */.       
9340: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9350: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9360: 20 20 7a 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20    zChar++;.     
9370: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
9380: 7b 0a 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73  {.        *pszEs
9390: 74 20 3d 20 35 3b 20 20 20 2f 2a 20 42 4c 4f 42  t = 5;   /* BLOB
93a0: 2c 20 54 45 58 54 2c 20 43 4c 4f 42 20 2d 3e 20  , TEXT, CLOB -> 
93b0: 72 3d 35 20 20 28 61 70 70 72 6f 78 20 32 30 20  r=5  (approx 20 
93c0: 62 79 74 65 73 29 2a 2f 0a 20 20 20 20 20 20 7d  bytes)*/.      }
93d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
93e0: 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn aff;.}../*.*
93f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9400: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
9410: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
9420: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
9430: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
9440: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
9450: 74 2e 20 20 54 68 65 20 70 46 69 72 73 74 20 74  t.  The pFirst t
9460: 6f 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72 73  oken is the firs
9470: 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68  t.** token in th
9480: 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f  e sequence of to
9490: 6b 65 6e 73 20 74 68 61 74 20 64 65 73 63 72 69  kens that descri
94a0: 62 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 74  be the type of t
94b0: 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72  he.** column cur
94c0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
94d0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61  struction.   pLa
94e0: 73 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 74  st is the last t
94f0: 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73  oken.** in the s
9500: 65 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68  equence.  Use th
9510: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  is information t
9520: 6f 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74  o construct a st
9530: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e  ring.** that con
9540: 74 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61  tains the typena
9550: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
9560: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20   and store that 
9570: 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79  string.** in zTy
9580: 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c  pe..*/ .void sql
9590: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
95a0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
95b0: 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a   Token *pType){.
95c0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f    Table *p;.  Co
95d0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 70  lumn *pCol;..  p
95e0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
95f0: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
9600: 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f   || NEVER(p->nCo
9610: 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  l<1) ) return;. 
9620: 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c   pCol = &p->aCol
9630: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 61  [p->nCol-1];.  a
9640: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79  ssert( pCol->zTy
9650: 70 65 3d 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 2d  pe==0 );.  pCol-
9660: 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  >zType = sqlite3
9670: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
9680: 61 72 73 65 2d 3e 64 62 2c 20 70 54 79 70 65 29  arse->db, pType)
9690: 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  ;.  pCol->affini
96a0: 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69  ty = sqlite3Affi
96b0: 6e 69 74 79 54 79 70 65 28 70 43 6f 6c 2d 3e 7a  nityType(pCol->z
96c0: 54 79 70 65 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45  Type, &pCol->szE
96d0: 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  st);.}../*.** Th
96e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
96f0: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
9700: 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72  e for the most r
9710: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f  ecently added co
9720: 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74  lumn.** of the t
9730: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
9740: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
9750: 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74  n..**.** Default
9760: 20 76 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f   value expressio
9770: 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74  ns must be const
9780: 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65  ant.  Raise an e
9790: 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73  xception if this
97a0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63  .** is not the c
97b0: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
97c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
97d0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
97e0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
97f0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
9800: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
9810: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76   statement..*/.v
9820: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 44 65  oid sqlite3AddDe
9830: 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65  faultValue(Parse
9840: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 53 70   *pParse, ExprSp
9850: 61 6e 20 2a 70 53 70 61 6e 29 7b 0a 20 20 54 61  an *pSpan){.  Ta
9860: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
9870: 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65   *pCol;.  sqlite
9880: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
9890: 64 62 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65  db;.  p = pParse
98a0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
98b0: 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 70  f( p!=0 ){.    p
98c0: 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b  Col = &(p->aCol[
98d0: 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20  p->nCol-1]);.   
98e0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
98f0: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
9900: 63 74 69 6f 6e 28 70 53 70 61 6e 2d 3e 70 45 78  ction(pSpan->pEx
9910: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
9920: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
9930: 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61  rse, "default va
9940: 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25  lue of column [%
9950: 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  s] is not consta
9960: 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  nt",.          p
9970: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
9980: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
9990: 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72   A copy of pExpr
99a0: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
99b0: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
99c0: 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61  , as pExpr conta
99d0: 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b  ins.      ** tok
99e0: 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ens that point t
99f0: 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72  o volatile memor
9a00: 79 2e 20 54 68 65 20 27 73 70 61 6e 27 20 6f 66  y. The 'span' of
9a10: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
9a20: 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
9a30: 69 72 65 64 20 62 79 20 70 72 61 67 6d 61 20 74  ired by pragma t
9a40: 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20 20 20  able_info..     
9a50: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
9a60: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
9a70: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
9a80: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
9a90: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
9aa0: 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70  (db, pSpan->pExp
9ab0: 72 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  r, EXPRDUP_REDUC
9ac0: 45 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  E);.      sqlite
9ad0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
9ae0: 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->zDflt);.      
9af0: 70 43 6f 6c 2d 3e 7a 44 66 6c 74 20 3d 20 73 71  pCol->zDflt = sq
9b00: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64  lite3DbStrNDup(d
9b10: 62 2c 20 28 63 68 61 72 2a 29 70 53 70 61 6e 2d  b, (char*)pSpan-
9b20: 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20 20 20 20  >zStart,.       
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
9b50: 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45 6e 64 20  nt)(pSpan->zEnd 
9b60: 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 29  - pSpan->zStart)
9b70: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
9b80: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
9b90: 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70 45 78 70  (db, pSpan->pExp
9ba0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  r);.}../*.** Des
9bb0: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
9bc0: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
9bd0: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
9be0: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
9bf0: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
9c00: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
9c10: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
9c20: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
9c30: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
9c40: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
9c50: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
9c60: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
9c70: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
9c80: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
9c90: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
9ca0: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
9cb0: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
9cc0: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
9cd0: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
9ce0: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
9cf0: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
9d00: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
9d10: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
9d20: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
9d30: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
9d40: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
9d50: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
9d60: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
9d70: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
9d80: 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65  s the rowid.  Se
9d90: 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65  t the Table.iPKe
9da0: 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  y.** field of th
9db0: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
9dc0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
9dd0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
9de0: 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
9df0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e  MARY KEY column.
9e00: 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73    Table.iPKey is
9e10: 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68   set to -1 if th
9e20: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54  ere is.** no INT
9e30: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
9e40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b  ..**.** If the k
9e50: 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54  ey is not an INT
9e60: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
9e70: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
9e80: 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20  unique.** index 
9e90: 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f  for the key.  No
9ea0: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
9eb0: 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52  d for INTEGER PR
9ec0: 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76  IMARY KEYs..*/.v
9ed0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72  oid sqlite3AddPr
9ee0: 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73  imaryKey(.  Pars
9ef0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
9f00: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
9f10: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
9f20: 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  pList,  /* List 
9f30: 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74  of field names t
9f40: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
9f50: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
9f60: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
9f70: 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e  o with a uniquen
9f80: 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ess conflict */.
9f90: 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20    int autoInc,  
9fa0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
9fb0: 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  he AUTOINCREMENT
9fc0: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
9fd0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
9fe0: 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51  tOrder     /* SQ
9ff0: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53  LITE_SO_ASC or S
a000: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f  QLITE_SO_DESC */
a010: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
a020: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
a030: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
a040: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
a050: 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20  iCol = -1, i;.  
a060: 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28  int nTerm;.  if(
a070: 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44   pTab==0 || IN_D
a080: 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f  ECLARE_VTAB ) go
a090: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
a0a0: 78 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d  xit;.  if( pTab-
a0b0: 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48  >tabFlags & TF_H
a0c0: 61 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a  asPrimaryKey ){.
a0d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
a0e0: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
a0f0: 20 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22     "table \"%s\"
a100: 20 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f   has more than o
a110: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c  ne primary key",
a120: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
a130: 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f     goto primary_
a140: 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20  key_exit;.  }.  
a150: 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c  pTab->tabFlags |
a160: 3d 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b  = TF_HasPrimaryK
a170: 65 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  ey;.  if( pList=
a180: 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  =0 ){.    iCol =
a190: 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b   pTab->nCol - 1;
a1a0: 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  .    pTab->aCol[
a1b0: 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c  iCol].colFlags |
a1c0: 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  = COLFLAG_PRIMKE
a1d0: 59 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70  Y;.    zType = p
a1e0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
a1f0: 7a 54 79 70 65 3b 0a 20 20 20 20 6e 54 65 72 6d  zType;.    nTerm
a200: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
a210: 20 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74     nTerm = pList
a220: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72  ->nExpr;.    for
a230: 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69  (i=0; i<nTerm; i
a240: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ++){.      for(i
a250: 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62  Col=0; iCol<pTab
a260: 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  ->nCol; iCol++){
a270: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
a280: 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
a290: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70  t->a[i].zName, p
a2a0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
a2b0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
a2c0: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
a2d0: 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73  l[iCol].colFlags
a2e0: 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d   |= COLFLAG_PRIM
a2f0: 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  KEY;.          z
a300: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
a310: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
a320: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a330: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a340: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  }.    }.  }.  if
a350: 28 20 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26  ( nTerm==1.   &&
a360: 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74 65   zType && sqlite
a370: 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20  3StrICmp(zType, 
a380: 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20  "INTEGER")==0.  
a390: 20 26 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53   && sortOrder==S
a3a0: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 0a 20 20 29  QLITE_SO_ASC.  )
a3b0: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  {.    pTab->iPKe
a3c0: 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54  y = iCol;.    pT
a3d0: 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75  ab->keyConf = (u
a3e0: 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61  8)onError;.    a
a3f0: 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d  ssert( autoInc==
a400: 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20  0 || autoInc==1 
a410: 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62  );.    pTab->tab
a420: 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63  Flags |= autoInc
a430: 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e  *TF_Autoincremen
a440: 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  t;.    if( pList
a450: 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f   ) pParse->iPkSo
a460: 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 2d  rtOrder = pList-
a470: 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[0].sortOrder;
a480: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74  .  }else if( aut
a490: 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20  oInc ){.#ifndef 
a4a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
a4b0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71  INCREMENT.    sq
a4c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
a4d0: 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45  arse, "AUTOINCRE
a4e0: 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c  MENT is only all
a4f0: 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20  owed on an ".   
a500: 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49      "INTEGER PRI
a510: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64  MARY KEY");.#end
a520: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
a530: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
a540: 2d 3e 70 56 64 62 65 3b 0a 20 20 20 20 49 6e 64  ->pVdbe;.    Ind
a550: 65 78 20 2a 70 3b 0a 20 20 20 20 69 66 28 20 76  ex *p;.    if( v
a560: 20 29 20 70 50 61 72 73 65 2d 3e 61 64 64 72 53   ) pParse->addrS
a570: 6b 69 70 50 4b 20 3d 20 73 71 6c 69 74 65 33 56  kipPK = sqlite3V
a580: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
a590: 4e 6f 6f 70 29 3b 0a 20 20 20 20 70 20 3d 20 73  Noop);.    p = s
a5a0: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
a5b0: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
a5c0: 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f  0, pList, onErro
a5d0: 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  r, 0,.          
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5f0: 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30   0, sortOrder, 0
a600: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
a610: 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 49 6e 64        p->autoInd
a620: 65 78 20 3d 20 32 3b 0a 20 20 20 20 20 20 69 66  ex = 2;.      if
a630: 28 20 76 20 29 20 73 71 6c 69 74 65 33 56 64 62  ( v ) sqlite3Vdb
a640: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 50 61  eJumpHere(v, pPa
a650: 72 73 65 2d 3e 61 64 64 72 53 6b 69 70 50 4b 29  rse->addrSkipPK)
a660: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
a670: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d  t = 0;.  }..prim
a680: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20  ary_key_exit:.  
a690: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
a6a0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
a6b0: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  , pList);.  retu
a6c0: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rn;.}../*.** Add
a6d0: 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e   a new CHECK con
a6e0: 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74  straint to the t
a6f0: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
a700: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
a710: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
a720: 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72  e3AddCheckConstr
a730: 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
a740: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
a750: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
a760: 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78    Expr *pCheckEx
a770: 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b  pr  /* The check
a780: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
a790: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
a7a0: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61  _OMIT_CHECK.  Ta
a7b0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
a7c0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
a7d0: 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49 4e   if( pTab && !IN
a7e0: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b  _DECLARE_VTAB ){
a7f0: 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63  .    pTab->pChec
a800: 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  k = sqlite3ExprL
a810: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
a820: 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20  , pTab->pCheck, 
a830: 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20  pCheckExpr);.   
a840: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e   if( pParse->con
a850: 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b  straintName.n ){
a860: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
a870: 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
a880: 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65  arse, pTab->pChe
a890: 63 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e  ck, &pParse->con
a8a0: 73 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b  straintName, 1);
a8b0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
a8c0: 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71  endif.  {.    sq
a8d0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
a8e0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65  pParse->db, pChe
a8f0: 63 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  ckExpr);.  }.}..
a900: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
a910: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
a920: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
a930: 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62  ently parsed tab
a940: 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20  le column.** to 
a950: 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65  the CollSeq give
a960: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
a970: 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65  e3AddCollateType
a980: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
a990: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
a9a0: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
a9b0: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  t i;.  char *zCo
a9c0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
a9d0: 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d   /* Dequoted nam
a9e0: 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  e of collation s
a9f0: 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c  equence */.  sql
aa00: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
aa10: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
aa20: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
aa30: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
aa40: 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50  Col-1;.  db = pP
aa50: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c  arse->db;.  zCol
aa60: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
aa70: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f  romToken(db, pTo
aa80: 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f  ken);.  if( !zCo
aa90: 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  ll ) return;..  
aaa0: 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  if( sqlite3Locat
aab0: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
aac0: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49   zColl) ){.    I
aad0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
aae0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
aaf0: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  , p->aCol[i].zCo
ab00: 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c  ll);.    p->aCol
ab10: 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c  [i].zColl = zCol
ab20: 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  l;.  .    /* If 
ab30: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65  the column is de
ab40: 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65  clared as "<name
ab50: 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f  > PRIMARY KEY CO
ab60: 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20  LLATE <type>",. 
ab70: 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e     ** then an in
ab80: 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65  dex may have bee
ab90: 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69  n created on thi
aba0: 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20  s column before 
abb0: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61  the.    ** colla
abc0: 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64  tion type was ad
abd0: 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69  ded. Correct thi
abe0: 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63  s if it is the c
abf0: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
ac00: 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64  for(pIdx=p->pInd
ac10: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
ac20: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
ac30: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
ac40: 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20  >nKeyCol==1 );. 
ac50: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
ac60: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b  iColumn[0]==i ){
ac70: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
ac80: 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43  zColl[0] = p->aC
ac90: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[i].zColl;.   
aca0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
acb0: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  se{.    sqlite3D
acc0: 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
acd0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
ace0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
acf0: 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  urns the collati
ad00: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
ad10: 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20  database native 
ad20: 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67  text.** encoding
ad30: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
ad40: 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c  he string zName,
ad50: 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a   length nName..*
ad60: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
ad70: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ested collation 
ad80: 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20  sequence is not 
ad90: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f  available, or no
ada0: 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69  t available.** i
adb0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  n the database n
adc0: 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20  ative encoding, 
add0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
ade0: 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64  ctory is invoked
adf0: 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69   to.** request i
ae00: 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  t. If the collat
ae10: 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73  ion factory does
ae20: 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68   not supply such
ae30: 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20   a sequence,.** 
ae40: 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65  and the sequence
ae50: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
ae60: 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e   another text en
ae70: 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61  coding, then tha
ae80: 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  t is.** returned
ae90: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
aea0: 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f  If no versions o
aeb0: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
aec0: 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65  collations seque
aed0: 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c  nce are availabl
aee0: 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72  e, or.** another
aef0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
af00: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
af10: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
af20: 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74  sage written int
af30: 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  o.** pParse..**.
af40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
af50: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
af60: 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43  und sqlite3FindC
af70: 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20  ollSeq().  This 
af80: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b  routine.** invok
af90: 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
afa0: 20 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20   factory if the 
afb0: 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  named collation 
afc0: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a  cannot be found.
afd0: 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73  ** and generates
afe0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
aff0: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
b000: 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  o: sqlite3FindCo
b010: 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33  llSeq(), sqlite3
b020: 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a  GetCollSeq().*/.
b030: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
b040: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61  LocateCollSeq(Pa
b050: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
b060: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
b070: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
b080: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75   pParse->db;.  u
b090: 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
b0a0: 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d  .  u8 initbusy =
b0b0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a   db->init.busy;.
b0c0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
b0d0: 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  ;..  pColl = sql
b0e0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
b0f0: 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20  db, enc, zName, 
b100: 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28  initbusy);.  if(
b110: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
b120: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
b130: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43  >xCmp) ){.    pC
b140: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
b150: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
b160: 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d  enc, pColl, zNam
b170: 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  e);.  }..  retur
b180: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pColl;.}.../*.
b190: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
b1a0: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65   that will incre
b1b0: 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
b1c0: 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cookie..**.** Th
b1d0: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
b1e0: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
b1f0: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
b200: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
b210: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
b220: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
b230: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
b240: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
b250: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
b260: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
b270: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
b280: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
b290: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
b2a0: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
b2b0: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
b2c0: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
b2d0: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
b2e0: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
b2f0: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
b300: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
b310: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
b320: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
b330: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
b340: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
b350: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
b360: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
b370: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
b380: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
b390: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
b3a0: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
b3b0: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
b3c0: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
b3d0: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
b3e0: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
b3f0: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
b400: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
b410: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
b420: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
b430: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
b440: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
b450: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
b460: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
b470: 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50  Cookie(Parse *pP
b480: 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
b490: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
b4a0: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
b4b0: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  rse);.  sqlite3 
b4c0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
b4d0: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
b4e0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
b4f0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
b500: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
b510: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 73  , iDb, 0) );.  s
b520: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b530: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
b540: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
b550: 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
b560: 6b 69 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71  kie+1, r1);.  sq
b570: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b580: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
b590: 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45   iDb, BTREE_SCHE
b5a0: 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 72 31 29 3b  MA_VERSION, r1);
b5b0: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
b5c0: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
b5d0: 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   r1);.}../*.** M
b5e0: 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65  easure the numbe
b5f0: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
b600: 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74  needed to output
b610: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64   the given.** id
b620: 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e  entifier.  The n
b630: 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69  umber returned i
b640: 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74  ncludes any quot
b650: 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64  es used.** but d
b660: 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20  oes not include 
b670: 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61  the null termina
b680: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  tor..**.** The e
b690: 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65  stimate is conse
b6a0: 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67  rvative.  It mig
b6b0: 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
b6c0: 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61  t what is.** rea
b6d0: 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  lly needed..*/.s
b6e0: 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c  tatic int identL
b6f0: 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72  ength(const char
b700: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *z){.  int n;. 
b710: 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b   for(n=0; *z; n+
b720: 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, z++){.    if(
b730: 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b   *z=='"' ){ n++;
b740: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
b750: 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n + 2;.}../*.** 
b760: 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  The first parame
b770: 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
b780: 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75   to an output bu
b790: 66 66 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64  ffer. The second
b7a0: 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69   .** parameter i
b7b0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
b7c0: 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 63  n integer that c
b7d0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73  ontains the offs
b7e0: 65 74 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74  et at.** which t
b7f0: 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65  o write into the
b800: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20   output buffer. 
b810: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
b820: 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d  pies the.** nul-
b830: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
b840: 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  g pointed to by 
b850: 74 68 65 20 74 68 69 72 64 20 70 61 72 61 6d 65  the third parame
b860: 74 65 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e  ter, zSignedIden
b870: 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65  t,.** to the spe
b880: 63 69 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e  cified offset in
b890: 20 74 68 65 20 62 75 66 66 65 72 20 61 6e 64 20   the buffer and 
b8a0: 75 70 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f  updates *pIdx to
b8b0: 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65   refer.** to the
b8c0: 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65   first byte afte
b8d0: 72 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  r the last byte 
b8e0: 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72  written before r
b8f0: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a  eturning..** .**
b900: 20 49 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a   If the string z
b910: 53 69 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73  SignedIdent cons
b920: 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
b930: 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a   alpha-numeric.*
b940: 2a 20 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f  * characters, do
b950: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
b960: 68 20 61 20 64 69 67 69 74 20 61 6e 64 20 69 73  h a digit and is
b970: 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77   not an SQL keyw
b980: 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20  ord,.** then it 
b990: 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65  is copied to the
b9a0: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 65   output buffer e
b9b0: 78 61 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e  xactly as it is.
b9c0: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69   Otherwise,.** i
b9d0: 74 20 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e  t is quoted usin
b9e0: 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e  g double-quotes.
b9f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ba00: 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a  identPut(char *z
ba10: 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61  , int *pIdx, cha
ba20: 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29  r *zSignedIdent)
ba30: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
ba40: 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73  r *zIdent = (uns
ba50: 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67  igned char*)zSig
ba60: 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20  nedIdent;.  int 
ba70: 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b  i, j, needQuote;
ba80: 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20  .  i = *pIdx;.. 
ba90: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
baa0: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  [j]; j++){.    i
bab0: 66 28 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e  f( !sqlite3Isaln
bac0: 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26  um(zIdent[j]) &&
bad0: 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20   zIdent[j]!='_' 
bae0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e  ) break;.  }.  n
baf0: 65 65 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74  eedQuote = sqlit
bb00: 65 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74  e3Isdigit(zIdent
bb10: 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20  [0]).           
bb20: 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f   || sqlite3Keywo
bb30: 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a  rdCode(zIdent, j
bb40: 29 21 3d 54 4b 5f 49 44 0a 20 20 20 20 20 20 20  )!=TK_ID.       
bb50: 20 20 20 20 20 7c 7c 20 7a 49 64 65 6e 74 5b 6a       || zIdent[j
bb60: 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  ]!=0.           
bb70: 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20 69 66 28   || j==0;..  if(
bb80: 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69   needQuote ) z[i
bb90: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72  ++] = '"';.  for
bba0: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
bbb0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b   j++){.    z[i++
bbc0: 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20  ] = zIdent[j];. 
bbd0: 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d     if( zIdent[j]
bbe0: 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d  =='"' ) z[i++] =
bbf0: 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20   '"';.  }.  if( 
bc00: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
bc10: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d  +] = '"';.  z[i]
bc20: 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20   = 0;.  *pIdx = 
bc30: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  i;.}../*.** Gene
bc40: 72 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41  rate a CREATE TA
bc50: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70  BLE statement ap
bc60: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
bc70: 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65  e given.** table
bc80: 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c  .  Memory to hol
bc90: 64 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  d the text of th
bca0: 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f  e statement is o
bcb0: 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20  btained.** from 
bcc0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
bcd0: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
bce0: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
bcf0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
bd00: 74 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65  tic char *create
bd10: 54 61 62 6c 65 53 74 6d 74 28 73 71 6c 69 74 65  TableStmt(sqlite
bd20: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29  3 *db, Table *p)
bd30: 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b  {.  int i, k, n;
bd40: 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a  .  char *zStmt;.
bd50: 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a    char *zSep, *z
bd60: 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43  Sep2, *zEnd;.  C
bd70: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e  olumn *pCol;.  n
bd80: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   = 0;.  for(pCol
bd90: 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b   = p->aCol, i=0;
bda0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c   i<p->nCol; i++,
bdb0: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20   pCol++){.    n 
bdc0: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
bdd0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b  Col->zName) + 5;
bde0: 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e  .  }.  n += iden
bdf0: 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65  tLength(p->zName
be00: 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b  );.  if( n<50 ){
be10: 20 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b   .    zSep = "";
be20: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22  .    zSep2 = ","
be30: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22  ;.    zEnd = ")"
be40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
be50: 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20  Sep = "\n  ";.  
be60: 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20    zSep2 = ",\n  
be70: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c  ";.    zEnd = "\
be80: 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  n)";.  }.  n += 
be90: 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a  35 + 6*p->nCol;.
bea0: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
beb0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20  3DbMallocRaw(0, 
bec0: 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d  n);.  if( zStmt=
bed0: 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  =0 ){.    db->ma
bee0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
bef0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bf00: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  }.  sqlite3_snpr
bf10: 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22  intf(n, zStmt, "
bf20: 43 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b  CREATE TABLE ");
bf30: 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 53 74  .  k = sqlite3St
bf40: 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20  rlen30(zStmt);. 
bf50: 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c   identPut(zStmt,
bf60: 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a   &k, p->zName);.
bf70: 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27    zStmt[k++] = '
bf80: 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70  (';.  for(pCol=p
bf90: 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70  ->aCol, i=0; i<p
bfa0: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f  ->nCol; i++, pCo
bfb0: 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63  l++){.    static
bfc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f   const char * co
bfd0: 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b  nst azType[] = {
bfe0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
bff0: 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a  TE_AFF_TEXT    *
c000: 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20  / " TEXT",.     
c010: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
c020: 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20 22 22 2c 0a  _NONE    */ "",.
c030: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
c040: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f  E_AFF_NUMERIC */
c050: 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20   " NUM",.       
c060: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49   /* SQLITE_AFF_I
c070: 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e 54 22  NTEGER */ " INT"
c080: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
c090: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20  ITE_AFF_REAL    
c0a0: 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20 20 7d  */ " REAL".    }
c0b0: 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  ;.    int len;. 
c0c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c0d0: 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74  Type;..    sqlit
c0e0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c  e3_snprintf(n-k,
c0f0: 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70   &zStmt[k], zSep
c100: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69  );.    k += sqli
c110: 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 53 74  te3Strlen30(&zSt
c120: 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70  mt[k]);.    zSep
c130: 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64   = zSep2;.    id
c140: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
c150: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCol->zName);.
c160: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c      assert( pCol
c170: 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54  ->affinity-SQLIT
c180: 45 5f 41 46 46 5f 54 45 58 54 20 3e 3d 20 30 20  E_AFF_TEXT >= 0 
c190: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
c1a0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51  Col->affinity-SQ
c1b0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3c 20  LITE_AFF_TEXT < 
c1c0: 41 72 72 61 79 53 69 7a 65 28 61 7a 54 79 70 65  ArraySize(azType
c1d0: 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  ) );.    testcas
c1e0: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
c1f0: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  y==SQLITE_AFF_TE
c200: 58 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  XT );.    testca
c210: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
c220: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ty==SQLITE_AFF_N
c230: 4f 4e 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ONE );.    testc
c240: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
c250: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
c260: 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74  NUMERIC );.    t
c270: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
c280: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
c290: 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20  AFF_INTEGER );. 
c2a0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
c2b0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
c2c0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a  ITE_AFF_REAL );.
c2d0: 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d      .    zType =
c2e0: 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66   azType[pCol->af
c2f0: 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f  finity - SQLITE_
c300: 41 46 46 5f 54 45 58 54 5d 3b 0a 20 20 20 20 6c  AFF_TEXT];.    l
c310: 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  en = sqlite3Strl
c320: 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20  en30(zType);.   
c330: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61   assert( pCol->a
c340: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
c350: 41 46 46 5f 4e 4f 4e 45 20 0a 20 20 20 20 20 20  AFF_NONE .      
c360: 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61        || pCol->a
c370: 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33  ffinity==sqlite3
c380: 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79  AffinityType(zTy
c390: 70 65 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 65  pe, 0) );.    me
c3a0: 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  mcpy(&zStmt[k], 
c3b0: 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20  zType, len);.   
c3c0: 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61   k += len;.    a
c3d0: 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20  ssert( k<=n );. 
c3e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70   }.  sqlite3_snp
c3f0: 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d  rintf(n-k, &zStm
c400: 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64  t[k], "%s", zEnd
c410: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d  );.  return zStm
c420: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69  t;.}../*.** Resi
c430: 7a 65 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65  ze an Index obje
c440: 63 74 20 74 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c  ct to hold N col
c450: 75 6d 6e 73 20 74 6f 74 61 6c 2e 20 20 52 65 74  umns total.  Ret
c460: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
c470: 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
c480: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20  SQLITE_NOMEM on 
c490: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f  an OOM error..*/
c4a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 69  .static int resi
c4b0: 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 73 71  zeIndexObject(sq
c4c0: 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78  lite3 *db, Index
c4d0: 20 2a 70 49 64 78 2c 20 69 6e 74 20 4e 29 7b 0a   *pIdx, int N){.
c4e0: 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a    char *zExtra;.
c4f0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69    int nByte;.  i
c500: 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
c510: 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c  >=N ) return SQL
c520: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
c530: 28 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65  ( pIdx->isResize
c540: 64 3d 3d 30 20 29 3b 0a 20 20 6e 42 79 74 65 20  d==0 );.  nByte 
c550: 3d 20 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  = (sizeof(char*)
c560: 20 2b 20 73 69 7a 65 6f 66 28 69 31 36 29 20 2b   + sizeof(i16) +
c570: 20 31 29 2a 4e 3b 0a 20 20 7a 45 78 74 72 61 20   1)*N;.  zExtra 
c580: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
c590: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
c5a0: 3b 0a 20 20 69 66 28 20 7a 45 78 74 72 61 3d 3d  ;.  if( zExtra==
c5b0: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
c5c0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70  E_NOMEM;.  memcp
c5d0: 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e  y(zExtra, pIdx->
c5e0: 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28 63  azColl, sizeof(c
c5f0: 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c  har*)*pIdx->nCol
c600: 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 7a  umn);.  pIdx->az
c610: 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 7a  Coll = (char**)z
c620: 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20  Extra;.  zExtra 
c630: 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  += sizeof(char*)
c640: 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  *N;.  memcpy(zEx
c650: 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c  tra, pIdx->aiCol
c660: 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36 29  umn, sizeof(i16)
c670: 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b  *pIdx->nColumn);
c680: 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  .  pIdx->aiColum
c690: 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72 61  n = (i16*)zExtra
c6a0: 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69  ;.  zExtra += si
c6b0: 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d  zeof(i16)*N;.  m
c6c0: 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49  emcpy(zExtra, pI
c6d0: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20  dx->aSortOrder, 
c6e0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
c6f0: 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64    pIdx->aSortOrd
c700: 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72 61  er = (u8*)zExtra
c710: 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ;.  pIdx->nColum
c720: 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69  n = N;.  pIdx->i
c730: 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20  sResized = 1;.  
c740: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
c750: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  ;.}../*.** Estim
c760: 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72 6f  ate the total ro
c770: 77 20 77 69 64 74 68 20 66 6f 72 20 61 20 74 61  w width for a ta
c780: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
c790: 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61 62 6c  oid estimateTabl
c7a0: 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70 54  eWidth(Table *pT
c7b0: 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ab){.  unsigned 
c7c0: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f  wTable = 0;.  co
c7d0: 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62  nst Column *pTab
c7e0: 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Col;.  int i;.  
c7f0: 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c  for(i=pTab->nCol
c800: 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e  , pTabCol=pTab->
c810: 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  aCol; i>0; i--, 
c820: 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  pTabCol++){.    
c830: 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f  wTable += pTabCo
c840: 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20  l->szEst;.  }.  
c850: 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c  if( pTab->iPKey<
c860: 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20  0 ) wTable++;.  
c870: 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d  pTab->szTabRow =
c880: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77   sqlite3LogEst(w
c890: 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a  Table*4);.}../*.
c8a0: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
c8b0: 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20  average size of 
c8c0: 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64  a row for an ind
c8d0: 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
c8e0: 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78  id estimateIndex
c8f0: 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49 64  Width(Index *pId
c900: 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77  x){.  unsigned w
c910: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74  Index = 0;.  int
c920: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75   i;.  const Colu
c930: 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d  mn *aCol = pIdx-
c940: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20  >pTable->aCol;. 
c950: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
c960: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
c970: 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70 49 64  .    i16 x = pId
c980: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a  x->aiColumn[i];.
c990: 20 20 20 20 61 73 73 65 72 74 28 20 78 3c 70 49      assert( x<pI
c9a0: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  dx->pTable->nCol
c9b0: 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20 2b   );.    wIndex +
c9c0: 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c  = x<0 ? 1 : aCol
c9d0: 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  [pIdx->aiColumn[
c9e0: 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20  i]].szEst;.  }. 
c9f0: 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20   pIdx->szIdxRow 
ca00: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  = sqlite3LogEst(
ca10: 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a  wIndex*4);.}../*
ca20: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
ca30: 76 61 6c 75 65 20 78 20 69 73 20 66 6f 75 6e 64  value x is found
ca40: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72 73   any of the firs
ca50: 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f  t nCol entries o
ca60: 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61  f aiCol[].*/.sta
ca70: 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d  tic int hasColum
ca80: 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69 43  n(const i16 *aiC
ca90: 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e  ol, int nCol, in
caa0: 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e  t x){.  while( n
cab0: 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28 20  Col-- > 0 ) if( 
cac0: 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20  x==*(aiCol++) ) 
cad0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
cae0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
caf0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
cb00: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 70   at the end of p
cb10: 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20  arsing a CREATE 
cb20: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
cb30: 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 20 57 49  that.** has a WI
cb40: 54 48 4f 55 54 20 52 4f 57 49 44 20 63 6c 61 75  THOUT ROWID clau
cb50: 73 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20  se.  The job of 
cb60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
cb70: 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74 68 0a  to convert both.
cb80: 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  ** internal sche
cb90: 6d 61 20 64 61 74 61 20 73 74 72 75 63 74 75 72  ma data structur
cba0: 65 73 20 61 6e 64 20 74 68 65 20 67 65 6e 65 72  es and the gener
cbb0: 61 74 65 64 20 56 44 42 45 20 63 6f 64 65 20 73  ated VDBE code s
cbc0: 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 61  o that they.** a
cbd0: 72 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  re appropriate f
cbe0: 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  or a WITHOUT ROW
cbf0: 49 44 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64  ID table instead
cc00: 20 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62 6c   of a rowid tabl
cc10: 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e  e..** Changes in
cc20: 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  clude:.**.**    
cc30: 20 28 31 29 20 20 43 6f 6e 76 65 72 74 20 74 68   (1)  Convert th
cc40: 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  e OP_CreateTable
cc50: 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 43 72 65 61   into an OP_Crea
cc60: 74 65 49 6e 64 65 78 2e 20 20 54 68 65 72 65 20  teIndex.  There 
cc70: 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 6e  is.**          n
cc80: 6f 20 72 6f 77 69 64 20 62 74 72 65 65 20 66 6f  o rowid btree fo
cc90: 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  r a WITHOUT ROWI
cca0: 44 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65  D.  Instead, the
ccb0: 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 20 20   canonical.**   
ccc0: 20 20 20 20 20 20 20 64 61 74 61 20 73 74 6f 72         data stor
ccd0: 61 67 65 20 69 73 20 61 20 63 6f 76 65 72 69 6e  age is a coverin
cce0: 67 20 69 6e 64 65 78 20 62 74 72 65 65 2e 0a 2a  g index btree..*
ccf0: 2a 20 20 20 20 20 28 32 29 20 20 42 79 70 61 73  *     (2)  Bypas
cd00: 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  s the creation o
cd10: 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  f the sqlite_mas
cd20: 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79 0a  ter table entry.
cd30: 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 20  **          for 
cd40: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
cd50: 61 73 20 74 68 65 20 74 68 65 20 70 72 69 6d 61  as the the prima
cd60: 72 79 20 6b 65 79 20 69 6e 64 65 78 20 69 73 20  ry key index is 
cd70: 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  now.**          
cd80: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
cd90: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
cda0: 74 61 62 6c 65 20 65 6e 74 72 79 20 6f 66 20 74  table entry of t
cdb0: 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e  he table itself.
cdc0: 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 53 65 74  .**     (3)  Set
cdd0: 20 74 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d 20   the Index.tnum 
cde0: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
cdf0: 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  EY Index object 
ce00: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
ce10: 20 20 20 73 63 68 65 6d 61 20 74 6f 20 74 68 65     schema to the
ce20: 20 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20 74   rootpage from t
ce30: 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a  he main table..*
ce40: 2a 20 20 20 20 20 28 34 29 20 20 53 65 74 20 61  *     (4)  Set a
ce50: 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  ll columns of th
ce60: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 73 63  e PRIMARY KEY sc
ce70: 68 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f 20 62  hema object to b
ce80: 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20  e NOT NULL..**  
ce90: 20 20 20 28 35 29 20 20 41 64 64 20 61 6c 6c 20     (5)  Add all 
cea0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f  table columns to
ceb0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
cec0: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 0a 2a 2a   Index object.**
ced0: 20 20 20 20 20 20 20 20 20 20 73 6f 20 74 68 61            so tha
cee0: 74 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  t the PRIMARY KE
cef0: 59 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20  Y is a covering 
cf00: 69 6e 64 65 78 2e 20 20 54 68 65 20 73 75 72 70  index.  The surp
cf10: 6c 75 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  lus.**          
cf20: 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61 72 74  columns are part
cf30: 20 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69   of KeyInfo.nXFi
cf40: 65 6c 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20  eld and are not 
cf50: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20  used for.**     
cf60: 20 20 20 20 20 73 6f 72 74 69 6e 67 20 6f 72 20       sorting or 
cf70: 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e 69 71 75 65  lookup or unique
cf80: 6e 65 73 73 20 63 68 65 63 6b 73 2e 0a 2a 2a 20  ness checks..** 
cf90: 20 20 20 20 28 36 29 20 20 52 65 70 6c 61 63 65      (6)  Replace
cfa0: 20 74 68 65 20 72 6f 77 69 64 20 74 61 69 6c 20   the rowid tail 
cfb0: 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d 61 74 69 63  on all automatic
cfc0: 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 20 55  ally generated U
cfd0: 4e 49 51 55 45 0a 2a 2a 20 20 20 20 20 20 20 20  NIQUE.**        
cfe0: 20 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 74    indices with t
cff0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  he PRIMARY KEY c
d000: 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  olumns..*/.stati
d010: 63 20 76 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f  c void convertTo
d020: 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c  WithoutRowidTabl
d030: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
d040: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20   Table *pTab){. 
d050: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
d060: 49 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e  Index *pPk;.  in
d070: 74 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20  t nPk;.  int i, 
d080: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  j;.  sqlite3 *db
d090: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
d0a0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
d0b0: 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20  e->pVdbe;..  /* 
d0c0: 43 6f 6e 76 65 72 74 20 74 68 65 20 4f 50 5f 43  Convert the OP_C
d0d0: 72 65 61 74 65 54 61 62 6c 65 20 6f 70 63 6f 64  reateTable opcod
d0e0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 6f 72  e that would nor
d0f0: 6d 61 6c 6c 79 20 63 72 65 61 74 65 20 74 68 65  mally create the
d100: 0a 20 20 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20  .  ** root-page 
d110: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 6e  for the table in
d120: 74 6f 20 61 20 4f 50 5f 43 72 65 61 74 65 49 6e  to a OP_CreateIn
d130: 64 65 78 20 6f 70 63 6f 64 65 2e 20 20 54 68 65  dex opcode.  The
d140: 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63 72 65 61   index.  ** crea
d150: 74 65 64 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  ted will become 
d160: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d170: 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66  index..  */.  if
d180: 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72  ( pParse->addrCr
d190: 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Tab ){.    asser
d1a0: 74 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69  t( v );.    sqli
d1b0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
d1c0: 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61  pParse->addrCrTa
d1d0: 62 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  b)->opcode = OP_
d1e0: 43 72 65 61 74 65 49 6e 64 65 78 3b 0a 20 20 7d  CreateIndex;.  }
d1f0: 0a 0a 20 20 2f 2a 20 42 79 70 61 73 73 20 74 68  ..  /* Bypass th
d200: 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68  e creation of th
d210: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 62 74  e PRIMARY KEY bt
d220: 72 65 65 20 61 6e 64 20 74 68 65 20 73 71 6c 69  ree and the sqli
d230: 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74  te_master.  ** t
d240: 61 62 6c 65 20 65 6e 74 72 79 2e 0a 20 20 2a 2f  able entry..  */
d250: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61  .  if( pParse->a
d260: 64 64 72 53 6b 69 70 50 4b 20 29 7b 0a 20 20 20  ddrSkipPK ){.   
d270: 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20   assert( v );.  
d280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
d290: 4f 70 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64  Op(v, pParse->ad
d2a0: 64 72 53 6b 69 70 50 4b 29 2d 3e 6f 70 63 6f 64  drSkipPK)->opcod
d2b0: 65 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d  e = OP_Goto;.  }
d2c0: 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68  ..  /* Locate th
d2d0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
d2e0: 64 65 78 2e 20 20 4f 72 2c 20 69 66 20 74 68 69  dex.  Or, if thi
d2f0: 73 20 74 61 62 6c 65 20 77 61 73 20 6f 72 69 67  s table was orig
d300: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20 49  inally.  ** an I
d310: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
d320: 45 59 20 74 61 62 6c 65 2c 20 63 72 65 61 74 65  EY table, create
d330: 20 61 20 6e 65 77 20 50 52 49 4d 41 52 59 20 4b   a new PRIMARY K
d340: 45 59 20 69 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a  EY index. .  */.
d350: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
d360: 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  y>=0 ){.    Expr
d370: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20  List *pList;.   
d380: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
d390: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
d3a0: 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20  Parse, 0, 0);.  
d3b0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
d3c0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 69   return;.    pLi
d3d0: 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d  st->a[0].zName =
d3e0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
d3f0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20  (pParse->db,.   
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d420: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
d430: 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61  pTab->iPKey].zNa
d440: 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  me);.    pList->
d450: 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
d460: 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74   pParse->iPkSort
d470: 4f 72 64 65 72 3b 0a 20 20 20 20 61 73 73 65 72  Order;.    asser
d480: 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  t( pParse->pNewT
d490: 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20  able==pTab );.  
d4a0: 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 43    pPk = sqlite3C
d4b0: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
d4c0: 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73  e, 0, 0, 0, pLis
d4d0: 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66  t, pTab->keyConf
d4e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
d4f0: 20 20 20 69 66 28 20 70 50 6b 3d 3d 30 20 29 20     if( pPk==0 ) 
d500: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b 2d  return;.    pPk-
d510: 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 32 3b 0a  >autoIndex = 2;.
d520: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
d530: 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
d540: 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33     pPk = sqlite3
d550: 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
d560: 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 70 50 6b  pTab);.  }.  pPk
d570: 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31  ->isCovering = 1
d580: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 6b 21  ;.  assert( pPk!
d590: 3d 30 20 29 3b 0a 20 20 6e 50 6b 20 3d 20 70 50  =0 );.  nPk = pP
d5a0: 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f  k->nKeyCol;..  /
d5b0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72  * Make sure ever
d5c0: 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  y column of the 
d5d0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 4e  PRIMARY KEY is N
d5e0: 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72  OT NULL */.  for
d5f0: 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b  (i=0; i<nPk; i++
d600: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f  ){.    pTab->aCo
d610: 6c 5b 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  l[pPk->aiColumn[
d620: 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 31 3b  i]].notNull = 1;
d630: 0a 20 20 7d 0a 20 20 70 50 6b 2d 3e 75 6e 69 71  .  }.  pPk->uniq
d640: 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 0a 20 20  NotNull = 1;..  
d650: 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
d660: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
d670: 4b 45 59 20 69 73 20 74 68 65 20 74 61 62 6c 65  KEY is the table
d680: 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20   root page */.  
d690: 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62  pPk->tnum = pTab
d6a0: 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70  ->tnum;..  /* Up
d6b0: 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  date the in-memo
d6c0: 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ry representatio
d6d0: 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 20  n of all UNIQUE 
d6e0: 69 6e 64 69 63 65 73 20 62 79 20 63 6f 6e 76 65  indices by conve
d6f0: 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  rting.  ** the f
d700: 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d  inal rowid colum
d710: 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f  n into one or mo
d720: 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  re columns of th
d730: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20  e PRIMARY KEY.. 
d740: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70   */.  for(pIdx=p
d750: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
d760: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
d770: 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  ext){.    int n;
d780: 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61  .    if( pIdx->a
d790: 75 74 6f 49 6e 64 65 78 3d 3d 32 20 29 20 63 6f  utoIndex==2 ) co
d7a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
d7b0: 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b  i=n=0; i<nPk; i+
d7c0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
d7d0: 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61  asColumn(pIdx->a
d7e0: 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e  iColumn, pIdx->n
d7f0: 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43  KeyCol, pPk->aiC
d800: 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b  olumn[i]) ) n++;
d810: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
d820: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
d830: 54 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 20  This index is a 
d840: 73 75 70 65 72 73 65 74 20 6f 66 20 74 68 65 20  superset of the 
d850: 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20  primary key */. 
d860: 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75       pIdx->nColu
d870: 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43  mn = pIdx->nKeyC
d880: 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ol;.      contin
d890: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
d8a0: 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a  ( resizeIndexObj
d8b0: 65 63 74 28 64 62 2c 20 70 49 64 78 2c 20 70 49  ect(db, pIdx, pI
d8c0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29  dx->nKeyCol+n) )
d8d0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72   return;.    for
d8e0: 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b  (i=0, j=pIdx->nK
d8f0: 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b  eyCol; i<nPk; i+
d900: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
d910: 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61  asColumn(pIdx->a
d920: 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e  iColumn, pIdx->n
d930: 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43  KeyCol, pPk->aiC
d940: 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20  olumn[i]) ){.   
d950: 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
d960: 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69  umn[j] = pPk->ai
d970: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
d980: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
d990: 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c  j] = pPk->azColl
d9a0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b  [i];.        j++
d9b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d9c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
d9d0: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d  ->nColumn>=pIdx-
d9e0: 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20  >nKeyCol+n );.  
d9f0: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
da00: 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20  nColumn>=j );.  
da10: 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20  }..  /* Add all 
da20: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f  table columns to
da30: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
da40: 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66   index.  */.  if
da50: 28 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ( nPk<pTab->nCol
da60: 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 69   ){.    if( resi
da70: 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62  zeIndexObject(db
da80: 2c 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f  , pPk, pTab->nCo
da90: 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  l) ) return;.   
daa0: 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b   for(i=0, j=nPk;
dab0: 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69   i<pTab->nCol; i
dac0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
dad0: 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61  hasColumn(pPk->a
dae0: 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29  iColumn, j, i) )
daf0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
db00: 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e  ( j<pPk->nColumn
db10: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d   );.        pPk-
db20: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69  >aiColumn[j] = i
db30: 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61  ;.        pPk->a
db40: 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 22 42 49 4e 41  zColl[j] = "BINA
db50: 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b  RY";.        j++
db60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
db70: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d      assert( pPk-
db80: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20  >nColumn==j );. 
db90: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
dba0: 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65  >nCol==j );.  }e
dbb0: 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43  lse{.    pPk->nC
dbc0: 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43  olumn = pTab->nC
dbd0: 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ol;.  }.}../*.**
dbe0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
dbf0: 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72   called to repor
dc00: 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20  t the final ")" 
dc10: 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a  that terminates.
dc20: 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ** a CREATE TABL
dc30: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
dc40: 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72  ** The table str
dc50: 75 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65  ucture that othe
dc60: 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  r action routine
dc70: 73 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c  s have been buil
dc80: 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64  ding.** is added
dc90: 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   to the internal
dca0: 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73   hash tables, as
dcb0: 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73  suming no errors
dcc0: 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65   have.** occurre
dcd0: 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72  d..**.** An entr
dce0: 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  y for the table 
dcf0: 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d  is made in the m
dd00: 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64  aster table on d
dd10: 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74  isk, unless.** t
dd20: 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61  his is a tempora
dd30: 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e  ry table or db->
dd40: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57  init.busy==1.  W
dd50: 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  hen db->init.bus
dd60: 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73  y==1.** it means
dd70: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
dd80: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
dd90: 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20  r table because 
dda0: 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65  we just.** conne
ddb0: 63 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  cted to the data
ddc0: 62 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20  base or because 
ddd0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
dde0: 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72  r table has.** r
ddf0: 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c  ecently changed,
de00: 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f   so the entry fo
de10: 72 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72  r this table alr
de20: 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a  eady exists in.*
de30: 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  * the sqlite_mas
de40: 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64  ter table.  We d
de50: 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72  o not want to cr
de60: 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a  eate it again..*
de70: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c  *.** If the pSel
de80: 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ect argument is 
de90: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61  not NULL, it mea
dea0: 6e 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ns that this rou
deb0: 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c  tine.** was call
dec0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74  ed to create a t
ded0: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66  able generated f
dee0: 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54  rom a .** "CREAT
def0: 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53  E TABLE ... AS S
df00: 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65  ELECT ..." state
df10: 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d  ment.  The colum
df20: 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  n names of.** th
df30: 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c  e new table will
df40: 20 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c   match the resul
df50: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
df60: 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ECT..*/.void sql
df70: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20  ite3EndTable(.  
df80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
df90: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
dfa0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
dfb0: 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20  ken *pCons,     
dfc0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27        /* The ','
dfd0: 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65   token after the
dfe0: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66   last column def
dff0: 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  n. */.  Token *p
e000: 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  End,            
e010: 2f 2a 20 54 68 65 20 27 29 27 20 62 65 66 6f 72  /* The ')' befor
e020: 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68 65  e options in the
e030: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f   CREATE TABLE */
e040: 0a 20 20 75 38 20 74 61 62 4f 70 74 73 2c 20 20  .  u8 tabOpts,  
e050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
e060: 74 72 61 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e  tra table option
e070: 73 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f  s. Usually 0. */
e080: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
e090: 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ct         /* Se
e0a0: 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45  lect from a "CRE
e0b0: 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  ATE ... AS SELEC
e0c0: 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  T" */.){.  Table
e0d0: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
e0e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
e0f0: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
e100: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
e110: 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61  >db; /* The data
e120: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
e130: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
e140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e150: 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20 77 68  * Database in wh
e160: 69 63 68 20 74 68 65 20 74 61 62 6c 65 20 6c 69  ich the table li
e170: 76 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ves */.  Index *
e180: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
e190: 20 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64     /* An implied
e1a0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   index of the ta
e1b0: 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70  ble */..  if( (p
e1c0: 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63  End==0 && pSelec
e1d0: 74 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c  t==0) || db->mal
e1e0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
e1f0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
e200: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
e210: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
e220: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
e230: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
e240: 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74  busy || !pSelect
e250: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
e260: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
e270: 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20  s 1 it means we 
e280: 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
e290: 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a  SQL off the.  **
e2a0: 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22   "sqlite_master"
e2b0: 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70   or "sqlite_temp
e2c0: 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f  _master" table o
e2d0: 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a  n the disk..  **
e2e0: 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65   So do not write
e2f0: 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61   to the disk aga
e300: 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65  in.  Extract the
e310: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
e320: 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74  r.  ** for the t
e330: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62  able from the db
e340: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66  ->init.newTnum f
e350: 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65  ield.  (The page
e360: 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f   number.  ** sho
e370: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75  uld have been pu
e380: 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73  t there by the s
e390: 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74  qliteOpenCb rout
e3a0: 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ine.).  */.  if(
e3b0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
e3c0: 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  {.    p->tnum = 
e3d0: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
e3e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63  ;.  }..  /* Spec
e3f0: 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66  ial processing f
e400: 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
e410: 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28   Tables */.  if(
e420: 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69   tabOpts & TF_Wi
e430: 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20  thoutRowid ){.  
e440: 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61    if( (p->tabFla
e450: 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
e460: 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20 20 20  ement) ){.      
e470: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e480: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
e490: 20 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54    "AUTOINCREMENT
e4a0: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   not allowed on 
e4b0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
e4c0: 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 72 65  bles");.      re
e4d0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
e4e0: 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73  if( (p->tabFlags
e4f0: 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79   & TF_HasPrimary
e500: 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Key)==0 ){.     
e510: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
e520: 28 70 50 61 72 73 65 2c 20 22 50 52 49 4d 41 52  (pParse, "PRIMAR
e530: 59 20 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e  Y KEY missing on
e540: 20 74 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a   table %s", p->z
e550: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Name);.    }else
e560: 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61 62 46 6c  {.      p->tabFl
e570: 61 67 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75  ags |= TF_Withou
e580: 74 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6f  tRowid;.      co
e590: 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f  nvertToWithoutRo
e5a0: 77 69 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  widTable(pParse,
e5b0: 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   p);.    }.  }..
e5c0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
e5d0: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
e5e0: 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23   p->pSchema);..#
e5f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e600: 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65  IT_CHECK.  /* Re
e610: 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61  solve names in a
e620: 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  ll CHECK constra
e630: 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e  int expressions.
e640: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
e650: 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  Check ){.    sql
e660: 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52  ite3ResolveSelfR
e670: 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c  eference(pParse,
e680: 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20   p, NC_IsCheck, 
e690: 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20  0, p->pCheck);. 
e6a0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
e6b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e6c0: 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f  T_CHECK) */..  /
e6d0: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61  * Estimate the a
e6e0: 76 65 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20  verage row size 
e6f0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e  for the table an
e700: 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65  d for all implie
e710: 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65  d indices */.  e
e720: 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74  stimateTableWidt
e730: 68 28 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78  h(p);.  for(pIdx
e740: 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  =p->pIndex; pIdx
e750: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
e760: 78 74 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74  xt){.    estimat
e770: 65 49 6e 64 65 78 57 69 64 74 68 28 70 49 64 78  eIndexWidth(pIdx
e780: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
e790: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
e7a0: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
e7b0: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e  record for the n
e7c0: 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  ew table.  ** in
e7d0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
e7e0: 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ER table of the 
e7f0: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20  database..  **. 
e800: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
e810: 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65   TEMPORARY table
e820: 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72  , write the entr
e830: 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c  y into the auxil
e840: 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69  iary.  ** file i
e850: 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74  nstead of into t
e860: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
e870: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
e880: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
e890: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   ){.    int n;. 
e8a0: 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
e8b0: 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20  char *zType;    
e8c0: 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61  /* "view" or "ta
e8d0: 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  ble" */.    char
e8e0: 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22   *zType2;   /* "
e8f0: 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22  VIEW" or "TABLE"
e900: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
e910: 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20  tmt;    /* Text 
e920: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
e930: 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49  BLE or CREATE VI
e940: 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EW statement */.
e950: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
e960: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
e970: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76  .    if( NEVER(v
e980: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  ==0) ) return;..
e990: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e9a0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
e9b0: 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a  e, 0);..    /* .
e9c0: 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a      ** Initializ
e9d0: 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  e zType for the 
e9e0: 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c  new view or tabl
e9f0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
ea00: 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ( p->pSelect==0 
ea10: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65  ){.      /* A re
ea20: 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20  gular table */. 
ea30: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61       zType = "ta
ea40: 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  ble";.      zTyp
ea50: 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69  e2 = "TABLE";.#i
ea60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ea70: 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65  T_VIEW.    }else
ea80: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65  {.      /* A vie
ea90: 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65  w */.      zType
eaa0: 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20   = "view";.     
eab0: 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22   zType2 = "VIEW"
eac0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
ead0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
eae0: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
eaf0: 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e   xx AS SELECT ..
eb00: 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53  ., execute the S
eb10: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61  ELECT.    ** sta
eb20: 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61  tement to popula
eb30: 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  te the new table
eb40: 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  . The root-page 
eb50: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20  number for the. 
eb60: 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20     ** new table 
eb70: 69 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 70  is in register p
eb80: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a  Parse->regRoot..
eb90: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
eba0: 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61  ce the SELECT ha
ebb0: 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20  s been coded by 
ebc0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c  sqlite3Select(),
ebd0: 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20   it is in a.    
ebe0: 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74  ** suitable stat
ebf0: 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74  e to query for t
ec00: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
ec10: 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20  and types to be 
ec20: 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  used.    ** by t
ec30: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20  he new table..  
ec40: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68    **.    ** A sh
ec50: 61 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65  ared-cache write
ec60: 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71  -lock is not req
ec70: 75 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74  uired to write t
ec80: 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c  o the new table,
ec90: 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68  .    ** as a sch
eca0: 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61  ema-lock must ha
ecb0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
ecc0: 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61  obtained to crea
ecd0: 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20  te it. Since.   
ece0: 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   ** a schema-loc
ecf0: 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f  k excludes all o
ed00: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73  ther database us
ed10: 65 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c  ers, the write-l
ed20: 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a  ock would.    **
ed30: 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20   be redundant.. 
ed40: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
ed50: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53  elect ){.      S
ed60: 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
ed70: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65        Table *pSe
ed80: 6c 54 61 62 3b 0a 0a 20 20 20 20 20 20 61 73 73  lTab;..      ass
ed90: 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62  ert(pParse->nTab
eda0: 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ==1);.      sqli
edb0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
edc0: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
edd0: 2c 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  , pParse->regRoo
ede0: 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  t, iDb);.      s
edf0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
ee00: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49  P5(v, OPFLAG_P2I
ee10: 53 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61  SREG);.      pPa
ee20: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20  rse->nTab = 2;. 
ee30: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
ee40: 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
ee50: 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b  , SRT_Table, 1);
ee60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
ee70: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
ee80: 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20  lect, &dest);.  
ee90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
eea0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
eeb0: 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 1);.      if(
eec0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
eed0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   ){.        pSel
eee0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
eef0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
ef00: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b  Parse, pSelect);
ef10: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
ef20: 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  lTab==0 ) return
ef30: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
ef40: 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ( p->aCol==0 );.
ef50: 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20          p->nCol 
ef60: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
ef70: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c  .        p->aCol
ef80: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
ef90: 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61  ;.        pSelTa
efa0: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
efb0: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
efc0: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
efd0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
efe0: 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b  le(db, pSelTab);
eff0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
f000: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
f010: 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
f020: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73   of the CREATE s
f030: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
f040: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
f050: 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65       zStmt = cre
f060: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c  ateTableStmt(db,
f070: 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   p);.    }else{.
f080: 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e        Token *pEn
f090: 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26  d2 = tabOpts ? &
f0a0: 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
f0b0: 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20  en : pEnd;.     
f0c0: 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32   n = (int)(pEnd2
f0d0: 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e  ->z - pParse->sN
f0e0: 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20  ameToken.z);.   
f0f0: 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b     if( pEnd2->z[
f100: 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70  0]!=';' ) n += p
f110: 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a  End2->n;.      z
f120: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
f130: 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20  rintf(db, .     
f140: 20 20 20 20 20 22 43 52 45 41 54 45 20 25 73 20       "CREATE %s 
f150: 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e  %.*s", zType2, n
f160: 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  , pParse->sNameT
f170: 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a  oken.z.      );.
f180: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20      }..    /* A 
f190: 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63  slot for the rec
f1a0: 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ord has already 
f1b0: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69  been allocated i
f1c0: 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51  n the .    ** SQ
f1d0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
f1e0: 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64  e.  We just need
f1f0: 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20   to update that 
f200: 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20  slot with all.  
f210: 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61    ** the informa
f220: 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65  tion we've colle
f230: 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cted..    */.   
f240: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
f250: 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
f260: 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
f270: 22 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20  ".         "SET 
f280: 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d  type='%s', name=
f290: 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c  %Q, tbl_name=%Q,
f2a0: 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73   rootpage=#%d, s
f2b0: 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22  ql=%Q ".       "
f2c0: 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22  WHERE rowid=#%d"
f2d0: 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
f2e0: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
f2f0: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
f300: 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20       zType,.    
f310: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
f320: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
f330: 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f    pParse->regRoo
f340: 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a  t,.      zStmt,.
f350: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
f360: 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20  gRowid.    );.  
f370: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
f380: 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20  db, zStmt);.    
f390: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
f3a0: 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
f3b0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
f3c0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
f3d0: 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63  MENT.    /* Chec
f3e0: 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e  k to see if we n
f3f0: 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  eed to create an
f400: 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
f410: 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a   table for.    *
f420: 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20  * keeping track 
f430: 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  of autoincrement
f440: 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20   keys..    */.  
f450: 20 20 69 66 28 20 70 2d 3e 74 61 62 46 6c 61 67    if( p->tabFlag
f460: 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
f470: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 44 62  ment ){.      Db
f480: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
f490: 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 73 73  [iDb];.      ass
f4a0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
f4b0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
f4c0: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  iDb, 0) );.     
f4d0: 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
f4e0: 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b  a->pSeqTab==0 ){
f4f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
f500: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
f510: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43  se,.          "C
f520: 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73  REATE TABLE %Q.s
f530: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e  qlite_sequence(n
f540: 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20  ame,seq)",.     
f550: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a       pDb->zName.
f560: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
f570: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
f580: 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20  .    /* Reparse 
f590: 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70  everything to up
f5a0: 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
f5b0: 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
f5c0: 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
f5d0: 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
f5e0: 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20  maOp(v, iDb,.   
f5f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
f600: 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f  Printf(db, "tbl_
f610: 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
f620: 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20  pe!='trigger'", 
f630: 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a  p->zName));.  }.
f640: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74  ..  /* Add the t
f650: 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d  able to the in-m
f660: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
f670: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
f680: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
f690: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
f6a0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
f6b0: 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  d;.    Schema *p
f6c0: 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68  Schema = p->pSch
f6d0: 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ema;.    assert(
f6e0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
f6f0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
f700: 20 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20   0) );.    pOld 
f710: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
f720: 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  ert(&pSchema->tb
f730: 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
f740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
f760: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d  lite3Strlen30(p-
f770: 3e 7a 4e 61 6d 65 29 2c 70 29 3b 0a 20 20 20 20  >zName),p);.    
f780: 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
f790: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
f7a0: 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
f7b0: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
f7c0: 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
f7d0: 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 64 62  rt() */.      db
f7e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
f7f0: 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
f800: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
f810: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
f820: 30 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  0;.    db->flags
f830: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
f840: 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64  nChanges;..#ifnd
f850: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
f860: 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66  LTERTABLE.    if
f870: 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b  ( !p->pSelect ){
f880: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
f890: 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
f8a0: 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d  t char *)pParse-
f8b0: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20  >sNameToken.z;. 
f8c0: 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a       int nName;.
f8d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
f8e0: 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20  Select && pCons 
f8f0: 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20  && pEnd );.     
f900: 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30   if( pCons->z==0
f910: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e   ){.        pCon
f920: 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  s = pEnd;.      
f930: 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20  }.      nName = 
f940: 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61  (int)((const cha
f950: 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a  r *)pCons->z - z
f960: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Name);.      p->
f970: 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31  addColOffset = 1
f980: 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43  3 + sqlite3Utf8C
f990: 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e  harLen(zName, nN
f9a0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ame);.    }.#end
f9b0: 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  if.  }.}..#ifnde
f9c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
f9d0: 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72  EW./*.** The par
f9e0: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
f9f0: 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20  outine in order 
fa00: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
fa10: 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  VIEW.*/.void sql
fa20: 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a  ite3CreateView(.
fa30: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
fa40: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
fa50: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
fa60: 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20   Token *pBegin, 
fa70: 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
fa80: 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
fa90: 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ins the statemen
faa0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
fab0: 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame1,     /* The
fac0: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
fad0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
fae0: 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  e view */.  Toke
faf0: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
fb00: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
fb10: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
fb20: 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
fb30: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
fb40: 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20  ,   /* A SELECT 
fb50: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
fb60: 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
fb70: 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  ew view */.  int
fb80: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20   isTemp,        
fb90: 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45  /* TRUE for a TE
fba0: 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a  MPORARY view */.
fbb0: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
fbc0: 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73       /* Suppress
fbd0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
fbe0: 69 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20  if VIEW already 
fbf0: 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  exists */.){.  T
fc00: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  able *p;.  int n
fc10: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
fc20: 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b  z;.  Token sEnd;
fc30: 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
fc40: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  .  Token *pName 
fc50: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  = 0;.  int iDb;.
fc60: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
fc70: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
fc80: 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  f( pParse->nVar>
fc90: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
fca0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
fcb0: 20 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65   "parameters are
fcc0: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20   not allowed in 
fcd0: 76 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c  views");.    sql
fce0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
fcf0: 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
fd00: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
fd10: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
fd20: 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
fd30: 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d  1, pName2, isTem
fd40: 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b  p, 1, 0, noErr);
fd50: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
fd60: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
fd70: 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
fd80: 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  nErr ){.    sqli
fd90: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
fda0: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
fdb0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
fdc0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
fdd0: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
fde0: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
fdf0: 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  e);.  iDb = sqli
fe00: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
fe10: 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
fe20: 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e  ;.  sqlite3FixIn
fe30: 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
fe40: 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70  , iDb, "view", p
fe50: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c  Name);.  if( sql
fe60: 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73  ite3FixSelect(&s
fe70: 46 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29 7b  Fix, pSelect) ){
fe80: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
fe90: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
fea0: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
feb0: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  n;.  }..  /* Mak
fec0: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
fed0: 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
fee0: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
fef0: 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
ff00: 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
ff10: 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
ff20: 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
ff30: 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
ff40: 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
ff50: 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
ff60: 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
ff70: 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
ff80: 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
ff90: 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
ffa0: 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
ffb0: 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
ffc0: 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a  ) call returns..
ffd0: 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63    */.  p->pSelec
ffe0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
fff0: 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74  tDup(db, pSelect
10000 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
10010 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
10020 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
10030 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62 2d  lect);.  if( db-
10040 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
10050 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
10060 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
10070 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c  .busy ){.    sql
10080 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
10090 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
100a0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
100b0 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
100c0 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73  he CREATE VIEW s
100d0 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20  tatement.  Make 
100e0 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20  sEnd point to.  
100f0 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f  ** the end..  */
10100 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65  .  sEnd = pParse
10110 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20  ->sLastToken;.  
10120 69 66 28 20 41 4c 57 41 59 53 28 73 45 6e 64 2e  if( ALWAYS(sEnd.
10130 7a 5b 30 5d 21 3d 30 29 20 26 26 20 73 45 6e 64  z[0]!=0) && sEnd
10140 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20  .z[0]!=';' ){.  
10150 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64    sEnd.z += sEnd
10160 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e  .n;.  }.  sEnd.n
10170 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74   = 0;.  n = (int
10180 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69  )(sEnd.z - pBegi
10190 6e 2d 3e 7a 29 3b 0a 20 20 7a 20 3d 20 70 42 65  n->z);.  z = pBe
101a0 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28  gin->z;.  while(
101b0 20 41 4c 57 41 59 53 28 6e 3e 30 29 20 26 26 20   ALWAYS(n>0) && 
101c0 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
101d0 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d  [n-1]) ){ n--; }
101e0 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
101f0 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
10200 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
10210 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
10220 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
10230 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
10240 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
10250 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
10260 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c  Parse, 0, &sEnd,
10270 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e   0, 0);.  return
10280 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
10290 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
102a0 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
102b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
102c0 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
102d0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
102e0 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68  LTABLE)./*.** Th
102f0 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
10300 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c  e pTable is real
10310 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c  ly a VIEW.  Fill
10320 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   in the names of
10330 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  .** the columns 
10340 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74  of the view in t
10350 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74  he pTable struct
10360 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ure.  Return the
10370 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
10380 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72  rors.  If an err
10390 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65  or is seen leave
103a0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
103b0 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
103c0 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
103d0 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
103e0 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
103f0 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
10400 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ble){.  Table *p
10410 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66  SelTab;   /* A f
10420 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77  ake table from w
10430 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20  hich we get the 
10440 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
10450 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20  Select *pSel;   
10460 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65    /* Copy of the
10470 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70   SELECT that imp
10480 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
10490 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d   */.  int nErr =
104a0 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
104b0 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
104c0 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74  untered */.  int
104d0 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   n;            /
104e0 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f  * Temporarily ho
104f0 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lds the number o
10500 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e  f cursors assign
10510 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ed */.  sqlite3 
10520 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
10530 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
10540 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61  onnection for ma
10550 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20  lloc errors */. 
10560 20 69 6e 74 20 28 2a 78 41 75 74 68 29 28 76 6f   int (*xAuth)(vo
10570 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
10580 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ar*,const char*,
10590 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
105a0 74 20 63 68 61 72 2a 29 3b 0a 0a 20 20 61 73 73  t char*);..  ass
105b0 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
105c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
105d0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
105e0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 74  .  if( sqlite3Vt
105f0 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50  abCallConnect(pP
10600 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b  arse, pTable) ){
10610 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10620 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
10630 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
10640 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30  able) ) return 0
10650 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
10660 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10670 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69  EW.  /* A positi
10680 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68  ve nCol means th
10690 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20  e columns names 
106a0 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72  for this view ar
106b0 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b  e.  ** already k
106c0 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nown..  */.  if(
106d0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20   pTable->nCol>0 
106e0 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
106f0 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * A negative nCo
10700 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d  l is a special m
10710 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68  arker meaning th
10720 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  at we are curren
10730 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20  tly.  ** trying 
10740 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63  to compute the c
10750 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66  olumn names.  If
10760 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72   we enter this r
10770 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a  outine with.  **
10780 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   a negative nCol
10790 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f  , it means two o
107a0 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72  r more views for
107b0 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74  m a loop, like t
107c0 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
107d0 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f     CREATE VIEW o
107e0 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  ne AS SELECT * F
107f0 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20  ROM two;.  **   
10800 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77    CREATE VIEW tw
10810 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  o AS SELECT * FR
10820 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a  OM one;.  **.  *
10830 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20  * Actually, the 
10840 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e  error above is n
10850 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20  ow caught prior 
10860 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73  to reaching this
10870 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74   point..  ** But
10880 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
10890 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70  est is still imp
108a0 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65  ortant as it doe
108b0 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69  s come up.  ** i
108c0 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  n the following:
108d0 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20  .  ** .  **     
108e0 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69  CREATE TABLE mai
108f0 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20  n.ex1(a);.  **  
10900 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 56     CREATE TEMP V
10910 49 45 57 20 65 78 31 20 41 53 20 53 45 4c 45 43  IEW ex1 AS SELEC
10920 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20  T a FROM ex1;.  
10930 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  **     SELECT * 
10940 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20  FROM temp.ex1;. 
10950 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
10960 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ->nCol<0 ){.    
10970 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
10980 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73  pParse, "view %s
10990 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64   is circularly d
109a0 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d  efined", pTable-
109b0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
109c0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 1;.  }.  ass
109d0 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ert( pTable->nCo
109e0 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  l>=0 );..  /* If
109f0 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
10a00 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65  , it means we ne
10a10 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
10a20 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20  e table names.. 
10a30 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
10a40 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
10a50 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
10a60 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
10a70 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
10a80 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65  ements in the re
10a90 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65  sults set of the
10aa0 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61   view and will a
10ab0 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20  ssign cursors.  
10ac0 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e  ** to the elemen
10ad0 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ts of the FROM c
10ae0 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64  lause.  But we d
10af0 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65  o not want these
10b00 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
10b10 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20   be permanent.  
10b20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  So the computati
10b30 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20  on is done on a 
10b40 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
10b50 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  CT.  ** statemen
10b60 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
10b70 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20  he view..  */.  
10b80 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
10b90 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65  pSelect );.  pSe
10ba0 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  l = sqlite3Selec
10bb0 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d  tDup(db, pTable-
10bc0 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
10bd0 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20  if( pSel ){.    
10be0 75 38 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69  u8 enableLookasi
10bf0 64 65 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  de = db->lookasi
10c00 64 65 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20 20  de.bEnabled;.   
10c10 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61   n = pParse->nTa
10c20 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  b;.    sqlite3Sr
10c30 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
10c40 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  rs(pParse, pSel-
10c50 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62  >pSrc);.    pTab
10c60 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  le->nCol = -1;. 
10c70 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
10c80 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 23  .bEnabled = 0;.#
10c90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10ca0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
10cb0 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d  .    xAuth = db-
10cc0 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e  >xAuth;.    db->
10cd0 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70  xAuth = 0;.    p
10ce0 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
10cf0 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
10d00 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b  t(pParse, pSel);
10d10 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d  .    db->xAuth =
10d20 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20   xAuth;.#else.  
10d30 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
10d40 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
10d50 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
10d60 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64  l);.#endif.    d
10d70 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
10d80 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65 4c 6f  abled = enableLo
10d90 6f 6b 61 73 69 64 65 3b 0a 20 20 20 20 70 50 61  okaside;.    pPa
10da0 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20  rse->nTab = n;. 
10db0 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29     if( pSelTab )
10dc0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
10dd0 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
10de0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  );.      pTable-
10df0 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
10e00 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61  >nCol;.      pTa
10e10 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c  ble->aCol = pSel
10e20 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
10e30 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
10e40 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61   0;.      pSelTa
10e50 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
10e60 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
10e70 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61  Table(db, pSelTa
10e80 62 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  b);.      assert
10e90 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
10ea0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
10eb0 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29  pTable->pSchema)
10ec0 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65   );.      pTable
10ed0 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73  ->pSchema->flags
10ee0 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69   |= DB_UnresetVi
10ef0 65 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ews;.    }else{.
10f00 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
10f10 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45  ol = 0;.      nE
10f20 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rr++;.    }.    
10f30 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
10f40 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20  ete(db, pSel);. 
10f50 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45   } else {.    nE
10f60 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rr++;.  }.#endif
10f70 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10f80 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e  VIEW */.  return
10f90 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
10fa0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
10fb0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
10fc0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
10fd0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
10fe0 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  ABLE) */..#ifnde
10ff0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
11000 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  EW./*.** Clear t
11010 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
11020 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20  from every VIEW 
11030 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e  in database idx.
11040 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11050 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
11060 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
11070 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
11080 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72  Elem *i;.  asser
11090 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
110a0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64  MutexHeld(db, id
110b0 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21  x, 0) );.  if( !
110c0 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
110d0 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
110e0 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
110f0 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
11100 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
11110 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d  Db[idx].pSchema-
11120 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73  >tblHash); i;i=s
11130 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
11140 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
11150 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
11160 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
11170 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
11180 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c  .      sqliteDel
11190 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64  eteColumnNames(d
111a0 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
111b0 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  pTab->aCol = 0;.
111c0 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
111d0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
111e0 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
111f0 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
11200 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23  resetViews);.}.#
11210 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71  else.# define sq
11220 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
11230 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20  (A,B).#endif /* 
11240 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
11250 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
11260 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
11270 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74  ed by the VDBE t
11280 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74  o adjust the int
11290 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
112a0 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77  used by SQLite w
112b0 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61  hen the btree la
112c0 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c  yer moves a tabl
112d0 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65  e root page. The
112e0 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  .** root-page of
112f0 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
11300 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44  x in database iD
11310 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72  b has changed fr
11320 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69  om iFrom.** to i
11330 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74  To..**.** Ticket
11340 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d   #1728:  The sym
11350 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20  bol table might 
11360 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e  still contain in
11370 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20  formation.** on 
11380 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e  tables and/or in
11390 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74  dices that are t
113a0 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  he process of be
113b0 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20  ing deleted..** 
113c0 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63  If you are unluc
113d0 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ky, one of those
113e0 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73   deleted indices
113f0 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74   or tables might
11400 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d  .** have the sam
11410 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65  e rootpage numbe
11420 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61  r as the real ta
11430 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61  ble or index tha
11440 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f  t is.** being mo
11450 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e  ved.  So we cann
11460 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e  ot stop searchin
11470 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73  g after the firs
11480 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61  t match .** beca
11490 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61  use the first ma
114a0 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72  tch might be for
114b0 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65   one of the dele
114c0 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f  ted indices.** o
114d0 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74  r tables and not
114e0 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
114f0 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c   that is actuall
11500 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a  y being moved..*
11510 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e  * We must contin
11520 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ue looping until
11530 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20   all tables and 
11540 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20  indices with.** 
11550 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20  rootpage==iFrom 
11560 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72  have been conver
11570 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f  ted to have a ro
11580 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a  otpage of iTo.**
11590 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
115a0 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20  certain that we 
115b0 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e  got the right on
115c0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
115d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
115e0 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65  CUUM.void sqlite
115f0 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73  3RootPageMoved(s
11600 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
11610 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  iDb, int iFrom, 
11620 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68  int iTo){.  Hash
11630 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48  Elem *pElem;.  H
11640 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62  ash *pHash;.  Db
11650 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74   *pDb;..  assert
11660 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
11670 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
11680 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20  , 0) );.  pDb = 
11690 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
116a0 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70   pHash = &pDb->p
116b0 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b  Schema->tblHash;
116c0 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
116d0 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61  iteHashFirst(pHa
116e0 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
116f0 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
11700 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
11710 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
11720 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
11730 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
11740 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a  >tnum==iFrom ){.
11750 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d        pTab->tnum
11760 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20   = iTo;.    }.  
11770 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  }.  pHash = &pDb
11780 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
11790 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
117a0 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
117b0 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
117c0 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
117d0 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
117e0 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73   Index *pIdx = s
117f0 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
11800 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49  lem);.    if( pI
11810 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  dx->tnum==iFrom 
11820 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74  ){.      pIdx->t
11830 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
11840 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
11850 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20  *.** Write code 
11860 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62  to erase the tab
11870 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
11880 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61  e iTable from da
11890 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41  tabase iDb..** A
118a0 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74  lso write code t
118b0 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c  o modify the sql
118c0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
118d0 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
118e0 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f  hema.** if a roo
118f0 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65  t-page of anothe
11900 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
11910 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61   by the btree-la
11920 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72  yer whilst.** er
11930 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68  asing iTable (th
11940 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
11950 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
11960 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20  m database)..*/ 
11970 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
11980 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72  troyRootPage(Par
11990 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
119a0 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29  iTable, int iDb)
119b0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
119c0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
119d0 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d  rse);.  int r1 =
119e0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
119f0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
11a00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
11a10 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69  v, OP_Destroy, i
11a20 54 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b  Table, r1, iDb);
11a30 0a 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f  .  sqlite3MayAbo
11a40 72 74 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e  rt(pParse);.#ifn
11a50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11a60 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
11a70 4f 50 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65  OP_Destroy store
11a80 73 20 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20  s an in integer 
11a90 72 31 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65  r1. If this inte
11aa0 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d  ger.  ** is non-
11ab0 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73  zero, then it is
11ac0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
11ad0 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65  umber of a table
11ae0 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c   moved to.  ** l
11af0 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20  ocation iTable. 
11b00 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
11b10 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20  de modifies the 
11b20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
11b30 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c  ble to.  ** refl
11b40 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20  ect this..  **. 
11b50 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69   ** The "#NNN" i
11b60 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73  n the SQL is a s
11b70 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20  pecial constant 
11b80 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65  that means whate
11b90 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69  ver value.  ** i
11ba0 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e  s in register NN
11bb0 4e 2e 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20  N.  See grammar 
11bc0 72 75 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64  rules associated
11bd0 20 77 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47   with the TK_REG
11be0 49 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e  ISTER.  ** token
11bf0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
11c00 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a  information..  *
11c10 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65  /.  sqlite3Neste
11c20 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
11c30 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
11c40 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d  %s SET rootpage=
11c50 25 64 20 57 48 45 52 45 20 23 25 64 20 41 4e 44  %d WHERE #%d AND
11c60 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a   rootpage=#%d",.
11c70 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d       pParse->db-
11c80 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
11c90 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
11ca0 62 29 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20  b), iTable, r1, 
11cb0 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  r1);.#endif.  sq
11cc0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
11cd0 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
11ce0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
11cf0 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61  VDBE code to era
11d00 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  se table pTab an
11d10 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64  d all associated
11d20 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b   indices on disk
11d30 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64  ..** Code to upd
11d40 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ate the sqlite_m
11d50 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64  aster tables and
11d60 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
11d70 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20   definitions.** 
11d80 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70  in case a root-p
11d90 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
11da0 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
11db0 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
11dc0 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73  tree layer.** is
11dd0 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69   also added (thi
11de0 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
11df0 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
11e00 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73   database)..*/.s
11e10 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
11e20 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  oyTable(Parse *p
11e30 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
11e40 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ab){.#ifdef SQLI
11e50 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
11e60 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  UM.  Index *pIdx
11e70 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71  ;.  int iDb = sq
11e80 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
11e90 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
11ea0 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
11eb0 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
11ec0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74  (pParse, pTab->t
11ed0 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72  num, iDb);.  for
11ee0 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
11ef0 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
11f00 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
11f10 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
11f20 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74  (pParse, pIdx->t
11f30 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23  num, iDb);.  }.#
11f40 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65  else.  /* If the
11f50 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65   database may be
11f60 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70   auto-vacuum cap
11f70 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f  able (if SQLITE_
11f80 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
11f90 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69    ** is not defi
11fa0 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73  ned), then it is
11fb0 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61   important to ca
11fc0 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e  ll OP_Destroy on
11fd0 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20   the.  ** table 
11fe0 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70  and index root-p
11ff0 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73  ages in order, s
12000 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
12010 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20   numerically .  
12020 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  ** largest root-
12030 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69  page number. Thi
12040 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  s guarantees tha
12050 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  t none of the ro
12060 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f  ot-pages.  ** to
12070 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73   be destroyed is
12080 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e   relocated by an
12090 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74   earlier OP_Dest
120a0 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  roy. i.e. if the
120b0 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  .  ** following 
120c0 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a  were coded:.  **
120d0 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
120e0 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20   4 0.  ** ....  
120f0 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  ** OP_Destroy 5 
12100 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20  0.  **.  ** and 
12110 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70  root page 5 happ
12120 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  ened to be the l
12130 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
12140 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20   number in the. 
12150 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
12160 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77  en root page 5 w
12170 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f  ould be moved to
12180 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a   page 4 by the .
12190 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79    ** "OP_Destroy
121a0 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68   4 0" opcode. Th
121b0 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50  e subsequent "OP
121c0 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f  _Destroy 5 0" wo
121d0 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66  uld hit.  ** a f
121e0 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20  ree-list page.. 
121f0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
12200 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69   pTab->tnum;.  i
12210 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20  nt iDestroyed = 
12220 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29  0;..  while( 1 )
12230 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
12240 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67  x;.    int iLarg
12250 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  est = 0;..    if
12260 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20  ( iDestroyed==0 
12270 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79  || iTab<iDestroy
12280 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72  ed ){.      iLar
12290 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20  gest = iTab;.   
122a0 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d   }.    for(pIdx=
122b0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
122c0 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
122d0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
122e0 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e   iIdx = pIdx->tn
122f0 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  um;.      assert
12300 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d  ( pIdx->pSchema=
12310 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
12320 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65  ;.      if( (iDe
12330 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69  stroyed==0 || (i
12340 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29  Idx<iDestroyed))
12350 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73   && iIdx>iLarges
12360 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61  t ){.        iLa
12370 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20  rgest = iIdx;.  
12380 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
12390 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20  if( iLargest==0 
123a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  ){.      return;
123b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
123c0 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
123d0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
123e0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
123f0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
12400 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d     assert( iDb>=
12410 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d  0 && iDb<pParse-
12420 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  >db->nDb );.    
12430 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
12440 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
12450 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  st, iDb);.      
12460 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61  iDestroyed = iLa
12470 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  rgest;.    }.  }
12480 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
12490 20 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20   Remove entries 
124a0 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f  from the sqlite_
124b0 73 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f  statN tables (fo
124c0 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a  r N in (1,2,3)).
124d0 2a 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50 20  ** after a DROP 
124e0 49 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41  INDEX or DROP TA
124f0 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  BLE command..*/.
12500 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
12510 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
12520 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
12530 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
12540 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
12550 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ext */.  int iDb
12560 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12570 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
12580 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73  number */.  cons
12590 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20  t char *zType,  
125a0 20 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22     /* "idx" or "
125b0 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tbl" */.  const 
125c0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20  char *zName     
125d0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65   /* Name of inde
125e0 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  x or table */.){
125f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
12600 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20  t char *zDbName 
12610 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  = pParse->db->aD
12620 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
12630 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69  for(i=1; i<=4; i
12640 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54  ++){.    char zT
12650 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69  ab[24];.    sqli
12660 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
12670 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22  eof(zTab),zTab,"
12680 73 71 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69  sqlite_stat%d",i
12690 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
126a0 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
126b0 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44  se->db, zTab, zD
126c0 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  bName) ){.      
126d0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
126e0 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
126f0 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
12700 25 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25  %Q.%s WHERE %s=%
12710 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e  Q",.        zDbN
12720 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65  ame, zTab, zType
12730 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  , zName.      );
12740 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
12750 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
12760 65 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c  e to drop a tabl
12770 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
12780 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28  e3CodeDropTable(
12790 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
127a0 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20  able *pTab, int 
127b0 69 44 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29  iDb, int isView)
127c0 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  {.  Vdbe *v;.  s
127d0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
127e0 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67  rse->db;.  Trigg
127f0 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20  er *pTrigger;.  
12800 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
12810 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20  Db[iDb];..  v = 
12820 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
12830 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
12840 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( v!=0 );.  sqli
12850 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
12860 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
12870 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
12880 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
12890 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
128a0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
128b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
128c0 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56  beAddOp0(v, OP_V
128d0 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  Begin);.  }.#end
128e0 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c  if..  /* Drop al
128f0 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63  l triggers assoc
12900 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
12910 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
12920 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73  ed. Code.  ** is
12930 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65   generated to re
12940 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f  move entries fro
12950 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  m sqlite_master 
12960 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69  and/or.  ** sqli
12970 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69  te_temp_master i
12980 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  f required..  */
12990 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71  .  pTrigger = sq
129a0 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74  lite3TriggerList
129b0 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
129c0 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65    while( pTrigge
129d0 72 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  r ){.    assert(
129e0 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
129f0 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
12a00 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54  a || .        pT
12a10 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d  rigger->pSchema=
12a20 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  =db->aDb[1].pSch
12a30 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ema );.    sqlit
12a40 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
12a50 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
12a60 72 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72  r);.    pTrigger
12a70 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
12a80 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  xt;.  }..#ifndef
12a90 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12aa0 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20  OINCREMENT.  /* 
12ab0 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69  Remove any entri
12ac0 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  es of the sqlite
12ad0 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
12ae0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
12af0 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
12b00 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68  eing dropped. Th
12b10 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72  is is done befor
12b20 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64  e the table is d
12b30 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74  ropped.  ** at t
12b40 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20  he btree level, 
12b50 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69  in case the sqli
12b60 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
12b70 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20  e needs to.  ** 
12b80 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74  move as a result
12b90 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61   of the drop (ca
12ba0 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f  n happen in auto
12bb0 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20  -vacuum mode).. 
12bc0 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   */.  if( pTab->
12bd0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
12be0 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20  toincrement ){. 
12bf0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
12c00 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
12c10 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
12c20 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
12c30 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  nce WHERE name=%
12c40 51 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  Q",.      pDb->z
12c50 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
12c60 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e  e.    );.  }.#en
12c70 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61  dif..  /* Drop a
12c80 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ll SQLITE_MASTER
12c90 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
12ca0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65   entries that re
12cb0 66 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  fer to the.  ** 
12cc0 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72  table. The progr
12cd0 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68  am name loops th
12ce0 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72  rough the master
12cf0 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74   table and delet
12d00 65 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f  es.  ** every ro
12d10 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  w that refers to
12d20 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20   a table of the 
12d30 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
12d40 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20   one being.  ** 
12d50 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72  dropped. Trigger
12d60 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  s are handled se
12d70 70 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65  parately because
12d80 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62   a trigger can b
12d90 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69  e.  ** created i
12da0 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  n the temp datab
12db0 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20  ase that refers 
12dc0 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e  to a table in an
12dd0 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62  other.  ** datab
12de0 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ase..  */.  sqli
12df0 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
12e00 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44  Parse, .      "D
12e10 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
12e20 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d   WHERE tbl_name=
12e30 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72  %Q and type!='tr
12e40 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70  igger'",.      p
12e50 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db->zName, SCHEM
12e60 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54  A_TABLE(iDb), pT
12e70 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ab->zName);.  if
12e80 28 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73  ( !isView && !Is
12e90 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
12ea0 0a 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c  .    destroyTabl
12eb0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  e(pParse, pTab);
12ec0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
12ed0 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  e the table entr
12ee0 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20  y from SQLite's 
12ef0 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
12f00 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20  and modify.  ** 
12f10 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
12f20 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73  e..  */.  if( Is
12f30 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
12f40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12f50 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65  AddOp4(v, OP_VDe
12f60 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30  stroy, iDb, 0, 0
12f70 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
12f80 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
12f90 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
12fa0 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c  _DropTable, iDb,
12fb0 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61   0, 0, pTab->zNa
12fc0 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  me, 0);.  sqlite
12fd0 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
12fe0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71  arse, iDb);.  sq
12ff0 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
13000 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a  (db, iDb);.}../*
13010 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13020 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f   is called to do
13030 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44   the work of a D
13040 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ROP TABLE statem
13050 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73  ent..** pName is
13060 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
13070 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f   table to be dro
13080 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pped..*/.void sq
13090 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50  lite3DropTable(P
130a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
130b0 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
130c0 74 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f  t isView, int no
130d0 45 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  Err){.  Table *p
130e0 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  Tab;.  Vdbe *v;.
130f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
13100 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
13110 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62  t iDb;..  if( db
13120 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13130 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
13140 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
13150 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
13160 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61  ->nErr==0 );.  a
13170 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
13180 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e  rc==1 );.  if( n
13190 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72  oErr ) db->suppr
131a0 65 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54 61 62  essErr++;.  pTab
131b0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
131c0 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
131d0 2c 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65  , isView, &pName
131e0 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e  ->a[0]);.  if( n
131f0 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72  oErr ) db->suppr
13200 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28  essErr--;..  if(
13210 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
13220 69 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69  if( noErr ) sqli
13230 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d  te3CodeVerifyNam
13240 65 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  edSchema(pParse,
13250 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
13260 74 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74  tabase);.    got
13270 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
13280 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  e;.  }.  iDb = s
13290 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
132a0 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
132b0 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74  chema);.  assert
132c0 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
132d0 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a  db->nDb );..  /*
132e0 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69   If pTab is a vi
132f0 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c  rtual table, cal
13300 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  l ViewGetColumnN
13310 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65  ames() to ensure
13320 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74  .  ** it is init
13330 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
13340 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
13350 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69  ab) && sqlite3Vi
13360 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
13370 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
13380 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
13390 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
133a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
133b0 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
133c0 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
133d0 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  de;.    const ch
133e0 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
133f0 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
13400 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
13410 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
13420 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  .zName;.    cons
13430 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20  t char *zArg2 = 
13440 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
13450 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
13460 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
13470 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
13480 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
13490 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
134a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
134b0 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
134c0 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
134d0 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
134e0 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
134f0 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b  _DROP_TEMP_VIEW;
13500 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13510 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
13520 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20  ITE_DROP_VIEW;. 
13530 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
13540 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
13550 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73  ALTABLE.    }els
13560 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
13570 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63  pTab) ){.      c
13580 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
13590 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  P_VTABLE;.      
135a0 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47  zArg2 = sqlite3G
135b0 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
135c0 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b  b)->pMod->zName;
135d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
135e0 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  e{.      if( !OM
135f0 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
13600 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
13610 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
13620 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  P_TEMP_TABLE;.  
13630 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13640 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
13650 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _DROP_TABLE;.   
13660 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
13670 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
13680 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
13690 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
136a0 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Arg2, zDb) ){.  
136b0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
136c0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
136d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
136e0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
136f0 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
13700 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
13710 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
13720 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
13730 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  le;.    }.  }.#e
13740 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74  ndif.  if( sqlit
13750 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
13760 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
13770 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26  ", 7)==0 .    &&
13780 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
13790 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
137a0 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29  qlite_stat", 11)
137b0 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
137c0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
137d0 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
137e0 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
137f0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
13800 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
13810 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23  op_table;.  }..#
13820 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13830 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73  IT_VIEW.  /* Ens
13840 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69  ure DROP TABLE i
13850 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20  s not used on a 
13860 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56  view, and DROP V
13870 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a  IEW is not used.
13880 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e    ** on a table.
13890 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69  .  */.  if( isVi
138a0 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
138b0 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
138c0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
138d0 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
138e0 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20  TABLE to delete 
138f0 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d  table %s", pTab-
13900 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
13910 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
13920 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73  e;.  }.  if( !is
13930 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
13940 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
13950 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13960 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56  rse, "use DROP V
13970 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69  IEW to delete vi
13980 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  ew %s", pTab->zN
13990 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
139a0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
139b0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
139c0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
139d0 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62  o remove the tab
139e0 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  le from the mast
139f0 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e  er table.  ** on
13a00 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20   disk..  */.  v 
13a10 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
13a20 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
13a30 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
13a40 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
13a50 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
13a60 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
13a70 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28  ClearStatTables(
13a80 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62  pParse, iDb, "tb
13a90 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  l", pTab->zName)
13aa0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44  ;.    sqlite3FkD
13ab0 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ropTable(pParse,
13ac0 20 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20   pName, pTab);. 
13ad0 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72     sqlite3CodeDr
13ae0 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
13af0 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65  pTab, iDb, isVie
13b00 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72  w);.  }..exit_dr
13b10 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69  op_table:.  sqli
13b20 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
13b30 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
13b40 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
13b50 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
13b60 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
13b70 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
13b80 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
13b90 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
13ba0 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
13bb0 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
13bc0 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
13bd0 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
13be0 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
13bf0 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
13c00 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
13c10 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
13c20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
13c30 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
13c40 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
13c50 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
13c60 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 28 61  e referred to (a
13c70 2e 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74  .k.a the "parent
13c80 22 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f  " table).  pToCo
13c90 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f  l is a list.** o
13ca0 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
13cb0 70 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65  parent pTo table
13cc0 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e  .  flags contain
13cd0 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61  s all.** informa
13ce0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
13cf0 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69  onflict resoluti
13d00 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70  on algorithms sp
13d10 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68  ecified.** in th
13d20 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20  e ON DELETE, ON 
13d30 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e  UPDATE and ON IN
13d40 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SERT clauses..**
13d50 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75  .** An FKey stru
13d60 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64  cture is created
13d70 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68   and added to th
13d80 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
13d90 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74  y.** under const
13da0 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ruction in the p
13db0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
13dc0 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   field..**.** Th
13dd0 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73  e foreign key is
13de0 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41   set for IMMEDIA
13df0 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  TE processing.  
13e00 41 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  A subsequent cal
13e10 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44  l.** to sqlite3D
13e20 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29  eferForeignKey()
13e30 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
13e40 69 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a  is to DEFERRED..
13e50 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
13e60 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28  reateForeignKey(
13e70 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
13e80 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
13e90 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
13ea0 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43  ExprList *pFromC
13eb0 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ol,  /* Columns 
13ec0 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68  in this table th
13ed0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65  at point to othe
13ee0 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b  r table */.  Tok
13ef0 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20  en *pTo,        
13f00 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
13f10 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
13f20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43    ExprList *pToC
13f30 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol,    /* Column
13f40 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74  s in the other t
13f50 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  able */.  int fl
13f60 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
13f70 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  * Conflict resol
13f80 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
13f90 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  . */.){.  sqlite
13fa0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
13fb0 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
13fc0 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
13fd0 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65  KEY.  FKey *pFKe
13fe0 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70  y = 0;.  FKey *p
13ff0 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20  NextTo;.  Table 
14000 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  *p = pParse->pNe
14010 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42  wTable;.  int nB
14020 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  yte;.  int i;.  
14030 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72  int nCol;.  char
14040 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *z;..  assert( 
14050 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  pTo!=0 );.  if( 
14060 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  p==0 || IN_DECLA
14070 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66  RE_VTAB ) goto f
14080 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72  k_end;.  if( pFr
14090 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
140a0 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43  int iCol = p->nC
140b0 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45  ol-1;.    if( NE
140c0 56 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f  VER(iCol<0) ) go
140d0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69  to fk_end;.    i
140e0 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
140f0 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b  Col->nExpr!=1 ){
14100 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
14110 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14120 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25  foreign key on %
14130 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68  s".         " sh
14140 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f  ould reference o
14150 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f  nly one column o
14160 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20  f table %T",.   
14170 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43        p->aCol[iC
14180 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b  ol].zName, pTo);
14190 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  .      goto fk_e
141a0 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  nd;.    }.    nC
141b0 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ol = 1;.  }else 
141c0 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
141d0 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72  oCol->nExpr!=pFr
141e0 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a  omCol->nExpr ){.
141f0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14200 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
14210 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63      "number of c
14220 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67  olumns in foreig
14230 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  n key does not m
14240 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
14250 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f  of ".        "co
14260 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66  lumns in the ref
14270 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b  erenced table");
14280 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
14290 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
142a0 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Col = pFromCol->
142b0 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79  nExpr;.  }.  nBy
142c0 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b  te = sizeof(*pFK
142d0 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73  ey) + (nCol-1)*s
142e0 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f  izeof(pFKey->aCo
142f0 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b  l[0]) + pTo->n +
14300 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c   1;.  if( pToCol
14310 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
14320 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72   i<pToCol->nExpr
14330 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42  ; i++){.      nB
14340 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74  yte += sqlite3St
14350 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61  rlen30(pToCol->a
14360 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a  [i].zName) + 1;.
14370 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65      }.  }.  pFKe
14380 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  y = sqlite3DbMal
14390 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
143a0 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79  e );.  if( pFKey
143b0 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ==0 ){.    goto 
143c0 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46  fk_end;.  }.  pF
143d0 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a  Key->pFrom = p;.
143e0 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72    pFKey->pNextFr
143f0 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20  om = p->pFKey;. 
14400 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b   z = (char*)&pFK
14410 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a  ey->aCol[nCol];.
14420 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a    pFKey->zTo = z
14430 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54  ;.  memcpy(z, pT
14440 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20  o->z, pTo->n);. 
14450 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a   z[pTo->n] = 0;.
14460 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
14470 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d  (z);.  z += pTo-
14480 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e  >n+1;.  pFKey->n
14490 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66  Col = nCol;.  if
144a0 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
144b0 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  .    pFKey->aCol
144c0 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e  [0].iFrom = p->n
144d0 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Col-1;.  }else{.
144e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
144f0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
14500 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
14510 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c  r(j=0; j<p->nCol
14520 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
14530 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
14540 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  mp(p->aCol[j].zN
14550 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61  ame, pFromCol->a
14560 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
14570 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79  .          pFKey
14580 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20  ->aCol[i].iFrom 
14590 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = j;.          b
145a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
145b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
145c0 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a  ( j>=p->nCol ){.
145d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
145e0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
145f0 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e  .          "unkn
14600 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c  own column \"%s\
14610 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  " in foreign key
14620 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20   definition", . 
14630 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f           pFromCo
14640 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
14650 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f          goto fk_
14660 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  end;.      }.   
14670 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f   }.  }.  if( pTo
14680 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
14690 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
146a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
146b0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
146c0 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
146d0 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  me);.      pFKey
146e0 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d  ->aCol[i].zCol =
146f0 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   z;.      memcpy
14700 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  (z, pToCol->a[i]
14710 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  .zName, n);.    
14720 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20    z[n] = 0;.    
14730 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20    z += n+1;.    
14740 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69  }.  }.  pFKey->i
14750 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20  sDeferred = 0;. 
14760 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b   pFKey->aAction[
14770 30 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20  0] = (u8)(flags 
14780 26 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20  & 0xff);        
14790 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45      /* ON DELETE
147a0 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b   action */.  pFK
147b0 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d  ey->aAction[1] =
147c0 20 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20   (u8)((flags >> 
147d0 38 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20  8 ) & 0xff);    
147e0 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74  /* ON UPDATE act
147f0 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ion */..  assert
14800 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
14810 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
14820 70 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  p->pSchema) );. 
14830 20 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79   pNextTo = (FKey
14840 20 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e   *)sqlite3HashIn
14850 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61  sert(&p->pSchema
14860 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20  ->fkeyHash, .   
14870 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73     pFKey->zTo, s
14880 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
14890 46 4b 65 79 2d 3e 7a 54 6f 29 2c 20 28 76 6f 69  FKey->zTo), (voi
148a0 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20  d *)pFKey.  );. 
148b0 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46   if( pNextTo==pF
148c0 4b 65 79 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  Key ){.    db->m
148d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
148e0 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
148f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 78  ;.  }.  if( pNex
14900 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tTo ){.    asser
14910 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65  t( pNextTo->pPre
14920 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46  vTo==0 );.    pF
14930 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70  Key->pNextTo = p
14940 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78  NextTo;.    pNex
14950 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70  tTo->pPrevTo = p
14960 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  FKey;.  }..  /* 
14970 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e  Link the foreign
14980 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c   key to the tabl
14990 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74  e as the last st
149a0 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46  ep..  */.  p->pF
149b0 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70  Key = pFKey;.  p
149c0 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e  FKey = 0;..fk_en
149d0 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  d:.  sqlite3DbFr
149e0 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23  ee(db, pFKey);.#
149f0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
14a00 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  d(SQLITE_OMIT_FO
14a10 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20  REIGN_KEY) */.  
14a20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
14a30 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43  elete(db, pFromC
14a40 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ol);.  sqlite3Ex
14a50 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
14a60 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a   pToCol);.}../*.
14a70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14a80 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
14a90 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  n INITIALLY IMME
14aa0 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c  DIATE or INITIAL
14ab0 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63  LY DEFERRED.** c
14ac0 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73  lause is seen as
14ad0 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69   part of a forei
14ae0 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
14af0 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72  n.  The isDeferr
14b00 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  ed.** parameter 
14b10 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c  is 1 for INITIAL
14b20 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20  LY DEFERRED and 
14b30 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  0 for INITIALLY 
14b40 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68  IMMEDIATE..** Th
14b50 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
14b60 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
14b70 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20  created foreign 
14b80 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a  key is adjusted.
14b90 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ** accordingly..
14ba0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
14bb0 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50  eferForeignKey(P
14bc0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
14bd0 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23  t isDeferred){.#
14be0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14bf0 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
14c00 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
14c10 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69  FKey *pFKey;.  i
14c20 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73  f( (pTab = pPars
14c30 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
14c40 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61   || (pFKey = pTa
14c50 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72  b->pFKey)==0 ) r
14c60 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
14c70 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c   isDeferred==0 |
14c80 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20  | isDeferred==1 
14c90 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32  ); /* EV: R-3032
14ca0 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b  3-21917 */.  pFK
14cb0 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d  ey->isDeferred =
14cc0 20 28 75 38 29 69 73 44 65 66 65 72 72 65 64 3b   (u8)isDeferred;
14cd0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
14ce0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
14cf0 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61  hat will erase a
14d00 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20  nd refill index 
14d10 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a  *pIdx.  This is.
14d20 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69  ** used to initi
14d30 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72  alize a newly cr
14d40 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74  eated index or t
14d50 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a  o recompute the.
14d60 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e  ** content of an
14d70 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e   index in respon
14d80 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20  se to a REINDEX 
14d90 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69  command..**.** i
14da0 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73  f memRootPage is
14db0 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69   not negative, i
14dc0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
14dd0 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a   index is newly.
14de0 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  ** created.  The
14df0 20 72 65 67 69 73 74 65 72 20 73 70 65 63 69 66   register specif
14e00 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61  ied by memRootPa
14e10 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a  ge contains the.
14e20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  ** root page num
14e30 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
14e40 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67  .  If memRootPag
14e50 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
14e60 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  hen.** the index
14e70 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
14e80 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61  and must be clea
14e90 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67  red before being
14ea0 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a   refilled and.**
14eb0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
14ec0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
14ed0 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d  ex is taken from
14ee0 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a   pIndex->tnum..*
14ef0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
14f00 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
14f10 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14f20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69  Index *pIndex, i
14f30 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b  nt memRootPage){
14f40 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
14f50 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
14f60 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74    /* The table t
14f70 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a  hat is indexed *
14f80 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
14f90 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20  Parse->nTab++;  
14fa0 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73     /* Btree curs
14fb0 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62  or used for pTab
14fc0 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d   */.  int iIdx =
14fd0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
14fe0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
14ff0 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49  rsor used for pI
15000 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53  ndex */.  int iS
15010 6f 72 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  orter;          
15020 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
15030 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 4f 70 65  or opened by Ope
15040 6e 53 6f 72 74 65 72 20 28 69 66 20 69 6e 20 75  nSorter (if in u
15050 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  se) */.  int add
15060 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
15070 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
15080 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f  ss of top of loo
15090 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 32  p */.  int addr2
150a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
150b0 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
150c0 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20   to jump to for 
150d0 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a  next iteration *
150e0 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20  /.  int tnum;   
150f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15100 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
15110 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  of index */.  in
15120 74 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 3b  t iPartIdxLabel;
15130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15140 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61 62  Jump to this lab
15150 65 6c 20 74 6f 20 73 6b 69 70 20 61 20 72 6f 77  el to skip a row
15160 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20   */.  Vdbe *v;  
15170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15180 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
15190 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20   code into this 
151a0 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
151b0 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  */.  KeyInfo *pK
151c0 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ey;             
151d0 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66      /* KeyInfo f
151e0 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  or index */.  in
151f0 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20  t regRecord;    
15200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15210 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
15220 20 61 73 73 65 6d 62 6c 69 65 64 20 69 6e 64 65   assemblied inde
15230 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
15240 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
15250 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20  se->db;      /* 
15260 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
15270 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
15280 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
15290 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
152a0 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29  pIndex->pSchema)
152b0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
152c0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
152d0 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74  TION.  if( sqlit
152e0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
152f0 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44  se, SQLITE_REIND
15300 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  EX, pIndex->zNam
15310 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e  e, 0,.      db->
15320 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29  aDb[iDb].zName )
15330 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
15340 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
15350 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65   Require a write
15360 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62  -lock on the tab
15370 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68  le to perform th
15380 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a  is operation */.
15390 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
153a0 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
153b0 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70  pTab->tnum, 1, p
153c0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
153d0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
153e0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
153f0 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
15400 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61  .  if( memRootPa
15410 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75  ge>=0 ){.    tnu
15420 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b  m = memRootPage;
15430 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e  .  }else{.    tn
15440 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75  um = pIndex->tnu
15450 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20  m;.  }.  pKey = 
15460 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66  sqlite3KeyInfoOf
15470 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
15480 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  ndex);..  /* Ope
15490 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72  n the sorter cur
154a0 73 6f 72 20 69 66 20 77 65 20 61 72 65 20 74 6f  sor if we are to
154b0 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69   use one. */.  i
154c0 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d  Sorter = pParse-
154d0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74  >nTab++;.  sqlit
154e0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
154f0 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69  OP_SorterOpen, i
15500 53 6f 72 74 65 72 2c 20 30 2c 20 30 2c 20 28 63  Sorter, 0, 0, (c
15510 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20  har*).          
15520 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15530 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79  3KeyInfoRef(pKey
15540 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a  ), P4_KEYINFO);.
15550 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74  .  /* Open the t
15560 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75  able. Loop throu
15570 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74  gh all rows of t
15580 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72 74  he table, insert
15590 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72  ing index.  ** r
155a0 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20  ecords into the 
155b0 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c  sorter. */.  sql
155c0 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
155d0 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
155e0 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
155f0 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  ad);.  addr1 = s
15600 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
15610 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
15620 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  Tab, 0); VdbeCov
15630 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67 52  erage(v);.  regR
15640 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
15650 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
15660 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 6e  );..  sqlite3Gen
15670 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50  erateIndexKey(pP
15680 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54 61 62  arse,pIndex,iTab
15690 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26 69 50  ,regRecord,0,&iP
156a0 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29  artIdxLabel,0,0)
156b0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
156c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74  ddOp2(v, OP_Sort
156d0 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74 65  erInsert, iSorte
156e0 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  r, regRecord);. 
156f0 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50   sqlite3ResolveP
15700 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72  artIdxLabel(pPar
15710 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65  se, iPartIdxLabe
15720 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l);.  sqlite3Vdb
15730 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
15740 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b  xt, iTab, addr1+
15750 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
15760 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  (v);.  sqlite3Vd
15770 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
15780 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52  dr1);.  if( memR
15790 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69  ootPage<0 ) sqli
157a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
157b0 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c   OP_Clear, tnum,
157c0 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
157d0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
157e0 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78  _OpenWrite, iIdx
157f0 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20  , tnum, iDb, .  
15800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15810 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20    (char *)pKey, 
15820 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73  P4_KEYINFO);.  s
15830 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
15840 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c  P5(v, OPFLAG_BUL
15850 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61  KCSR|((memRootPa
15860 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32  ge>=0)?OPFLAG_P2
15870 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64  ISREG:0));..  ad
15880 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
15890 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
158a0 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74 65  rterSort, iSorte
158b0 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72  r, 0); VdbeCover
158c0 61 67 65 28 76 29 3b 0a 20 20 61 73 73 65 72 74  age(v);.  assert
158d0 28 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d  ( pKey!=0 || db-
158e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
158f0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b   pParse->nErr );
15900 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f  .  if( pIndex->o
15910 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
15920 26 26 20 70 4b 65 79 21 3d 30 20 29 7b 0a 20 20  && pKey!=0 ){.  
15930 20 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74    int j2 = sqlit
15940 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
15950 72 28 76 29 20 2b 20 33 3b 0a 20 20 20 20 73 71  r(v) + 3;.    sq
15960 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15970 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6a  v, OP_Goto, 0, j
15980 32 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20  2);.    addr2 = 
15990 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
159a0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73  ntAddr(v);.    s
159b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
159c0 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Int(v, OP_Sorter
159d0 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74 65 72  Compare, iSorter
159e0 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72 64 2c  , j2, regRecord,
159f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15a00 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 2d 3e            pKey->
15a10 6e 46 69 65 6c 64 20 2d 20 70 49 6e 64 65 78 2d  nField - pIndex-
15a20 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43  >nKeyCol); VdbeC
15a30 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
15a40 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e  sqlite3UniqueCon
15a50 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
15a60 4f 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64 65 78  OE_Abort, pIndex
15a70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
15a80 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
15a90 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
15aa0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
15ab0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15ac0 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f  _SorterData, iSo
15ad0 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29  rter, regRecord)
15ae0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
15af0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp3(v, OP_IdxI
15b00 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67  nsert, iIdx, reg
15b10 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 73 71  Record, 1);.  sq
15b20 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
15b30 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
15b40 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
15b50 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
15b60 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
15b70 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
15b80 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15b90 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53  P_SorterNext, iS
15ba0 6f 72 74 65 72 2c 20 61 64 64 72 32 29 3b 20 56  orter, addr2); V
15bb0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
15bc0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
15bd0 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
15be0 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ..  sqlite3VdbeA
15bf0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
15c00 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69  e, iTab);.  sqli
15c10 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
15c20 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29   OP_Close, iIdx)
15c30 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
15c40 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
15c50 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a  e, iSorter);.}..
15c60 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68  /*.** Allocate h
15c70 65 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c  eap space to hol
15c80 64 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63  d an Index objec
15c90 74 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75  t with nCol colu
15ca0 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65  mns..**.** Incre
15cb0 61 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  ase the allocati
15cc0 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69  on size to provi
15cd0 64 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74  de an extra nExt
15ce0 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38  ra bytes.** of 8
15cf0 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70  -byte aligned sp
15d00 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e  ace after the In
15d10 64 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  dex object and r
15d20 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74  eturn a.** point
15d30 65 72 20 74 6f 20 74 68 69 73 20 65 78 74 72 61  er to this extra
15d40 20 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74   space in *ppExt
15d50 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  ra..*/.Index *sq
15d60 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64  lite3AllocateInd
15d70 65 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69  exObject(.  sqli
15d80 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
15d90 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
15da0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36  nection */.  i16
15db0 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   nCol,          
15dc0 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
15dd0 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
15de0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
15df0 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
15e00 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15e10 20 62 79 74 65 73 20 6f 66 20 65 78 74 72 61 20   bytes of extra 
15e20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a  space to alloc *
15e30 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74  /.  char **ppExt
15e40 72 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ra       /* Poin
15e50 74 65 72 20 74 6f 20 74 68 65 20 22 65 78 74 72  ter to the "extr
15e60 61 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20  a" space */.){. 
15e70 20 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20   Index *p;      
15e80 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
15e90 65 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ed index object 
15ea0 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
15eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
15ec0 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
15ed0 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61  Index object + a
15ee0 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74  rrays */..  nByt
15ef0 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e = ROUND8(sizeo
15f00 66 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20  f(Index)) +     
15f10 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
15f20 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a  x structure  */.
15f30 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38            ROUND8
15f40 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e  (sizeof(char*)*n
15f50 43 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f  Col) +         /
15f60 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20  * Index.azColl  
15f70 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
15f80 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 74 52  ROUND8(sizeof(tR
15f90 6f 77 63 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 20  owcnt)*(nCol+1) 
15fa0 2b 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69  +    /* Index.ai
15fb0 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20 20 20 20  RowEst   */.    
15fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
15fd0 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 20 2b 20  eof(i16)*nCol + 
15fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
15ff0 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a  dex.aiColumn   *
16000 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
16010 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43     sizeof(u8)*nC
16020 6f 6c 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ol);            
16030 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f   /* Index.aSortO
16040 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d 20 73 71  rder */.  p = sq
16050 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
16060 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b 20 6e 45  o(db, nByte + nE
16070 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20 29  xtra);.  if( p )
16080 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 45 78 74  {.    char *pExt
16090 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29 2b  ra = ((char*)p)+
160a0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e  ROUND8(sizeof(In
160b0 64 65 78 29 29 3b 0a 20 20 20 20 70 2d 3e 61 7a  dex));.    p->az
160c0 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 70  Coll = (char**)p
160d0 45 78 74 72 61 3b 20 20 20 20 20 20 70 45 78 74  Extra;      pExt
160e0 72 61 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a  ra += ROUND8(siz
160f0 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29  eof(char*)*nCol)
16100 3b 0a 20 20 20 20 70 2d 3e 61 69 52 6f 77 45 73  ;.    p->aiRowEs
16110 74 20 3d 20 28 74 52 6f 77 63 6e 74 2a 29 70 45  t = (tRowcnt*)pE
16120 78 74 72 61 3b 20 20 70 45 78 74 72 61 20 2b 3d  xtra;  pExtra +=
16130 20 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29   sizeof(tRowcnt)
16140 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70  *(nCol+1);.    p
16150 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31  ->aiColumn = (i1
16160 36 2a 29 70 45 78 74 72 61 3b 20 20 20 20 20 20  6*)pExtra;      
16170 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66  pExtra += sizeof
16180 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20  (i16)*nCol;.    
16190 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  p->aSortOrder = 
161a0 28 75 38 2a 29 70 45 78 74 72 61 3b 0a 20 20 20  (u8*)pExtra;.   
161b0 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43   p->nColumn = nC
161c0 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43  ol;.    p->nKeyC
161d0 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20  ol = nCol - 1;. 
161e0 20 20 20 2a 70 70 45 78 74 72 61 20 3d 20 28 28     *ppExtra = ((
161f0 63 68 61 72 2a 29 70 29 20 2b 20 6e 42 79 74 65  char*)p) + nByte
16200 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
16210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
16220 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f  e a new index fo
16230 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20  r an SQL table. 
16240 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69   pName1.pName2 i
16250 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
16260 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20  e index .** and 
16270 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20  pTblList is the 
16280 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
16290 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20  e that is to be 
162a0 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77  indexed.  Both w
162b0 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20  ill .** be NULL 
162c0 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65  for a primary ke
162d0 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68  y or an index th
162e0 61 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f  at is created to
162f0 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e   satisfy a.** UN
16300 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e  IQUE constraint.
16310 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20    If pTable and 
16320 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c  pIndex are NULL,
16330 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   use pParse->pNe
16340 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65  wTable.** as the
16350 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64   table to be ind
16360 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70  exed.  pParse->p
16370 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61  NewTable is a ta
16380 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63  ble that is.** c
16390 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63  urrently being c
163a0 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20  onstructed by a 
163b0 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
163c0 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c  tement..**.** pL
163d0 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
163e0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
163f0 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77  ndexed.  pList w
16400 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74  ill be NULL if t
16410 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d  his.** is a prim
16420 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75  ary key or uniqu
16430 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e-constraint on 
16440 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
16450 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20  column added.** 
16460 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
16470 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
16480 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a  struction.  .**.
16490 2a 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  ** If the index 
164a0 69 73 20 63 72 65 61 74 65 64 20 73 75 63 63 65  is created succe
164b0 73 73 66 75 6c 6c 79 2c 20 72 65 74 75 72 6e 20  ssfully, return 
164c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
164d0 20 6e 65 77 20 49 6e 64 65 78 0a 2a 2a 20 73 74   new Index.** st
164e0 72 75 63 74 75 72 65 2e 20 54 68 69 73 20 69 73  ructure. This is
164f0 20 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33   used by sqlite3
16500 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 29 20  AddPrimaryKey() 
16510 74 6f 20 6d 61 72 6b 20 74 68 65 20 69 6e 64 65  to mark the inde
16520 78 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  x.** as the tabl
16530 65 73 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28  es primary key (
16540 49 6e 64 65 78 2e 61 75 74 6f 49 6e 64 65 78 3d  Index.autoIndex=
16550 3d 32 29 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  =2)..*/.Index *s
16560 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
16570 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
16580 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69  se,     /* All i
16590 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
165a0 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20   this parse */. 
165b0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
165c0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72      /* First par
165d0 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
165e0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
165f0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
16600 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70       /* Second p
16610 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
16620 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
16630 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62  /.  SrcList *pTb
16640 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20  lName, /* Table 
16650 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50  to index. Use pP
16660 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
16670 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69  if 0 */.  ExprLi
16680 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
16690 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  A list of column
166a0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
166b0 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
166c0 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62  ,       /* OE_Ab
166d0 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  ort, OE_Ignore, 
166e0 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f  OE_Replace, or O
166f0 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65  E_None */.  Toke
16700 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f  n *pStart,     /
16710 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
16720 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
16730 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  his statement */
16740 0a 20 20 45 78 70 72 20 2a 70 50 49 57 68 65 72  .  Expr *pPIWher
16750 65 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63  e,    /* WHERE c
16760 6c 61 75 73 65 20 66 6f 72 20 70 61 72 74 69 61  lause for partia
16770 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  l indices */.  i
16780 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20  nt sortOrder,   
16790 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20    /* Sort order 
167a0 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77  of primary key w
167b0 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20  hen pList==NULL 
167c0 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78  */.  int ifNotEx
167d0 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20  ist     /* Omit 
167e0 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61  error if index a
167f0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
16800 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 52 65  .){.  Index *pRe
16810 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 6f  t = 0;     /* Po
16820 69 6e 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20  inter to return 
16830 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
16840 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62   = 0;     /* Tab
16850 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
16860 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
16870 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  dex = 0;   /* Th
16880 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72  e index to be cr
16890 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eated */.  char 
168a0 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  *zName = 0;     
168b0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
168c0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  ndex */.  int nN
168d0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
168e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
168f0 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20  acters in zName 
16900 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  */.  int i, j;. 
16910 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
16920 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73        /* For ass
16930 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  igning database 
16940 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20  names to pTable 
16950 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
16960 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74  erMask;   /* 1 t
16970 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20  o honor DESC in 
16980 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e  index.  0 to ign
16990 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ore. */.  sqlite
169a0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
169b0 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  db;.  Db *pDb;  
169c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
169d0 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65  e specific table
169e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
169f0 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65  indexed database
16a00 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
16a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
16a20 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
16a30 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e  ase that is bein
16a40 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54  g written */.  T
16a50 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
16a60 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
16a70 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  ed name of the i
16a80 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a  ndex to create *
16a90 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
16aa0 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49  ist_item *pListI
16ab0 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  tem; /* For loop
16ac0 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a  ing over pList *
16ad0 2f 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e  /.  const Column
16ae0 20 2a 70 54 61 62 43 6f 6c 3b 20 20 20 20 20 20   *pTabCol;      
16af0 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e       /* A column
16b00 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
16b10 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20  .  int nExtra = 
16b20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
16b30 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c      /* Space all
16b40 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78 74 72  ocated for zExtr
16b50 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  a[] */.  int nEx
16b60 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  traCol;         
16b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16b80 62 65 72 20 6f 66 20 65 78 74 72 61 20 63 6f 6c  ber of extra col
16b90 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20  umns needed */. 
16ba0 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20 3d 20   char *zExtra = 
16bb0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
16bc0 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65    /* Extra space
16bd0 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65 78   after the Index
16be0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64   object */.  Ind
16bf0 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20  ex *pPk = 0;    
16c00 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    /* PRIMARY KEY
16c10 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f   index for WITHO
16c20 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20  UT ROWID tables 
16c30 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
16c40 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
16c50 20 20 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63        /* Never c
16c60 61 6c 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72  alled with prior
16c70 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28   errors */.  if(
16c80 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
16c90 64 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f  d || IN_DECLARE_
16ca0 56 54 41 42 20 29 7b 0a 20 20 20 20 67 6f 74 6f  VTAB ){.    goto
16cb0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
16cc0 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51  ex;.  }.  if( SQ
16cd0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
16ce0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
16cf0 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
16d00 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
16d10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
16d20 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   Find the table 
16d30 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e  that is to be in
16d40 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65  dexed.  Return e
16d50 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e  arly if not foun
16d60 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  d..  */.  if( pT
16d70 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20  blName!=0 ){..  
16d80 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f    /* Use the two
16d90 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65  -part index name
16da0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
16db0 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
16dc0 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72  ** to search for
16dd0 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78   the table. 'Fix
16de0 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  ' the table name
16df0 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20   to this db.    
16e00 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e  ** before lookin
16e10 67 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a  g up the table..
16e20 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
16e30 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61  t( pName1 && pNa
16e40 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d  me2 );.    iDb =
16e50 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
16e60 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
16e70 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
16e80 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  me);.    if( iDb
16e90 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  <0 ) goto exit_c
16ea0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
16eb0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 20 26   assert( pName &
16ec0 26 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23  & pName->z );..#
16ed0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16ee0 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a  IT_TEMPDB.    /*
16ef0 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   If the index na
16f00 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69  me was unqualifi
16f10 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65  ed, check if the
16f20 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73   table.    ** is
16f30 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49   a temp table. I
16f40 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61  f so, set the da
16f50 74 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20  tabase to 1. Do 
16f60 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20  not do this.    
16f70 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69  ** if initialisi
16f80 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 73 63  ng a database sc
16f90 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  hema..    */.   
16fa0 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
16fb0 75 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61  usy ){.      pTa
16fc0 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  b = sqlite3SrcLi
16fd0 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  stLookup(pParse,
16fe0 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20   pTblName);.    
16ff0 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d    if( pName2->n=
17000 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70 54  =0 && pTab && pT
17010 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d  ab->pSchema==db-
17020 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
17030 29 7b 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d  ){.        iDb =
17040 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
17050 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 71  }.#endif..    sq
17060 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
17070 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
17080 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29   "index", pName)
17090 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
170a0 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69  3FixSrcList(&sFi
170b0 78 2c 20 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a  x, pTblName) ){.
170c0 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
170d0 20 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e 73   the parser cons
170e0 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65 20  tructs pTblName 
170f0 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64  from a single id
17100 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20 20  entifier,.      
17110 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  ** sqlite3FixSrc
17120 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20 66  List can never f
17130 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ail. */.      as
17140 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20  sert(0);.    }. 
17150 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
17160 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d  3LocateTableItem
17170 28 70 50 61 72 73 65 2c 20 30 2c 20 26 70 54 62  (pParse, 0, &pTb
17180 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20  lName->a[0]);.  
17190 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
171a0 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c  llocFailed==0 ||
171b0 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20   pTab==0 );.    
171c0 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f  if( pTab==0 ) go
171d0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
171e0 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 69 44  ndex;.    if( iD
171f0 62 3d 3d 31 20 26 26 20 64 62 2d 3e 61 44 62 5b  b==1 && db->aDb[
17200 69 44 62 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54  iDb].pSchema!=pT
17210 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  ab->pSchema ){. 
17220 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
17230 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
17240 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74           "cannot
17250 20 63 72 65 61 74 65 20 61 20 54 45 4d 50 20 69   create a TEMP i
17260 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50  ndex on non-TEMP
17270 20 74 61 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a   table \"%s\"",.
17280 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
17290 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67  >zName);.      g
172a0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
172b0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
172c0 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70   if( !HasRowid(p
172d0 54 61 62 29 20 29 20 70 50 6b 20 3d 20 73 71 6c  Tab) ) pPk = sql
172e0 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
172f0 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c  dex(pTab);.  }el
17300 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
17310 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20  pName==0 );.    
17320 61 73 73 65 72 74 28 20 70 53 74 61 72 74 3d 3d  assert( pStart==
17330 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  0 );.    pTab = 
17340 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
17350 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  e;.    if( !pTab
17360 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
17370 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
17380 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
17390 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
173a0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
173b0 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  }.  pDb = &db->a
173c0 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65  Db[iDb];..  asse
173d0 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
173e0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
173f0 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66  >nErr==0 );.  if
17400 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
17410 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
17420 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20  sqlite_", 7)==0 
17430 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
17440 65 33 53 74 72 4e 49 43 6d 70 28 26 70 54 61 62  e3StrNICmp(&pTab
17450 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65  ->zName[7],"alte
17460 72 74 61 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a  rtab_",9)!=0 ){.
17470 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
17480 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
17490 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
174a0 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d   indexed", pTab-
174b0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
174c0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
174d0 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  dex;.  }.#ifndef
174e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
174f0 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53  W.  if( pTab->pS
17500 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
17510 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17520 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20  rse, "views may 
17530 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
17540 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
17550 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
17560 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  }.#endif.#ifndef
17570 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
17580 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
17590 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
175a0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
175b0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
175c0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d  virtual tables m
175d0 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
175e0 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
175f0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
17600 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
17610 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
17620 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
17630 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  x.  Make sure th
17640 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  ere is not alrea
17650 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20  dy another.  ** 
17660 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77  index or table w
17670 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
17680 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  e.  .  **.  ** E
17690 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65  xception:  If we
176a0 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
176b0 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e   names of perman
176c0 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d  ent indices from
176d0 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
176e0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62  _master table (b
176f0 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65  ecause some othe
17700 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65  r process change
17710 64 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e  d the schema) an
17720 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  d.  ** one of th
17730 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f  e index names co
17740 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20  llides with the 
17750 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72  name of a tempor
17760 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a  ary table or.  *
17770 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65  * index, then we
17780 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74   will continue t
17790 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69  o process this i
177a0 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ndex..  **.  ** 
177b0 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  If pName==0 it m
177c0 65 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65  eans that we are
177d0 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69  .  ** dealing wi
177e0 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  th a primary key
177f0 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
17800 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20  raint.  We have 
17810 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20  to invent our.  
17820 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a  ** own name..  *
17830 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  /.  if( pName ){
17840 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
17850 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
17860 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
17870 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
17880 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
17890 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
178a0 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30  ert( pName->z!=0
178b0 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49   );.    if( SQLI
178c0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
178d0 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
178e0 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
178f0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
17900 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
17910 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d    }.    if( !db-
17920 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
17930 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
17940 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
17950 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20  me, 0)!=0 ){.   
17960 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
17970 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68  rMsg(pParse, "th
17980 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
17990 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22   table named %s"
179a0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
179b0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
179c0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
179d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
179e0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
179f0 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d  (db, zName, pDb-
17a00 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20  >zName)!=0 ){.  
17a10 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78      if( !ifNotEx
17a20 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ist ){.        s
17a30 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
17a40 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73  Parse, "index %s
17a50 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
17a60 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
17a70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
17a80 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74  ssert( !db->init
17a90 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20  .busy );.       
17aa0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
17ab0 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
17ac0 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
17ad0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
17ae0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
17af0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
17b00 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78  int n;.    Index
17b10 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72   *pLoop;.    for
17b20 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e  (pLoop=pTab->pIn
17b30 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b  dex, n=1; pLoop;
17b40 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e   pLoop=pLoop->pN
17b50 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  ext, n++){}.    
17b60 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  zName = sqlite3M
17b70 50 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69  Printf(db, "sqli
17b80 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f  te_autoindex_%s_
17b90 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %d", pTab->zName
17ba0 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  , n);.    if( zN
17bb0 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
17bc0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
17bd0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
17be0 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  }..  /* Check fo
17bf0 72 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  r authorization 
17c00 74 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64  to create an ind
17c10 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ex..  */.#ifndef
17c20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
17c30 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20  HORIZATION.  {. 
17c40 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
17c50 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b  Db = pDb->zName;
17c60 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
17c70 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
17c80 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
17c90 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
17ca0 62 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  b), 0, zDb) ){. 
17cb0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
17cc0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
17cd0 20 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54   }.    i = SQLIT
17ce0 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a  E_CREATE_INDEX;.
17cf0 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
17d00 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29  MPDB && iDb==1 )
17d10 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
17d20 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  TE_TEMP_INDEX;. 
17d30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
17d40 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
17d50 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i, zName, pTab->
17d60 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20  zName, zDb) ){. 
17d70 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
17d80 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
17d90 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
17da0 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c   /* If pList==0,
17db0 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72   it means this r
17dc0 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
17dd0 64 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d  d to make a prim
17de0 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74  ary.  ** key out
17df0 20 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c   of the last col
17e00 75 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65  umn added to the
17e10 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
17e20 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  struction..  ** 
17e30 53 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65  So create a fake
17e40 20 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74   list to simulat
17e50 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69  e this..  */.  i
17e60 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
17e70 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
17e80 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
17e90 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a  (pParse, 0, 0);.
17ea0 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
17eb0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
17ec0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70  ate_index;.    p
17ed0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  List->a[0].zName
17ee0 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
17ef0 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  up(pParse->db,. 
17f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
17f30 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e  l[pTab->nCol-1].
17f40 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73  zName);.    pLis
17f50 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  t->a[0].sortOrde
17f60 72 20 3d 20 28 75 38 29 73 6f 72 74 4f 72 64 65  r = (u8)sortOrde
17f70 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  r;.  }..  /* Fig
17f80 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
17f90 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
17fa0 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
17fb0 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79  store explicitly
17fc0 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20  .  ** specified 
17fd0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
17fe0 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20  ce names..  */. 
17ff0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
18000 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
18010 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
18020 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
18030 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78  xpr;.    if( pEx
18040 70 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  pr ){.      asse
18050 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
18060 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20  K_COLLATE );.   
18070 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20     nExtra += (1 
18080 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  + sqlite3Strlen3
18090 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  0(pExpr->u.zToke
180a0 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  n));.    }.  }..
180b0 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63    /* .  ** Alloc
180c0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74  ate the index st
180d0 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20  ructure. .  */. 
180e0 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
180f0 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
18100 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70  .  nExtraCol = p
18110 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f  Pk ? pPk->nKeyCo
18120 6c 20 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78 20  l : 1;.  pIndex 
18130 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74  = sqlite3Allocat
18140 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c  eIndexObject(db,
18150 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20   pList->nExpr + 
18160 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20  nExtraCol,.     
18170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18190 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61 20   nName + nExtra 
181a0 2b 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20  + 1, &zExtra);. 
181b0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
181c0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
181d0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
181e0 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  dex;.  }.  asser
181f0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
18200 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e  IGNMENT(pIndex->
18210 61 69 52 6f 77 45 73 74 29 20 29 3b 0a 20 20 61  aiRowEst) );.  a
18220 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
18230 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64  E_ALIGNMENT(pInd
18240 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20  ex->azColl) );. 
18250 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d   pIndex->zName =
18260 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72   zExtra;.  zExtr
18270 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a  a += nName + 1;.
18280 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d    memcpy(pIndex-
18290 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e  >zName, zName, n
182a0 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65  Name+1);.  pInde
182b0 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
182c0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  ;.  pIndex->onEr
182d0 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ror = (u8)onErro
182e0 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69  r;.  pIndex->uni
182f0 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72  qNotNull = onErr
18300 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70  or!=OE_None;.  p
18310 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78  Index->autoIndex
18320 20 3d 20 28 75 38 29 28 70 4e 61 6d 65 3d 3d 30   = (u8)(pName==0
18330 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63  );.  pIndex->pSc
18340 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
18350 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70  Db].pSchema;.  p
18360 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d  Index->nKeyCol =
18370 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
18380 20 69 66 28 20 70 50 49 57 68 65 72 65 20 29 7b   if( pPIWhere ){
18390 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
183a0 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65  lveSelfReference
183b0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e  (pParse, pTab, N
183c0 43 5f 50 61 72 74 49 64 78 2c 20 70 50 49 57 68  C_PartIdx, pPIWh
183d0 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e  ere, 0);.    pIn
183e0 64 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  dex->pPartIdxWhe
183f0 72 65 20 3d 20 70 50 49 57 68 65 72 65 3b 0a 20  re = pPIWhere;. 
18400 20 20 20 70 50 49 57 68 65 72 65 20 3d 20 30 3b     pPIWhere = 0;
18410 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
18420 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
18430 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
18440 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ) );..  /* Check
18450 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73 68   to see if we sh
18460 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20  ould honor DESC 
18470 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65  requests on inde
18480 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20  x columns.  */. 
18490 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
184a0 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  a->file_format>=
184b0 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  4 ){.    sortOrd
184c0 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f  erMask = -1;   /
184d0 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a  * Honor DESC */.
184e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72    }else{.    sor
184f0 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20  tOrderMask = 0; 
18500 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53     /* Ignore DES
18510 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  C */.  }..  /* S
18520 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  can the names of
18530 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
18540 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
18550 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a  indexed and.  **
18560 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e   load the column
18570 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68   indices into th
18580 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  e Index structur
18590 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  e.  Report an er
185a0 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  ror.  ** if any 
185b0 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f  column is not fo
185c0 75 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  und..  **.  ** T
185d0 4f 44 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74  ODO:  Add a test
185e0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
185f0 61 74 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75  at the same colu
18600 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a  mn is not named.
18610 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f    ** more than o
18620 6e 63 65 20 77 69 74 68 69 6e 20 74 68 65 20 73  nce within the s
18630 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79  ame index.  Only
18640 20 74 68 65 20 66 69 72 73 74 20 69 6e 73 74 61   the first insta
18650 6e 63 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  nce of.  ** the 
18660 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72  column will ever
18670 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20   be used by the 
18680 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65  optimizer.  Note
18690 20 74 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a   that using the.
186a0 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e    ** same column
186b0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20   more than once 
186c0 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72 72  cannot be an err
186d0 6f 72 20 62 65 63 61 75 73 65 20 74 68 61 74 20  or because that 
186e0 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65 61  would .  ** brea
186f0 6b 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  k backwards comp
18700 61 74 69 62 69 6c 69 74 79 20 2d 20 69 74 20 6e  atibility - it n
18710 65 65 64 73 20 74 6f 20 62 65 20 61 20 77 61 72  eeds to be a war
18720 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ning..  */.  for
18730 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d  (i=0, pListItem=
18740 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73  pList->a; i<pLis
18750 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
18760 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  ListItem++){.   
18770 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
18780 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65  lName = pListIte
18790 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e  m->zName;.    in
187a0 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  t requestedSortO
187b0 72 64 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a  rder;.    char *
187c0 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zColl;          
187d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
187e0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
187f0 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28  ame */..    for(
18800 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61  j=0, pTabCol=pTa
18810 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d  b->aCol; j<pTab-
18820 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62  >nCol; j++, pTab
18830 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  Col++){.      if
18840 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
18850 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43  (zColName, pTabC
18860 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  ol->zName)==0 ) 
18870 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
18880 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
18890 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
188a0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
188b0 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
188c0 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
188d0 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  d %s",.        p
188e0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Tab->zName, zCol
188f0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 50 61  Name);.      pPa
18900 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
18910 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
18920 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18930 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ex;.    }.    as
18940 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
18950 3c 3d 30 78 37 66 66 66 20 26 26 20 6a 3c 3d 30  <=0x7fff && j<=0
18960 78 37 66 66 66 20 29 3b 0a 20 20 20 20 70 49 6e  x7fff );.    pIn
18970 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
18980 20 3d 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 69   = (i16)j;.    i
18990 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  f( pListItem->pE
189a0 78 70 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  xpr ){.      int
189b0 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 61 73   nColl;.      as
189c0 73 65 72 74 28 20 70 4c 69 73 74 49 74 65 6d 2d  sert( pListItem-
189d0 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  >pExpr->op==TK_C
189e0 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20  OLLATE );.      
189f0 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65  zColl = pListIte
18a00 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  m->pExpr->u.zTok
18a10 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20  en;.      nColl 
18a20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
18a30 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20  0(zColl) + 1;.  
18a40 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 74      assert( nExt
18a50 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20  ra>=nColl );.   
18a60 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61     memcpy(zExtra
18a70 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b  , zColl, nColl);
18a80 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a  .      zColl = z
18a90 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78  Extra;.      zEx
18aa0 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20  tra += nColl;.  
18ab0 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43      nExtra -= nC
18ac0 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  oll;.    }else{.
18ad0 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54        zColl = pT
18ae0 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c  ab->aCol[j].zCol
18af0 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43  l;.      if( !zC
18b00 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42  oll ) zColl = "B
18b10 49 4e 41 52 59 22 3b 0a 20 20 20 20 7d 0a 20 20  INARY";.    }.  
18b20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
18b30 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65 33  busy && !sqlite3
18b40 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
18b50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  arse, zColl) ){.
18b60 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
18b70 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18b80 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
18b90 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c  azColl[i] = zCol
18ba0 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64  l;.    requested
18bb0 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73  SortOrder = pLis
18bc0 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  tItem->sortOrder
18bd0 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b   & sortOrderMask
18be0 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53  ;.    pIndex->aS
18bf0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75  ortOrder[i] = (u
18c00 38 29 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  8)requestedSortO
18c10 72 64 65 72 3b 0a 20 20 20 20 69 66 28 20 70 54  rder;.    if( pT
18c20 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e  ab->aCol[j].notN
18c30 75 6c 6c 3d 3d 30 20 29 20 70 49 6e 64 65 78 2d  ull==0 ) pIndex-
18c40 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30  >uniqNotNull = 0
18c50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 6b 20  ;.  }.  if( pPk 
18c60 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ){.    for(j=0; 
18c70 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  j<pPk->nKeyCol; 
18c80 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  j++){.      int 
18c90 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  x = pPk->aiColum
18ca0 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  n[j];.      if( 
18cb0 68 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65 78  hasColumn(pIndex
18cc0 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e 64  ->aiColumn, pInd
18cd0 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29 20  ex->nKeyCol, x) 
18ce0 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ){.        pInde
18cf0 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a 20  x->nColumn--; . 
18d00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18d10 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
18d20 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20 20  lumn[i] = x;.   
18d30 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43       pIndex->azC
18d40 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 7a  oll[i] = pPk->az
18d50 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
18d60 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
18d70 64 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61 53  der[i] = pPk->aS
18d80 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20  ortOrder[j];.   
18d90 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
18da0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
18db0 72 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e 6e  rt( i==pIndex->n
18dc0 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c 73  Column );.  }els
18dd0 65 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  e{.    pIndex->a
18de0 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 2d 31 3b  iColumn[i] = -1;
18df0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43  .    pIndex->azC
18e00 6f 6c 6c 5b 69 5d 20 3d 20 22 42 49 4e 41 52 59  oll[i] = "BINARY
18e10 22 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  ";.  }.  sqlite3
18e20 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49  DefaultRowEst(pI
18e30 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61  ndex);.  if( pPa
18e40 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d  rse->pNewTable==
18e50 30 20 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65  0 ) estimateInde
18e60 78 57 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a  xWidth(pIndex);.
18e70 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61  .  if( pTab==pPa
18e80 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29  rse->pNewTable )
18e90 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f  {.    /* This ro
18ea0 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63  utine has been c
18eb0 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
18ec0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
18ed0 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72  ex as a.    ** r
18ee0 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41  esult of a PRIMA
18ef0 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
18f00 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c   clause on a col
18f10 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20  umn definition, 
18f20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d  or.    ** a PRIM
18f30 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
18f40 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69  E clause followi
18f50 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65  ng the column de
18f60 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  finitions..    *
18f70 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20  * i.e. one of:. 
18f80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45     **.    ** CRE
18f90 41 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52  ATE TABLE t(x PR
18fa0 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20  IMARY KEY, y);. 
18fb0 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
18fc0 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55  LE t(x, y, UNIQU
18fd0 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a  E(x, y));.    **
18fe0 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77  .    ** Either w
18ff0 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ay, check to see
19000 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   if the table al
19010 72 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61  ready has such a
19020 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20  n index. If.    
19030 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74  ** so, don't bot
19040 68 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69  her creating thi
19050 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79  s one. This only
19060 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20   applies to.    
19070 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
19080 20 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73   created indices
19090 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61  . Users can do a
190a0 73 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68  s they wish with
190b0 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74  .    ** explicit
190c0 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a   indices..    **
190d0 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51  .    ** Two UNIQ
190e0 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45  UE or PRIMARY KE
190f0 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  Y constraints ar
19100 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75  e considered equ
19110 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28  ivalent.    ** (
19120 61 6e 64 20 74 68 75 73 20 73 75 70 70 72 65 73  and thus suppres
19130 73 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20  sing the second 
19140 6f 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68 65  one) even if the
19150 79 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74  y have different
19160 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64  .    ** sort ord
19170 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ers..    **.    
19180 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
19190 64 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74  different collat
191a0 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72  ing sequences or
191b0 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   if the columns 
191c0 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  of.    ** the co
191d0 6e 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69  nstraint occur i
191e0 6e 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65  n different orde
191f0 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  rs, then the con
19200 73 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20  straints are.   
19210 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64   ** considered d
19220 69 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68  istinct and both
19230 20 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72   result in separ
19240 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20  ate indices..   
19250 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
19260 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64  Idx;.    for(pId
19270 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
19280 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
19290 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
192a0 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  nt k;.      asse
192b0 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  rt( pIdx->onErro
192c0 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20  r!=OE_None );.  
192d0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
192e0 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20  ->autoIndex );. 
192f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
19300 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  dex->onError!=OE
19310 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20  _None );..      
19320 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  if( pIdx->nKeyCo
19330 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  l!=pIndex->nKeyC
19340 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ol ) continue;. 
19350 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
19360 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b  pIdx->nKeyCol; k
19370 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
19380 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20  st char *z1;.   
19390 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
193a0 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 69 66 28  *z2;.        if(
193b0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
193c0 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f  k]!=pIndex->aiCo
193d0 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b  lumn[k] ) break;
193e0 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49  .        z1 = pI
193f0 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20  dx->azColl[k];. 
19400 20 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64         z2 = pInd
19410 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20  ex->azColl[k];. 
19420 20 20 20 20 20 20 20 69 66 28 20 7a 31 21 3d 7a         if( z1!=z
19430 32 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  2 && sqlite3StrI
19440 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72  Cmp(z1, z2) ) br
19450 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
19460 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e     if( k==pIdx->
19470 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20  nKeyCol ){.     
19480 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
19490 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e  rror!=pIndex->on
194a0 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  Error ){.       
194b0 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74     /* This const
194c0 72 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68  raint creates th
194d0 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20  e same index as 
194e0 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20  a previous.     
194f0 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
19500 6e 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d  nt specified som
19510 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52  ewhere in the CR
19520 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
19530 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20  ment..          
19540 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f  ** However the O
19550 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
19560 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  es are different
19570 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a  . If both this .
19580 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e            ** con
19590 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20  straint and the 
195a0 70 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c  previous equival
195b0 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68  ent constraint h
195c0 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20  ave explicit.   
195d0 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e         ** ON CON
195e0 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68  FLICT clauses th
195f0 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20  is is an error. 
19600 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74  Otherwise, use t
19610 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
19620 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69  explicitly speci
19630 66 69 65 64 20 62 65 68 61 76 69 6f 72 20 66 6f  fied behavior fo
19640 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  r the index..   
19650 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
19660 20 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e      if( !(pIdx->
19670 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
19680 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f  ult || pIndex->o
19690 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
196a0 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  lt) ){.         
196b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
196c0 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
196d0 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e              "con
196e0 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46  flicting ON CONF
196f0 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65  LICT clauses spe
19700 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20  cified", 0);.   
19710 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19720 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45     if( pIdx->onE
19730 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
19740 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
19750 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  pIdx->onError = 
19760 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b  pIndex->onError;
19770 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
19780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
19790 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
197a0 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20  index;.      }. 
197b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c     }.  }..  /* L
197c0 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65  ink the new Inde
197d0 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  x structure to i
197e0 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20  ts table and to 
197f0 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69  the other.  ** i
19800 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
19810 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20  e structures. . 
19820 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
19830 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49  it.busy ){.    I
19840 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 61 73 73  ndex *p;.    ass
19850 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
19860 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
19870 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  0, pIndex->pSche
19880 6d 61 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73  ma) );.    p = s
19890 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
198a0 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  (&pIndex->pSchem
198b0 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20  a->idxHash, .   
198c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198d0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a         pIndex->z
198e0 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  Name, sqlite3Str
198f0 6c 65 6e 33 30 28 70 49 6e 64 65 78 2d 3e 7a 4e  len30(pIndex->zN
19900 61 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ame),.          
19910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19920 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  pIndex);.    if(
19930 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65   p ){.      asse
19940 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b  rt( p==pIndex );
19950 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
19960 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
19970 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
19980 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
19990 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
199a0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
199b0 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
199c0 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
199d0 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70  anges;.    if( p
199e0 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  TblName!=0 ){.  
199f0 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
19a00 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
19a10 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  num;.    }.  }..
19a20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
19a30 74 68 65 20 69 6e 69 74 69 61 6c 20 43 52 45 41  the initial CREA
19a40 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
19a50 6e 74 20 28 6f 72 20 43 52 45 41 54 45 20 54 41  nt (or CREATE TA
19a60 42 4c 45 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  BLE if the.  ** 
19a70 69 6e 64 65 78 20 69 73 20 61 6e 20 69 6d 70 6c  index is an impl
19a80 69 65 64 20 69 6e 64 65 78 20 66 6f 72 20 61 20  ied index for a 
19a90 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52  UNIQUE or PRIMAR
19aa0 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  Y KEY constraint
19ab0 29 20 74 68 65 6e 0a 20 20 2a 2a 20 65 6d 69 74  ) then.  ** emit
19ac0 20 63 6f 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74   code to allocat
19ad0 65 20 74 68 65 20 69 6e 64 65 78 20 72 6f 6f 74  e the index root
19ae0 70 61 67 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64  page on disk and
19af0 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66   make an entry f
19b00 6f 72 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  or.  ** the inde
19b10 78 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f  x in the sqlite_
19b20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
19b30 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 69 6e   populate the in
19b40 64 65 78 20 77 69 74 68 0a 20 20 2a 2a 20 63 6f  dex with.  ** co
19b50 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20  ntent.  But, do 
19b60 6e 6f 74 20 64 6f 20 74 68 69 73 20 69 66 20 77  not do this if w
19b70 65 20 61 72 65 20 73 69 6d 70 6c 79 20 72 65 61  e are simply rea
19b80 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
19b90 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c  master.  ** tabl
19ba0 65 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 73  e to parse the s
19bb0 63 68 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69  chema, or if thi
19bc0 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 50  s index is the P
19bd0 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
19be0 0a 20 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f  .  ** of a WITHO
19bf0 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a  UT ROWID table..
19c00 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62    **.  ** If pTb
19c10 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  lName==0 it mean
19c20 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  s this index is 
19c30 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 6e 20  generated as an 
19c40 69 6d 70 6c 69 65 64 20 50 52 49 4d 41 52 59 20  implied PRIMARY 
19c50 4b 45 59 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51  KEY.  ** or UNIQ
19c60 55 45 20 69 6e 64 65 78 20 69 6e 20 61 20 43 52  UE index in a CR
19c70 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
19c80 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
19c90 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
19ca0 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
19cb0 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
19cc0 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
19cd0 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
19ce0 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
19cf0 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
19d00 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 50  */.  else if( pP
19d10 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26  arse->nErr==0 &&
19d20 20 28 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   (HasRowid(pTab)
19d30 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30 29   || pTblName!=0)
19d40 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   ){.    Vdbe *v;
19d50 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  .    char *zStmt
19d60 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d  ;.    int iMem =
19d70 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
19d80 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
19d90 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
19da0 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29  ;.    if( v==0 )
19db0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19dc0 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f  e_index;...    /
19dd0 2a 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f  * Create the roo
19de0 74 70 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e  tpage for the in
19df0 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  dex.    */.    s
19e00 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
19e10 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
19e20 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
19e30 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19e40 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  (v, OP_CreateInd
19e50 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a  ex, iDb, iMem);.
19e60 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74  .    /* Gather t
19e70 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
19e80 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49   of the CREATE I
19e90 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69  NDEX statement i
19ea0 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a  nto.    ** the z
19eb0 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20  Stmt variable.  
19ec0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
19ed0 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  art ){.      int
19ee0 20 6e 20 3d 20 28 69 6e 74 29 28 70 50 61 72 73   n = (int)(pPars
19ef0 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20  e->sLastToken.z 
19f00 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50  - pName->z) + pP
19f10 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
19f20 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  .n;.      if( pN
19f30 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27  ame->z[n-1]==';'
19f40 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a   ) n--;.      /*
19f50 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77   A named index w
19f60 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20  ith an explicit 
19f70 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
19f80 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  tement */.      
19f90 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
19fa0 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41  Printf(db, "CREA
19fb0 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22  TE%s INDEX %.*s"
19fc0 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f  ,.        onErro
19fd0 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20  r==OE_None ? "" 
19fe0 3a 20 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20  : " UNIQUE", n, 
19ff0 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d  pName->z);.    }
1a000 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41  else{.      /* A
1a010 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
1a020 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50  x created by a P
1a030 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
1a040 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  IQUE constraint 
1a050 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d  */.      /* zStm
1a060 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
1a070 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20  tf(""); */.     
1a080 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   zStmt = 0;.    
1a090 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e  }..    /* Add an
1a0a0 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65   entry in sqlite
1a0b0 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73  _master for this
1a0c0 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20   index.    */.  
1a0d0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
1a0e0 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
1a0f0 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
1a100 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28  TO %Q.%s VALUES(
1a110 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25  'index',%Q,%Q,#%
1a120 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20  d,%Q);",.       
1a130 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
1a140 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
1a150 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20  E(iDb),.        
1a160 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20  pIndex->zName,. 
1a170 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
1a180 6d 65 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d  me,.        iMem
1a190 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a  ,.        zStmt.
1a1a0 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74      );.    sqlit
1a1b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74  e3DbFree(db, zSt
1a1c0 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c  mt);..    /* Fil
1a1d0 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  l the index with
1a1e0 20 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73   data and repars
1a1f0 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f  e the schema. Co
1a200 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a  de an OP_Expire.
1a210 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69      ** to invali
1a220 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d  date all pre-com
1a230 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
1a240 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1a250 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20   pTblName ){.   
1a260 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
1a270 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
1a280 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20  ndex, iMem);.   
1a290 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
1a2a0 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
1a2b0 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Db);.      sqlit
1a2c0 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63  e3VdbeAddParseSc
1a2d0 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20  hemaOp(v, iDb,. 
1a2e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
1a2f0 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65  Printf(db, "name
1a300 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27  ='%q' AND type='
1a310 69 6e 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d  index'", pIndex-
1a320 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
1a330 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a340 31 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20  1(v, OP_Expire, 
1a350 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  0);.    }.  }.. 
1a360 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20   /* When adding 
1a370 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20  an index to the 
1a380 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20  list of indices 
1a390 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b  for a table, mak
1a3a0 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20  e.  ** sure all 
1a3b0 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20  indices labeled 
1a3c0 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20  OE_Replace come 
1a3d0 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20  after all those 
1a3e0 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f  labeled.  ** OE_
1a3f0 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73  Ignore.  This is
1a400 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 20 74   necessary for t
1a410 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74  he correct const
1a420 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a  raint check.  **
1a430 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20   processing (in 
1a440 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43  sqlite3GenerateC
1a450 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28  onstraintChecks(
1a460 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20  )) as part of.  
1a470 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e  ** UPDATE and IN
1a480 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  SERT statements.
1a490 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62    .  */.  if( db
1a4a0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70  ->init.busy || p
1a4b0 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  TblName==0 ){.  
1a4c0 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f    if( onError!=O
1a4d0 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61  E_Replace || pTa
1a4e0 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20  b->pIndex==0.   
1a4f0 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70        || pTab->p
1a500 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
1a510 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20  OE_Replace){.   
1a520 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74     pIndex->pNext
1a530 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b   = pTab->pIndex;
1a540 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e  .      pTab->pIn
1a550 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  dex = pIndex;.  
1a560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
1a570 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70  ndex *pOther = p
1a580 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
1a590 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72     while( pOther
1a5a0 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65  ->pNext && pOthe
1a5b0 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f  r->pNext->onErro
1a5c0 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b  r!=OE_Replace ){
1a5d0 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20  .        pOther 
1a5e0 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
1a5f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1a600 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
1a610 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Other->pNext;.  
1a620 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78      pOther->pNex
1a630 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  t = pIndex;.    
1a640 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 70 49 6e  }.    pRet = pIn
1a650 64 65 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20  dex;.    pIndex 
1a660 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
1a670 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65  lean up before e
1a680 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63  xiting */.exit_c
1a690 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69  reate_index:.  i
1a6a0 66 28 20 70 49 6e 64 65 78 20 29 20 66 72 65 65  f( pIndex ) free
1a6b0 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
1a6c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
1a6d0 44 65 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68  Delete(db, pPIWh
1a6e0 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ere);.  sqlite3E
1a6f0 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
1a700 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  , pList);.  sqli
1a710 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
1a720 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  (db, pTblName);.
1a730 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1a740 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  db, zName);.  re
1a750 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
1a760 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64  .** Fill the Ind
1a770 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72  ex.aiRowEst[] ar
1a780 72 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74  ray with default
1a790 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69   information - i
1a7a0 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f  nformation.** to
1a7b0 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65   be used when we
1a7c0 20 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68   have not run th
1a7d0 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e  e ANALYZE comman
1a7e0 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73  d..**.** aiRowEs
1a7f0 74 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20  t[0] is suppose 
1a800 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
1a810 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
1a820 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a  s in the index..
1a830 2a 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e  ** Since we do n
1a840 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31  ot know, guess 1
1a850 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77   million.  aiRow
1a860 45 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74  Est[1] is an est
1a870 69 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  imate of the.** 
1a880 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1a890 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  n the table that
1a8a0 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69   match any parti
1a8b0 63 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74  cular value of t
1a8c0 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75  he.** first colu
1a8d0 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  mn of the index.
1a8e0 20 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73    aiRowEst[2] is
1a8f0 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
1a900 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
1a910 20 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68   rows that match
1a920 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
1a930 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20  combiniation of 
1a940 74 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75  the first 2 colu
1a950 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e  mns.** of the in
1a960 64 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  dex.  And so for
1a970 74 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77  th.  It must alw
1a980 61 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20  ays be the case 
1a990 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20  that.*.**       
1a9a0 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c      aiRowEst[N]<
1a9b0 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a  =aiRowEst[N-1].*
1a9c0 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
1a9d0 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a  wEst[N]>=1.**.**
1a9e0 20 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74   Apart from that
1a9f0 2c 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65  , we have little
1aa00 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65   to go on beside
1aa10 73 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74  s intuition as t
1aa20 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73  o.** how aiRowEs
1aa30 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  t[] should be in
1aa40 69 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20  itialized.  The 
1aa50 6e 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65  numbers generate
1aa60 64 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61  d here.** are ba
1aa70 73 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76  sed on typical v
1aa80 61 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61  alues found in a
1aa90 63 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a  ctual indices..*
1aaa0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
1aab0 66 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65  faultRowEst(Inde
1aac0 78 20 2a 70 49 64 78 29 7b 0a 20 20 74 52 6f 77  x *pIdx){.  tRow
1aad0 63 6e 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61  cnt *a = pIdx->a
1aae0 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20 69  iRowEst;.  int i
1aaf0 3b 0a 20 20 74 52 6f 77 63 6e 74 20 6e 3b 0a 20  ;.  tRowcnt n;. 
1ab00 20 61 73 73 65 72 74 28 20 61 21 3d 30 20 29 3b   assert( a!=0 );
1ab10 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e  .  a[0] = pIdx->
1ab20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45 73 74 3b  pTable->nRowEst;
1ab30 0a 20 20 69 66 28 20 61 5b 30 5d 3c 31 30 20 29  .  if( a[0]<10 )
1ab40 20 61 5b 30 5d 20 3d 20 31 30 3b 0a 20 20 6e 20   a[0] = 10;.  n 
1ab50 3d 20 31 30 3b 0a 20 20 66 6f 72 28 69 3d 31 3b  = 10;.  for(i=1;
1ab60 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   i<=pIdx->nKeyCo
1ab70 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b 69  l; i++){.    a[i
1ab80 5d 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e  ] = n;.    if( n
1ab90 3e 35 20 29 20 6e 2d 2d 3b 0a 20 20 7d 0a 20 20  >5 ) n--;.  }.  
1aba0 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
1abb0 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20  r!=OE_None ){.  
1abc0 20 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f    a[pIdx->nKeyCo
1abd0 6c 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  l] = 1;.  }.}../
1abe0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1abf0 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65  e will drop an e
1ac00 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e  xisting named in
1ac10 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69  dex.  This routi
1ac20 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73  ne.** implements
1ac30 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20   the DROP INDEX 
1ac40 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
1ac50 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e  id sqlite3DropIn
1ac60 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
1ac70 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d  e, SrcList *pNam
1ac80 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74 73 29  e, int ifExists)
1ac90 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
1aca0 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  x;.  Vdbe *v;.  
1acb0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1acc0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
1acd0 69 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  iDb;..  assert( 
1ace0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
1acf0 29 3b 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61  );   /* Never ca
1ad00 6c 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72 20  lled with prior 
1ad10 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20  errors */.  if( 
1ad20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1ad30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
1ad40 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1ad50 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  }.  assert( pNam
1ad60 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
1ad70 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
1ad80 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
1ad90 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
1ada0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1adb0 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  ndex;.  }.  pInd
1adc0 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
1add0 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d  Index(db, pName-
1ade0 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61  >a[0].zName, pNa
1adf0 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
1ae00 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  se);.  if( pInde
1ae10 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  x==0 ){.    if( 
1ae20 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20  !ifExists ){.   
1ae30 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1ae40 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
1ae50 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20  uch index: %S", 
1ae60 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d  pName, 0);.    }
1ae70 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1ae80 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d  te3CodeVerifyNam
1ae90 65 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  edSchema(pParse,
1aea0 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
1aeb0 74 61 62 61 73 65 29 3b 0a 20 20 20 20 7d 0a 20  tabase);.    }. 
1aec0 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
1aed0 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
1aee0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1aef0 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
1af00 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65  pIndex->autoInde
1af10 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
1af20 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1af30 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
1af40 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
1af50 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
1af60 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
1af70 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
1af80 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f  ped", 0);.    go
1af90 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1afa0 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  ex;.  }.  iDb = 
1afb0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
1afc0 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d  ndex(db, pIndex-
1afd0 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64  >pSchema);.#ifnd
1afe0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1aff0 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
1b000 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20  .    int code = 
1b010 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45  SQLITE_DROP_INDE
1b020 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  X;.    Table *pT
1b030 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
1b040 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ble;.    const c
1b050 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
1b060 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
1b070 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1b080 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
1b090 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28  LE(iDb);.    if(
1b0a0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1b0b0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1b0c0 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
1b0d0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
1b0e0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1b0f0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
1b100 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
1b110 20 26 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d   && iDb ) code =
1b120 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
1b130 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
1b140 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1b150 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
1b160 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70  pIndex->zName, p
1b170 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
1b180 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
1b190 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1b1a0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1b1b0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1b1c0 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
1b1d0 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f  he index and fro
1b1e0 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
1b1f0 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  le */.  v = sqli
1b200 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1b210 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
1b220 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1b230 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1b240 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20  arse, 1, iDb);. 
1b250 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
1b260 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
1b270 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
1b280 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61  M %Q.%s WHERE na
1b290 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27  me=%Q AND type='
1b2a0 69 6e 64 65 78 27 22 2c 0a 20 20 20 20 20 20 20  index'",.       
1b2b0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
1b2c0 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
1b2d0 28 69 44 62 29 2c 20 70 49 6e 64 65 78 2d 3e 7a  (iDb), pIndex->z
1b2e0 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
1b2f0 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74  sqlite3ClearStat
1b300 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69  Tables(pParse, i
1b310 44 62 2c 20 22 69 64 78 22 2c 20 70 49 6e 64 65  Db, "idx", pInde
1b320 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  x->zName);.    s
1b330 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
1b340 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
1b350 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
1b360 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Page(pParse, pIn
1b370 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  dex->tnum, iDb);
1b380 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1b390 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f  AddOp4(v, OP_Dro
1b3a0 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20  pIndex, iDb, 0, 
1b3b0 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  0, pIndex->zName
1b3c0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  , 0);.  }..exit_
1b3d0 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71  drop_index:.  sq
1b3e0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1b3f0 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d  te(db, pName);.}
1b400 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69  ../*.** pArray i
1b410 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
1b420 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  n array of objec
1b430 74 73 2e 20 45 61 63 68 20 6f 62 6a 65 63 74 20  ts. Each object 
1b440 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20  in the.** array 
1b450 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73  is szEntry bytes
1b460 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73 20 72   in size. This r
1b470 6f 75 74 69 6e 65 20 75 73 65 73 20 73 71 6c 69  outine uses sqli
1b480 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a  te3DbRealloc().*
1b490 2a 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20  * to extend the 
1b4a0 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 74 68  array so that th
1b4b0 65 72 65 20 69 73 20 73 70 61 63 65 20 66 6f 72  ere is space for
1b4c0 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 74   a new object at
1b4d0 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20   the end..**.** 
1b4e0 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
1b4f0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70  on is called, *p
1b500 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20  nEntry contains 
1b510 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
1b520 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72 61 79   of.** the array
1b530 20 28 69 6e 20 65 6e 74 72 69 65 73 20 2d 20 73   (in entries - s
1b540 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  o the allocation
1b550 20 69 73 20 28 28 2a 70 6e 45 6e 74 72 79 29 20   is ((*pnEntry) 
1b560 2a 20 73 7a 45 6e 74 72 79 29 20 62 79 74 65 73  * szEntry) bytes
1b570 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a  .** in total)..*
1b580 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 61 6c  *.** If the real
1b590 6c 6f 63 28 29 20 69 73 20 73 75 63 63 65 73 73  loc() is success
1b5a0 66 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20  ful (i.e. if no 
1b5b0 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63  OOM condition oc
1b5c0 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70  curs), the.** sp
1b5d0 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
1b5e0 72 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  r the new object
1b5f0 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45   is zeroed, *pnE
1b600 6e 74 72 79 20 75 70 64 61 74 65 64 20 74 6f 0a  ntry updated to.
1b610 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e  ** reflect the n
1b620 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  ew size of the a
1b630 72 72 61 79 20 61 6e 64 20 61 20 70 6f 69 6e 74  rray and a point
1b640 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 61 6c  er to the new al
1b650 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75  location.** retu
1b660 72 6e 65 64 2e 20 2a 70 49 64 78 20 69 73 20 73  rned. *pIdx is s
1b670 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
1b680 6f 66 20 74 68 65 20 6e 65 77 20 61 72 72 61 79  of the new array
1b690 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 63   entry in this c
1b6a0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ase..**.** Other
1b6b0 77 69 73 65 2c 20 69 66 20 74 68 65 20 72 65 61  wise, if the rea
1b6c0 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a 70  lloc() fails, *p
1b6d0 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 2d 31  Idx is set to -1
1b6e0 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61 69  , *pnEntry remai
1b6f0 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  ns.** unchanged 
1b700 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 70 41  and a copy of pA
1b710 72 72 61 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a  rray returned..*
1b720 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41  /.void *sqlite3A
1b730 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
1b740 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1b750 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1b760 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c  to notify of mal
1b770 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a  loc failures */.
1b780 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20    void *pArray, 
1b790 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
1b7a0 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20  objects.  Might 
1b7b0 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a  be reallocated *
1b7c0 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c  /.  int szEntry,
1b7d0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1b7e0 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20   each object in 
1b7f0 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  the array */.  i
1b800 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20  nt *pnEntry,    
1b810 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62   /* Number of ob
1b820 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20  jects currently 
1b830 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  in use */.  int 
1b840 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a  *pIdx         /*
1b850 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65 78   Write the index
1b860 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68   of a new slot h
1b870 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ere */.){.  char
1b880 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a   *z;.  int n = *
1b890 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28  pnEntry;.  if( (
1b8a0 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b  n & (n-1))==0 ){
1b8b0 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e  .    int sz = (n
1b8c0 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a  ==0) ? 1 : 2*n;.
1b8d0 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d      void *pNew =
1b8e0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
1b8f0 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20 73 7a  c(db, pArray, sz
1b900 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69  *szEntry);.    i
1b910 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1b920 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a      *pIdx = -1;.
1b930 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 72        return pAr
1b940 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ray;.    }.    p
1b950 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20  Array = pNew;.  
1b960 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70  }.  z = (char*)p
1b970 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28  Array;.  memset(
1b980 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c  &z[n * szEntry],
1b990 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20   0, szEntry);.  
1b9a0 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a  *pIdx = n;.  ++*
1b9b0 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72  pnEntry;.  retur
1b9c0 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a  n pArray;.}../*.
1b9d0 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
1b9e0 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67  element to the g
1b9f0 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72  iven IdList.  Cr
1ba00 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73  eate a new IdLis
1ba10 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
1ba20 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c  .**.** A new IdL
1ba30 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
1ba40 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c   or NULL if mall
1ba50 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49  oc() fails..*/.I
1ba60 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
1ba70 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74  ListAppend(sqlit
1ba80 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a  e3 *db, IdList *
1ba90 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
1baa0 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  oken){.  int i;.
1bab0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1bac0 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
1bad0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
1bae0 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c  o(db, sizeof(IdL
1baf0 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
1bb00 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1bb10 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
1bb20 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72  ->a = sqlite3Arr
1bb30 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
1bb40 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73    db,.      pLis
1bb50 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65  t->a,.      size
1bb60 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c  of(pList->a[0]),
1bb70 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e  .      &pList->n
1bb80 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29  Id,.      &i.  )
1bb90 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20  ;.  if( i<0 ){. 
1bba0 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
1bbb0 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
1bbc0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1bbd0 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  .  }.  pList->a[
1bbe0 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
1bbf0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1bc00 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72  db, pToken);.  r
1bc10 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
1bc20 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
1bc30 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
1bc40 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
1bc50 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
1bc60 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b   IdList *pList){
1bc70 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1bc80 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1bc90 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
1bca0 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
1bcb0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1bcc0 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
1bcd0 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
1bce0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1bcf0 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  db, pList->a);. 
1bd00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1bd10 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
1bd20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
1bd30 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66  ndex in pList of
1bd40 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20   the identifier 
1bd50 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75  named zId.  Retu
1bd60 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20  rn -1.** if not 
1bd70 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
1bd80 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
1bd90 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
1bda0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1bdb0 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
1bdc0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1bdd0 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69  turn -1;.  for(i
1bde0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
1bdf0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1be00 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1be10 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1be20 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65  , zName)==0 ) re
1be30 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
1be40 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
1be50 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73 70 61  * Expand the spa
1be60 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
1be70 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
1be80 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20  st object by.** 
1be90 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61 20  creating nExtra 
1bea0 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e  new slots beginn
1beb0 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20 20  ing at iStart.  
1bec0 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20 62  iStart is zero b
1bed0 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f  ased..** New slo
1bee0 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  ts are zeroed..*
1bef0 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
1bf00 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72 63 4c  , suppose a SrcL
1bf10 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f  ist initially co
1bf20 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72 69  ntains two entri
1bf30 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61  es: A,B..** To a
1bf40 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74 72  ppend 3 new entr
1bf50 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ies onto the end
1bf60 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  , do this:.**.**
1bf70 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
1bf80 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
1bf90 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a  rclist, 3, 2);.*
1bfa0 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 63  *.** After the c
1bfb0 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f 75  all above it wou
1bfc0 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20  ld contain:  A, 
1bfd0 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c  B, nil, nil, nil
1bfe0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74 61  ..** If the iSta
1bff0 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64 20  rt argument had 
1c000 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20 6f  been 1 instead o
1c010 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72 65  f 2, then the re
1c020 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61  sult.** would ha
1c030 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c  ve been:  A, nil
1c040 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20  , nil, nil, B.  
1c050 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20 6e  To prepend the n
1c060 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65  ew slots,.** the
1c070 20 69 53 74 61 72 74 20 76 61 6c 75 65 20 77 6f   iStart value wo
1c080 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 72  uld be 0.  The r
1c090 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64  esult then would
1c0a0 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c  .** be: nil, nil
1c0b0 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a  , nil, A, B..**.
1c0c0 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
1c0d0 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 20  llocation fails 
1c0e0 74 68 65 20 53 72 63 4c 69 73 74 20 69 73 20 75  the SrcList is u
1c0f0 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a  nchanged.  The.*
1c100 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  * db->mallocFail
1c110 65 64 20 66 6c 61 67 20 77 69 6c 6c 20 62 65 20  ed flag will be 
1c120 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a  set to true..*/.
1c130 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
1c140 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a  SrcListEnlarge(.
1c150 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1c160 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1c170 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e   connection to n
1c180 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72  otify of OOM err
1c190 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ors */.  SrcList
1c1a0 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54   *pSrc,     /* T
1c1b0 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65  he SrcList to be
1c1c0 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69   enlarged */.  i
1c1d0 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
1c1e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
1c1f0 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20  ew slots to add 
1c200 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a  to pSrc->a[] */.
1c210 20 20 69 6e 74 20 69 53 74 61 72 74 20 20 20 20    int iStart    
1c220 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
1c230 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69   pSrc->a[] of fi
1c240 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a  rst new slot */.
1c250 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  ){.  int i;..  /
1c260 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
1c270 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72  g on calling par
1c280 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73  ameters */.  ass
1c290 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29  ert( iStart>=0 )
1c2a0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 74  ;.  assert( nExt
1c2b0 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ra>=1 );.  asser
1c2c0 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
1c2d0 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d  assert( iStart<=
1c2e0 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20  pSrc->nSrc );.. 
1c2f0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64 64   /* Allocate add
1c300 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69 66  itional space if
1c310 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28   needed */.  if(
1c320 20 28 75 33 32 29 70 53 72 63 2d 3e 6e 53 72 63   (u32)pSrc->nSrc
1c330 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41  +nExtra>pSrc->nA
1c340 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c  lloc ){.    SrcL
1c350 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  ist *pNew;.    i
1c360 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63  nt nAlloc = pSrc
1c370 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20  ->nSrc+nExtra;. 
1c380 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20     int nGot;.   
1c390 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
1c3a0 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72  bRealloc(db, pSr
1c3b0 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c,.             
1c3c0 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20    sizeof(*pSrc) 
1c3d0 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a  + (nAlloc-1)*siz
1c3e0 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20  eof(pSrc->a[0]) 
1c3f0 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
1c400 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1c410 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
1c420 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
1c430 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d  turn pSrc;.    }
1c440 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77  .    pSrc = pNew
1c450 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71  ;.    nGot = (sq
1c460 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
1c470 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69  e(db, pNew) - si
1c480 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a  zeof(*pSrc))/siz
1c490 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b  eof(pSrc->a[0])+
1c4a0 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c  1;.    pSrc->nAl
1c4b0 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a  loc = nGot;.  }.
1c4c0 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74  .  /* Move exist
1c4d0 69 6e 67 20 73 6c 6f 74 73 20 74 68 61 74 20 63  ing slots that c
1c4e0 6f 6d 65 20 61 66 74 65 72 20 74 68 65 20 6e 65  ome after the ne
1c4f0 77 6c 79 20 69 6e 73 65 72 74 65 64 20 73 6c 6f  wly inserted slo
1c500 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74  ts.  ** out of t
1c510 68 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28  he way */.  for(
1c520 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i=pSrc->nSrc-1; 
1c530 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b  i>=iStart; i--){
1c540 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e  .    pSrc->a[i+n
1c550 45 78 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61  Extra] = pSrc->a
1c560 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d  [i];.  }.  pSrc-
1c570 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b  >nSrc += nExtra;
1c580 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
1c590 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
1c5a0 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65  slots */.  memse
1c5b0 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72  t(&pSrc->a[iStar
1c5c0 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  t], 0, sizeof(pS
1c5d0 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61  rc->a[0])*nExtra
1c5e0 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72  );.  for(i=iStar
1c5f0 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74  t; i<iStart+nExt
1c600 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53  ra; i++){.    pS
1c610 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
1c620 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
1c630 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1c640 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65  r to the enlarge
1c650 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72  d SrcList */.  r
1c660 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a  eturn pSrc;.}...
1c670 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
1c680 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  ew table name to
1c690 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
1c6a0 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
1c6b0 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20  w SrcList if.** 
1c6c0 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20  need be.  A new 
1c6d0 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64  entry is created
1c6e0 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
1c6f0 65 76 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69  even if pTable i
1c700 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20  s NULL..**.** A 
1c710 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72  SrcList is retur
1c720 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
1c730 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20  there is an OOM 
1c740 65 72 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75  error.  The retu
1c750 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20  rned.** SrcList 
1c760 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d  might be the sam
1c770 65 20 61 73 20 74 68 65 20 53 72 63 4c 69 73 74  e as the SrcList
1c780 20 74 68 61 74 20 77 61 73 20 69 6e 70 75 74 20   that was input 
1c790 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a  or it might be.*
1c7a0 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66  * a new one.  If
1c7b0 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f   an OOM error do
1c7c0 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  es occurs, then 
1c7d0 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20  the prior value 
1c7e0 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74  of pList.** that
1c7f0 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69   is input to thi
1c800 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74  s routine is aut
1c810 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64  omatically freed
1c820 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61  ..**.** If pData
1c830 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  base is not null
1c840 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1c850 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
1c860 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74   optional.** dat
1c870 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69  abase name prefi
1c880 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20  x.  Like this:  
1c890 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22  "database.table"
1c8a0 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65  .  The pDatabase
1c8b0 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
1c8c0 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
1c8d0 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e   the pTable poin
1c8e0 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ts to the databa
1c8f0 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20  se name..** The 
1c900 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  SrcList.a[].zNam
1c910 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65  e field is fille
1c920 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
1c930 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68   name which migh
1c940 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70  t.** come from p
1c950 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62  Table (if pDatab
1c960 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20  ase is NULL) or 
1c970 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20  from pDatabase. 
1c980 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d   .** SrcList.a[]
1c990 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69  .zDatabase is fi
1c9a0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
1c9b0 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d  tabase name from
1c9c0 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77   pTable,.** or w
1c9d0 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64  ith NULL if no d
1c9e0 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69  atabase is speci
1c9f0 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  fied..**.** In o
1ca00 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63  ther words, if c
1ca10 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  all like this:.*
1ca20 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
1ca30 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1ca40 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a  d(D,A,B,0);.**.*
1ca50 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61  * Then B is a ta
1ca60 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
1ca70 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
1ca80 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20  s unspecified.  
1ca90 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b  If called.** lik
1caa0 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
1cab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
1cac0 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42  ListAppend(D,A,B
1cad0 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,C);.**.** Then 
1cae0 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  C is the table n
1caf0 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65  ame and B is the
1cb00 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20   database name. 
1cb10 20 49 66 20 43 20 69 73 20 64 65 66 69 6e 65 64   If C is defined
1cb20 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42  .** then so is B
1cb30 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1cb40 73 2c 20 77 65 20 6e 65 76 65 72 20 68 61 76 65  s, we never have
1cb50 20 61 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a   a case where:.*
1cb60 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
1cb70 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1cb80 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a  d(D,A,0,C);.**.*
1cb90 2a 20 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e  * Both pTable an
1cba0 64 20 70 44 61 74 61 62 61 73 65 20 61 72 65 20  d pDatabase are 
1cbb0 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75  assumed to be qu
1cbc0 6f 74 65 64 2e 20 20 54 68 65 79 20 61 72 65 20  oted.  They are 
1cbd0 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f  dequoted.** befo
1cbe0 72 65 20 62 65 69 6e 67 20 61 64 64 65 64 20 74  re being added t
1cbf0 6f 20 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a  o the SrcList..*
1cc00 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
1cc10 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1cc20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1cc30 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
1cc40 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
1cc50 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  f malloc failure
1cc60 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  s */.  SrcList *
1cc70 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70  pList,     /* Ap
1cc80 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63  pend to this Src
1cc90 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74  List. NULL creat
1cca0 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  es a new SrcList
1ccb0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
1ccc0 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62  ble,      /* Tab
1ccd0 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a  le to append */.
1cce0 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61    Token *pDataba
1ccf0 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  se    /* Databas
1cd00 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  e of the table *
1cd10 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
1cd20 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1cd30 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 61  m;.  assert( pDa
1cd40 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61  tabase==0 || pTa
1cd50 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61  ble!=0 );  /* Ca
1cd60 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74 68  nnot have C with
1cd70 6f 75 74 20 42 20 2a 2f 0a 20 20 69 66 28 20 70  out B */.  if( p
1cd80 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
1cd90 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
1cda0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
1cdb0 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
1cdc0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
1cdd0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1cde0 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
1cdf0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 69 73   = 1;.  }.  pLis
1ce00 74 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  t = sqlite3SrcLi
1ce10 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c  stEnlarge(db, pL
1ce20 69 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e  ist, 1, pList->n
1ce30 53 72 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  Src);.  if( db->
1ce40 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1ce50 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
1ce60 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
1ce70 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  st);.    return 
1ce80 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  0;.  }.  pItem =
1ce90 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
1cea0 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28  ->nSrc-1];.  if(
1ceb0 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44   pDatabase && pD
1cec0 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b  atabase->z==0 ){
1ced0 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
1cee0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44   0;.  }.  if( pD
1cef0 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 54  atabase ){.    T
1cf00 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44  oken *pTemp = pD
1cf10 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61  atabase;.    pDa
1cf20 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b  tabase = pTable;
1cf30 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54  .    pTable = pT
1cf40 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  emp;.  }.  pItem
1cf50 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
1cf60 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1cf70 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 70 49  b, pTable);.  pI
1cf80 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
1cf90 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1cfa0 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62  Token(db, pDatab
1cfb0 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ase);.  return p
1cfc0 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
1cfd0 73 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72  ssign VdbeCursor
1cfe0 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74   index numbers t
1cff0 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  o all tables in 
1d000 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69  a SrcList.*/.voi
1d010 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
1d020 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61  AssignCursors(Pa
1d030 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
1d040 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1d050 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1d060 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1d070 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c  tem;.  assert(pL
1d080 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ist || pParse->d
1d090 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1d0a0 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
1d0b0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  {.    for(i=0, p
1d0c0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
1d0d0 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
1d0e0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1d0f0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43     if( pItem->iC
1d100 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b  ursor>=0 ) break
1d110 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69  ;.      pItem->i
1d120 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
1d130 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69  >nTab++;.      i
1d140 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
1d150 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1d160 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
1d170 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
1d180 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d   pItem->pSelect-
1d190 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  >pSrc);.      }.
1d1a0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1d1b0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
1d1c0 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
1d1d0 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
1d1e0 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
1d1f0 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
1d200 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
1d210 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
1d220 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
1d230 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1d240 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1d250 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1d260 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74  eturn;.  for(pIt
1d270 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
1d280 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
1d290 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
1d2a0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1d2b0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61  e(db, pItem->zDa
1d2c0 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
1d2d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1d2e0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
1d2f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1d300 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  db, pItem->zAlia
1d310 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  s);.    sqlite3D
1d320 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
1d330 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71  >zIndex);.    sq
1d340 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
1d350 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  (db, pItem->pTab
1d360 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
1d370 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1d380 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
1d390 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1d3a0 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
1d3b0 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  >pOn);.    sqlit
1d3c0 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1d3d0 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  b, pItem->pUsing
1d3e0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1d3f0 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
1d400 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1d410 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1d420 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
1d430 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65   to add a new te
1d440 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  rm to the.** end
1d450 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52   of a growing FR
1d460 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  OM clause.  The 
1d470 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
1d480 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20   the part of.** 
1d490 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1d4a0 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
1d4b0 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65   been constructe
1d4c0 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a  d.  "p" is NULL.
1d4d0 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ** if this is th
1d4e0 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20  e first term of 
1d4f0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
1d500 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61    pTable and pDa
1d510 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68  tabase.** are th
1d520 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
1d530 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73 65  ble and database
1d540 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
1d550 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a  OM clause term..
1d560 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73 20  ** pDatabase is 
1d570 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61  NULL if the data
1d580 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66  base name qualif
1d590 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d  ier is missing -
1d5a0 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61   the.** usual ca
1d5b0 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d  se.  If the term
1d5c0 20 68 61 73 20 61 20 61 6c 69 61 73 2c 20 74 68   has a alias, th
1d5d0 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73  en pAlias points
1d5e0 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73   to the.** alias
1d5f0 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20   token.  If the 
1d600 74 65 72 6d 20 69 73 20 61 20 73 75 62 71 75 65  term is a subque
1d610 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65  ry, then pSubque
1d620 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c  ry is the.** SEL
1d630 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
1d640 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20  at the subquery 
1d650 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54  encodes.  The pT
1d660 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74  able and.** pDat
1d670 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72 73  abase parameters
1d680 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75   are NULL for su
1d690 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 70  bqueries.  The p
1d6a0 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a  On and pUsing.**
1d6b0 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
1d6c0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
1d6d0 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20  he ON and USING 
1d6e0 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52  clauses..**.** R
1d6f0 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c  eturn a new SrcL
1d700 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65  ist which encode
1d710 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69  s is the FROM wi
1d720 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65  th the new.** te
1d730 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63  rm added..*/.Src
1d740 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
1d750 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65  ListAppendFromTe
1d760 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
1d770 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
1d780 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
1d790 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1d7a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1d7b0 20 54 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f   The left part o
1d7c0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
1d7d0 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a  e already seen *
1d7e0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c  /.  Token *pTabl
1d7f0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  e,          /* N
1d800 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
1d810 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46   to add to the F
1d820 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
1d830 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65  Token *pDatabase
1d840 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ,       /* Name 
1d850 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1d860 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c  containing pTabl
1d870 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41  e */.  Token *pA
1d880 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f  lias,          /
1d890 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64  * The right-hand
1d8a0 20 73 69 64 65 20 6f 66 20 74 68 65 20 41 53 20   side of the AS 
1d8b0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  subexpression */
1d8c0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71  .  Select *pSubq
1d8d0 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20  uery,      /* A 
1d8e0 73 75 62 71 75 65 72 79 20 75 73 65 64 20 69 6e  subquery used in
1d8f0 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c   place of a tabl
1d900 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72  e name */.  Expr
1d910 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20   *pOn,          
1d920 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c      /* The ON cl
1d930 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a  ause of a join *
1d940 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69  /.  IdList *pUsi
1d950 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ng          /* T
1d960 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
1d970 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a  of a join */.){.
1d980 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1d990 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1d9a0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1d9b0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
1d9c0 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55  !p && (pOn || pU
1d9d0 73 69 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c  sing) ){.    sql
1d9e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1d9f0 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61  rse, "a JOIN cla
1da00 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  use is required 
1da10 62 65 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20  before %s", .   
1da20 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a     (pOn ? "ON" :
1da30 20 22 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b   "USING").    );
1da40 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64  .    goto append
1da50 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d  _from_error;.  }
1da60 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72  .  p = sqlite3Sr
1da70 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20  cListAppend(db, 
1da80 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61  p, pTable, pData
1da90 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
1daa0 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 53  0 || NEVER(p->nS
1dab0 72 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 67 6f  rc==0) ){.    go
1dac0 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  to append_from_e
1dad0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 49 74 65  rror;.  }.  pIte
1dae0 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72  m = &p->a[p->nSr
1daf0 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  c-1];.  assert( 
1db00 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69  pAlias!=0 );.  i
1db10 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a  f( pAlias->n ){.
1db20 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61      pItem->zAlia
1db30 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  s = sqlite3NameF
1db40 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c  romToken(db, pAl
1db50 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  ias);.  }.  pIte
1db60 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75  m->pSelect = pSu
1db70 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d  bquery;.  pItem-
1db80 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49  >pOn = pOn;.  pI
1db90 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55  tem->pUsing = pU
1dba0 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70  sing;.  return p
1dbb0 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f  ;.. append_from_
1dbc0 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28  error:.  assert(
1dbd0 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   p==0 );.  sqlit
1dbe0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1dbf0 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33   pOn);.  sqlite3
1dc00 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
1dc10 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69   pUsing);.  sqli
1dc20 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1dc30 64 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a  db, pSubquery);.
1dc40 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1dc50 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45  *.** Add an INDE
1dc60 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e  XED BY or NOT IN
1dc70 44 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20  DEXED clause to 
1dc80 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
1dc90 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d  y added .** elem
1dca0 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63  ent of the sourc
1dcb0 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73  e-list passed as
1dcc0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1dcd0 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
1dce0 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65  lite3SrcListInde
1dcf0 78 65 64 42 79 28 50 61 72 73 65 20 2a 70 50 61  xedBy(Parse *pPa
1dd00 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  rse, SrcList *p,
1dd10 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64   Token *pIndexed
1dd20 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  By){.  assert( p
1dd30 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a  IndexedBy!=0 );.
1dd40 20 20 69 66 28 20 70 20 26 26 20 41 4c 57 41 59    if( p && ALWAY
1dd50 53 28 70 2d 3e 6e 53 72 63 3e 30 29 20 29 7b 0a  S(p->nSrc>0) ){.
1dd60 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
1dd70 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
1dd80 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
1dd90 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
1dda0 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  Item->notIndexed
1ddb0 3d 3d 30 20 26 26 20 70 49 74 65 6d 2d 3e 7a 49  ==0 && pItem->zI
1ddc0 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ndex==0 );.    i
1ddd0 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e  f( pIndexedBy->n
1dde0 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78 65 64  ==1 && !pIndexed
1ddf0 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f  By->z ){.      /
1de00 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44  * A "NOT INDEXED
1de10 22 20 63 6c 61 75 73 65 20 77 61 73 20 73 75 70  " clause was sup
1de20 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72 73 65  plied. See parse
1de30 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  .y .      ** con
1de40 73 74 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f  struct "indexed_
1de50 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73  opt" for details
1de60 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d  . */.      pItem
1de70 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31  ->notIndexed = 1
1de80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1de90 20 20 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78     pItem->zIndex
1dea0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1deb0 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
1dec0 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b  db, pIndexedBy);
1ded0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1dee0 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e  .** When buildin
1def0 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75  g up a FROM clau
1df00 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  se in the parser
1df10 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  , the join opera
1df20 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61  tor.** is initia
1df30 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f 20  lly attached to 
1df40 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
1df50 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 20  .  But the code 
1df60 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70  generator.** exp
1df70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ects the join op
1df80 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20  erator to be on 
1df90 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1dfa0 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
1dfb0 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a  .** Shifts all j
1dfc0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72  oin operators fr
1dfd0 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
1dfe0 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46   for an entire F
1dff0 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a  ROM.** clause..*
1e000 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75  *.** Example: Su
1e010 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69  ppose the join i
1e020 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
1e030 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 6e  **           A n
1e040 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
1e050 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  n B.**.** The op
1e060 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72  erator is "natur
1e070 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20  al cross join". 
1e080 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65   The A and B ope
1e090 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64  rands are stored
1e0a0 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61  .** in p->a[0] a
1e0b0 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70  nd p->a[1], resp
1e0c0 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70  ectively.  The p
1e0d0 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20  arser initially 
1e0e0 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70  stores the.** op
1e0f0 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20  erator with A.  
1e100 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69  This routine shi
1e110 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f  fts that operato
1e120 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a  r over to B..*/.
1e130 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
1e140 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65  istShiftJoinType
1e150 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20  (SrcList *p){.  
1e160 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74  if( p ){.    int
1e170 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   i;.    assert( 
1e180 70 2d 3e 61 20 7c 7c 20 70 2d 3e 6e 53 72 63 3d  p->a || p->nSrc=
1e190 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 );.    for(i=
1e1a0 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20  p->nSrc-1; i>0; 
1e1b0 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  i--){.      p->a
1e1c0 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70  [i].jointype = p
1e1d0 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70  ->a[i-1].jointyp
1e1e0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  e;.    }.    p->
1e1f0 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  a[0].jointype = 
1e200 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
1e210 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
1e220 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
1e230 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
1e240 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
1e250 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20  e, int type){.  
1e260 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
1e270 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b  dbe *v;.  int i;
1e280 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1e290 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20  se!=0 );.  db = 
1e2a0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
1e2b0 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f  sert( db!=0 );./
1e2c0 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 30  *  if( db->aDb[0
1e2d0 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
1e2e0 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  n; */.  if( sqli
1e2f0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1e300 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
1e310 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22  SACTION, "BEGIN"
1e320 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72  , 0, 0) ){.    r
1e330 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d  eturn;.  }.  v =
1e340 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1e350 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21  pParse);.  if( !
1e360 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  v ) return;.  if
1e370 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52  ( type!=TK_DEFER
1e380 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  RED ){.    for(i
1e390 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
1e3a0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1e3b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e3c0 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
1e3d0 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43  i, (type==TK_EXC
1e3e0 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20  LUSIVE)+1);.    
1e3f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
1e400 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20  sBtree(v, i);.  
1e410 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1e420 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e430 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c  P_AutoCommit, 0,
1e440 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   0);.}../*.** Co
1e450 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
1e460 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
1e470 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74  e3CommitTransact
1e480 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
1e490 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  e){.  Vdbe *v;..
1e4a0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1e4b0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1e4c0 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29   pParse->db!=0 )
1e4d0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
1e4e0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1e4f0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
1e500 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  ION, "COMMIT", 0
1e510 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
1e520 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
1e530 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1e540 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
1e550 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1e560 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
1e570 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a  oCommit, 1, 0);.
1e580 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c    }.}../*.** Rol
1e590 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74  lback a transact
1e5a0 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
1e5b0 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73  te3RollbackTrans
1e5c0 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
1e5d0 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
1e5e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1e5f0 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
1e600 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d  rt( pParse->db!=
1e610 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
1e620 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1e630 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
1e640 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43  ACTION, "ROLLBAC
1e650 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  K", 0, 0) ){.   
1e660 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76   return;.  }.  v
1e670 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1e680 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1e690 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
1e6a0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1e6b0 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c  P_AutoCommit, 1,
1e6c0 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
1e6d0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1e6e0 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
1e6f0 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20   parser when it 
1e700 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64  parses a command
1e710 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72   to create,.** r
1e720 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
1e730 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f  ck an SQL savepo
1e740 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  int. .*/.void sq
1e750 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50  lite3Savepoint(P
1e760 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1e770 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  t op, Token *pNa
1e780 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  me){.  char *zNa
1e790 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
1e7a0 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
1e7b0 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  ->db, pName);.  
1e7c0 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
1e7d0 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
1e7e0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1e7f0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1e800 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
1e810 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20  TION.    static 
1e820 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e  const char * con
1e830 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47  st az[] = { "BEG
1e840 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20  IN", "RELEASE", 
1e850 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20  "ROLLBACK" };.  
1e860 20 20 61 73 73 65 72 74 28 20 21 53 41 56 45 50    assert( !SAVEP
1e870 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41  OINT_BEGIN && SA
1e880 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d  VEPOINT_RELEASE=
1e890 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f  =1 && SAVEPOINT_
1e8a0 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23  ROLLBACK==2 );.#
1e8b0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21 76  endif.    if( !v
1e8c0 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43   || sqlite3AuthC
1e8d0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1e8e0 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61  ITE_SAVEPOINT, a
1e8f0 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29  z[op], zName, 0)
1e900 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1e910 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e  3DbFree(pParse->
1e920 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
1e930 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
1e940 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e950 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65  ddOp4(v, OP_Save
1e960 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c  point, op, 0, 0,
1e970 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d   zName, P4_DYNAM
1e980 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  IC);.  }.}../*.*
1e990 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
1e9a0 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73  TEMP database is
1e9b0 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61   open and availa
1e9c0 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65  ble for use.  Re
1e9d0 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
1e9e0 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c  er of errors.  L
1e9f0 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  eave any error m
1ea00 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70  essages in the p
1ea10 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
1ea20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f  .*/.int sqlite3O
1ea30 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
1ea40 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1ea50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1ea60 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
1ea70 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74  ( db->aDb[1].pBt
1ea80 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e  ==0 && !pParse->
1ea90 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69  explain ){.    i
1eaa0 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65 65  nt rc;.    Btree
1eab0 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74 69   *pBt;.    stati
1eac0 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67  c const int flag
1ead0 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53  s = .          S
1eae0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
1eaf0 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  RITE |.         
1eb00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
1eb10 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
1eb20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
1eb30 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20  USIVE |.        
1eb40 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45    SQLITE_OPEN_DE
1eb50 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20  LETEONCLOSE |.  
1eb60 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1eb70 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20  PEN_TEMP_DB;..  
1eb80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1eb90 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73  reeOpen(db->pVfs
1eba0 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20 30  , 0, db, &pBt, 0
1ebb0 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  , flags);.    if
1ebc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ebd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1ebe0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1ebf0 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e   "unable to open
1ec00 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74   a temporary dat
1ec10 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20  abase ".        
1ec20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e  "file for storin
1ec30 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  g temporary tabl
1ec40 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72  es");.      pPar
1ec50 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20  se->rc = rc;.   
1ec60 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1ec70 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b 31   }.    db->aDb[1
1ec80 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ].pBt = pBt;.   
1ec90 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
1eca0 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  [1].pSchema );. 
1ecb0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f     if( SQLITE_NO
1ecc0 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  MEM==sqlite3Btre
1ecd0 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 42 74  eSetPageSize(pBt
1ece0 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69  , db->nextPagesi
1ecf0 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20  ze, -1, 0) ){.  
1ed00 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
1ed10 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
1ed20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1ed30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1ed40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20  }../*.** Record 
1ed50 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
1ed60 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
1ed70 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  will need to be 
1ed80 76 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20  verified.** for 
1ed90 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 20 54  database iDb.  T
1eda0 68 65 20 63 6f 64 65 20 74 6f 20 61 63 74 75 61  he code to actua
1edb0 6c 6c 79 20 76 65 72 69 66 79 20 74 68 65 20 73  lly verify the s
1edc0 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20  chema cookie.** 
1edd0 77 69 6c 6c 20 6f 63 63 75 72 20 61 74 20 74 68  will occur at th
1ede0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 6f 70  e end of the top
1edf0 2d 6c 65 76 65 6c 20 56 44 42 45 20 61 6e 64 20  -level VDBE and 
1ee00 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 65  will be generate
1ee10 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20 73  d.** later, by s
1ee20 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
1ee30 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ng()..*/.void sq
1ee40 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
1ee50 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61  chema(Parse *pPa
1ee60 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
1ee70 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
1ee80 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
1ee90 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
1eea0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1eeb0 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b  = pToplevel->db;
1eec0 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b  .  yDbMask mask;
1eed0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ..  assert( iDb>
1eee0 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
1eef0 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  b );.  assert( d
1ef00 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21  b->aDb[iDb].pBt!
1ef10 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a  =0 || iDb==1 );.
1ef20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 53 51    assert( iDb<SQ
1ef30 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
1ef40 44 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  D+2 );.  assert(
1ef50 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
1ef60 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
1ef70 20 30 29 20 29 3b 0a 20 20 6d 61 73 6b 20 3d 20   0) );.  mask = 
1ef80 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44  ((yDbMask)1)<<iD
1ef90 62 3b 0a 20 20 69 66 28 20 28 70 54 6f 70 6c 65  b;.  if( (pTople
1efa0 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  vel->cookieMask 
1efb0 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
1efc0 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f    pToplevel->coo
1efd0 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  kieMask |= mask;
1efe0 0a 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  .    pToplevel->
1eff0 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d  cookieValue[iDb]
1f000 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1f010 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f  pSchema->schema_
1f020 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 69 66 28 20  cookie;.    if( 
1f030 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
1f040 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
1f050 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
1f060 61 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76 65  atabase(pTopleve
1f070 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
1f080 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ./*.** If argume
1f090 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20  nt zDb is NULL, 
1f0a0 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65  then call sqlite
1f0b0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
1f0c0 61 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a  a() for each .**
1f0d0 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
1f0e0 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  se. Otherwise, i
1f0f0 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68 65  nvoke it for the
1f100 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20   database named 
1f110 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  zDb only..*/.voi
1f120 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  d sqlite3CodeVer
1f130 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 50  ifyNamedSchema(P
1f140 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
1f150 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
1f160 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1f170 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
1f180 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1f190 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
1f1a0 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
1f1b0 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
1f1c0 69 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26 20  if( pDb->pBt && 
1f1d0 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c 69  (!zDb || 0==sqli
1f1e0 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20  te3StrICmp(zDb, 
1f1f0 70 44 62 2d 3e 7a 4e 61 6d 65 29 29 20 29 7b 0a  pDb->zName)) ){.
1f200 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
1f210 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
1f220 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  arse, i);.    }.
1f230 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
1f240 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
1f250 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f  that prepares fo
1f260 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61  r doing an opera
1f270 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67  tion that.** mig
1f280 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61  ht change the da
1f290 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
1f2a0 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74  is routine start
1f2b0 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  s a new transact
1f2c0 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f  ion if we are no
1f2d0 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  t already within
1f2e0 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f  .** a transactio
1f2f0 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c  n.  If we are al
1f300 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74  ready within a t
1f310 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
1f320 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a   a checkpoint.**
1f330 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73   is set if the s
1f340 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61  etStatement para
1f350 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20  meter is true.  
1f360 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  A checkpoint sho
1f370 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f  uld.** be set fo
1f380 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61  r operations tha
1f390 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75  t might fail (du
1f3a0 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e  e to a constrain
1f3b0 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  t) part of.** th
1f3c0 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e  e way through an
1f3d0 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65  d which will nee
1f3e0 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77  d to undo some w
1f3f0 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61  rites without ha
1f400 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62  ving to.** rollb
1f410 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72  ack the whole tr
1f420 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20  ansaction.  For 
1f430 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65  operations where
1f440 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
1f450 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b  .** can be check
1f460 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68  ed before any ch
1f470 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
1f480 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  o the database, 
1f490 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e  it is never.** n
1f4a0 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f  ecessary to undo
1f4b0 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65   a write and the
1f4c0 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
1f4d0 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a  ld not be set..*
1f4e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
1f4f0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1f500 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
1f510 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e   int setStatemen
1f520 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50  t, int iDb){.  P
1f530 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
1f540 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
1f550 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
1f560 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
1f570 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
1f580 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65  , iDb);.  pTople
1f590 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c  vel->writeMask |
1f5a0 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c  = ((yDbMask)1)<<
1f5b0 69 44 62 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  iDb;.  pToplevel
1f5c0 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 7c  ->isMultiWrite |
1f5d0 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a  = setStatement;.
1f5e0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  }../*.** Indicat
1f5f0 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
1f600 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 75  ment currently u
1f610 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1f620 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a 2a  n might write.**
1f630 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
1f640 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20 64  ntry (example: d
1f650 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77 20  eleting one row 
1f660 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 61  then inserting a
1f670 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65 72  nother,.** inser
1f680 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ting multiple ro
1f690 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20 6f  ws in a table, o
1f6a0 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72 6f  r inserting a ro
1f6b0 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72  w and index entr
1f6c0 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20 61  ies.).** If an a
1f6d0 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74 65  bort occurs afte
1f6e0 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65 20  r some of these 
1f6f0 77 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d 70  writes have comp
1f700 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20 77  leted, then it w
1f710 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73  ill.** be necess
1f720 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65 20  ary to undo the 
1f730 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65 73  completed writes
1f740 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1f750 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72 73  3MultiWrite(Pars
1f760 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61  e *pParse){.  Pa
1f770 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
1f780 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
1f790 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
1f7a0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75   pToplevel->isMu
1f7b0 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d 0a  ltiWrite = 1;.}.
1f7c0 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ./* .** The code
1f7d0 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c 73   generator calls
1f7e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 66   this routine if
1f7f0 20 69 73 20 64 69 73 63 6f 76 65 72 73 20 74 68   is discovers th
1f800 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73  at it is.** poss
1f810 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61 20  ible to abort a 
1f820 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72 20  statement prior 
1f830 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20  to completion.  
1f840 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a 20  In order to .** 
1f850 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62 6f  perform this abo
1f860 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72 75  rt without corru
1f870 70 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  pting the databa
1f880 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6d  se, we need to m
1f890 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61 74  ake.** sure that
1f8a0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
1f8b0 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 61  s protected by a
1f8c0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
1f8d0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65  action..**.** Te
1f8e0 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f 6e  chnically, we on
1f8f0 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20 74  ly need to set t
1f900 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61 67  he mayAbort flag
1f910 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75 6c   if the.** isMul
1f920 74 69 57 72 69 74 65 20 66 6c 61 67 20 77 61 73  tiWrite flag was
1f930 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 2e   previously set.
1f940 20 20 54 68 65 72 65 20 69 73 20 61 20 74 69 6d    There is a tim
1f950 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20  e dependency.** 
1f960 73 75 63 68 20 74 68 61 74 20 74 68 65 20 61 62  such that the ab
1f970 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20 61  ort must occur a
1f980 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77 72  fter the multiwr
1f990 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73  ite.  This makes
1f9a0 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d 65  .** some stateme
1f9b0 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68  nts involving th
1f9c0 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69  e REPLACE confli
1f9d0 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
1f9e0 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61 20  gorithm.** go a 
1f9f0 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20 20  little faster.  
1fa00 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61 6e  But taking advan
1fa10 74 61 67 65 20 6f 66 20 74 68 69 73 20 74 69 6d  tage of this tim
1fa20 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20  e dependency.** 
1fa30 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64 69  makes it more di
1fa40 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76 65  fficult to prove
1fa50 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 69   that the code i
1fa60 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a 2a  s correct (in .*
1fa70 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69 74  * particular, it
1fa80 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f   prevents us fro
1fa90 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66 66  m writing an eff
1faa0 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d  ective.** implem
1fab0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69  entation of sqli
1fac0 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72  te3AssertMayAbor
1fad0 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20 68  t()) and so we h
1fae0 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f  ave chosen.** to
1faf0 20 74 61 6b 65 20 74 68 65 20 73 61 66 65 20 72   take the safe r
1fb00 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74 68  oute and skip th
1fb10 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  e optimization..
1fb20 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  */.void sqlite3M
1fb30 61 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a 70  ayAbort(Parse *p
1fb40 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20  Parse){.  Parse 
1fb50 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
1fb60 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
1fb70 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f  l(pParse);.  pTo
1fb80 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74  plevel->mayAbort
1fb90 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 1;.}../*.** C
1fba0 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74  ode an OP_Halt t
1fbb0 68 61 74 20 63 61 75 73 65 73 20 74 68 65 20 76  hat causes the v
1fbc0 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  dbe to return an
1fbd0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
1fbe0 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65  NT.** error. The
1fbf0 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65 74   onError paramet
1fc00 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  er determines wh
1fc10 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66 20  ich (if any) of 
1fc20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
1fc30 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74 20   and/or current 
1fc40 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1fc50 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76  olled back..*/.v
1fc60 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74 43  oid sqlite3HaltC
1fc70 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
1fc80 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
1fc90 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1fca0 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  t */.  int errCo
1fcb0 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78 74 65  de,      /* exte
1fcc0 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20  nded error code 
1fcd0 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
1fce0 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  ,      /* Constr
1fcf0 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 63  aint type */.  c
1fd00 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20 20 20  har *p4,        
1fd10 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67   /* Error messag
1fd20 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79 70 65  e */.  i8 p4type
1fd30 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34 5f 53  ,        /* P4_S
1fd40 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52 41 4e  TATIC or P4_TRAN
1fd50 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70 35  SIENT */.  u8 p5
1fd60 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f 2a 20  Errmsg       /* 
1fd70 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65 20 2a  P5_ErrMsg type *
1fd80 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
1fd90 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1fda0 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
1fdb0 74 28 20 28 65 72 72 43 6f 64 65 26 30 78 66 66  t( (errCode&0xff
1fdc0 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  )==SQLITE_CONSTR
1fdd0 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f 6e  AINT );.  if( on
1fde0 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20  Error==OE_Abort 
1fdf0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61  ){.    sqlite3Ma
1fe00 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
1fe10 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
1fe20 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61  eAddOp4(v, OP_Ha
1fe30 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e 45  lt, errCode, onE
1fe40 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34 74  rror, 0, p4, p4t
1fe50 79 70 65 29 3b 0a 20 20 69 66 28 20 70 35 45 72  ype);.  if( p5Er
1fe60 72 6d 73 67 20 29 20 73 71 6c 69 74 65 33 56 64  rmsg ) sqlite3Vd
1fe70 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35  beChangeP5(v, p5
1fe80 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Errmsg);.}../*.*
1fe90 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
1fea0 74 20 64 75 65 20 74 6f 20 55 4e 49 51 55 45 20  t due to UNIQUE 
1feb0 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
1fec0 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
1fed0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
1fee0 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72  ite3UniqueConstr
1fef0 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
1ff00 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
1ff10 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1ff20 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
1ff30 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e      /* Constrain
1ff40 74 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e 64 65  t type */.  Inde
1ff50 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 2f 2a  x *pIdx       /*
1ff60 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   The index that 
1ff70 74 72 69 67 67 65 72 73 20 74 68 65 20 63 6f 6e  triggers the con
1ff80 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20  straint */.){.  
1ff90 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 69 6e  char *zErr;.  in
1ffa0 74 20 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  t j;.  StrAccum 
1ffb0 65 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c 65 20  errMsg;.  Table 
1ffc0 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54  *pTab = pIdx->pT
1ffd0 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33  able;..  sqlite3
1ffe0 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 65 72  StrAccumInit(&er
1fff0 72 4d 73 67 2c 20 30 2c 20 30 2c 20 32 30 30 29  rMsg, 0, 0, 200)
20000 3b 0a 20 20 65 72 72 4d 73 67 2e 64 62 20 3d 20  ;.  errMsg.db = 
20010 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f  pParse->db;.  fo
20020 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
20030 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  KeyCol; j++){.  
20040 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70    char *zCol = p
20050 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e  Tab->aCol[pIdx->
20060 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61  aiColumn[j]].zNa
20070 6d 65 3b 0a 20 20 20 20 69 66 28 20 6a 20 29 20  me;.    if( j ) 
20080 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
20090 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22  ppend(&errMsg, "
200a0 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20 73 71 6c  , ", 2);.    sql
200b0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
200c0 6e 64 41 6c 6c 28 26 65 72 72 4d 73 67 2c 20 70  ndAll(&errMsg, p
200d0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
200e0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
200f0 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20  Append(&errMsg, 
20100 22 2e 22 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ".", 1);.    sql
20110 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
20120 6e 64 41 6c 6c 28 26 65 72 72 4d 73 67 2c 20 7a  ndAll(&errMsg, z
20130 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 7a 45 72 72  Col);.  }.  zErr
20140 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   = sqlite3StrAcc
20150 75 6d 46 69 6e 69 73 68 28 26 65 72 72 4d 73 67  umFinish(&errMsg
20160 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74  );.  sqlite3Halt
20170 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
20180 65 2c 20 0a 20 20 20 20 28 70 49 64 78 2d 3e 61  e, .    (pIdx->a
20190 75 74 6f 49 6e 64 65 78 3d 3d 32 29 3f 53 51 4c  utoIndex==2)?SQL
201a0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
201b0 52 49 4d 41 52 59 4b 45 59 3a 53 51 4c 49 54 45  RIMARYKEY:SQLITE
201c0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51  _CONSTRAINT_UNIQ
201d0 55 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f 72 2c  UE,.    onError,
201e0 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49   zErr, P4_DYNAMI
201f0 43 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74  C, P5_Constraint
20200 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  Unique);.}.../*.
20210 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61  ** Code an OP_Ha
20220 6c 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e  lt due to non-un
20230 69 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76  ique rowid..*/.v
20240 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 77 69 64  oid sqlite3Rowid
20250 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
20260 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
20270 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
20280 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  xt */.  int onEr
20290 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ror,      /* Con
202a0 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
202b0 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20   algorithm */.  
202c0 54 61 62 6c 65 20 2a 70 54 61 62 20 20 20 20 20  Table *pTab     
202d0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 77    /* The table w
202e0 69 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e 69 71  ith the non-uniq
202f0 75 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a  ue rowid */ .){.
20300 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20    char *zMsg;.  
20310 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 54  int rc;.  if( pT
20320 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a  ab->iPKey>=0 ){.
20330 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
20340 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
20350 2d 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70  ->db, "%s.%s", p
20360 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
20370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20380 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
20390 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e  [pTab->iPKey].zN
203a0 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ame);.    rc = S
203b0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
203c0 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 7d  _PRIMARYKEY;.  }
203d0 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67 20 3d  else{.    zMsg =
203e0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
203f0 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e  pParse->db, "%s.
20400 72 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  rowid", pTab->zN
20410 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ame);.    rc = S
20420 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
20430 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 73 71  _ROWID;.  }.  sq
20440 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61  lite3HaltConstra
20450 69 6e 74 28 70 50 61 72 73 65 2c 20 72 63 2c 20  int(pParse, rc, 
20460 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c 20 50  onError, zMsg, P
20470 34 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20 20 20  4_DYNAMIC,.     
20480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20490 20 20 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74     P5_Constraint
204a0 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Unique);.}../*.*
204b0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
204c0 66 20 70 49 6e 64 65 78 20 75 73 65 73 20 74 68  f pIndex uses th
204d0 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
204e0 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74  ence pColl.  Ret
204f0 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69  urn.** true if i
20500 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65  t does and false
20510 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   if it does not.
20520 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
20530 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
20540 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61  static int colla
20550 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20  tionMatch(const 
20560 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64  char *zColl, Ind
20570 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69  ex *pIndex){.  i
20580 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
20590 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f  zColl!=0 );.  fo
205a0 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d  r(i=0; i<pIndex-
205b0 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
205c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
205d0 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  z = pIndex->azCo
205e0 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  ll[i];.    asser
205f0 74 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65  t( z!=0 || pInde
20600 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30  x->aiColumn[i]<0
20610 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64   );.    if( pInd
20620 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e  ex->aiColumn[i]>
20630 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  =0 && 0==sqlite3
20640 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c  StrICmp(z, zColl
20650 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
20660 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
20670 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
20680 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d  dif../*.** Recom
20690 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
206a0 20 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73   of pTab that us
206b0 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  e the collating 
206c0 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a  sequence pColl..
206d0 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  ** If pColl==0 t
206e0 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c  hen recompute al
206f0 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
20700 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  b..*/.#ifndef SQ
20710 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
20720 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
20730 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65  indexTable(Parse
20740 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
20750 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73  *pTab, char cons
20760 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64  t *zColl){.  Ind
20770 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
20780 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
20790 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
207a0 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20  with pTab */..  
207b0 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d  for(pIndex=pTab-
207c0 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
207d0 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e   pIndex=pIndex->
207e0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
207f0 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c  zColl==0 || coll
20800 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c  ationMatch(zColl
20810 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  , pIndex) ){.   
20820 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
20830 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
20840 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
20850 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
20860 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
20870 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
20880 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
20890 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
208a0 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
208b0 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
208c0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
208d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
208e0 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
208f0 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
20900 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65  ll databases whe
20910 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65  re the.** indice
20920 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  s use the collat
20930 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
20940 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ll.  If pColl==0
20950 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a   then recompute.
20960 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65  ** all indices e
20970 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69  verywhere..*/.#i
20980 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20990 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
209a0 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74   void reindexDat
209b0 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50  abases(Parse *pP
209c0 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74  arse, char const
209d0 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a   *zColl){.  Db *
209e0 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
209f0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
20a00 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  gle database */.
20a10 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
20a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20a30 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
20a40 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
20a50 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
20a60 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
20a70 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
20a80 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68  ection */.  Hash
20a90 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
20aa0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
20ab0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
20ac0 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54  es in pDb */.  T
20ad0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
20ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
20af0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
20b00 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65  abase */..  asse
20b10 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
20b20 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28  HoldsAllMutexes(
20b30 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65  db) );  /* Neede
20b40 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63  d for schema acc
20b50 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62  ess */.  for(iDb
20b60 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b  =0, pDb=db->aDb;
20b70 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
20b80 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20  b++, pDb++){.   
20b90 20 61 73 73 65 72 74 28 20 70 44 62 21 3d 30 20   assert( pDb!=0 
20ba0 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c  );.    for(k=sql
20bb0 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44  iteHashFirst(&pD
20bc0 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
20bd0 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69  ash);  k; k=sqli
20be0 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a  teHashNext(k)){.
20bf0 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
20c00 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
20c10 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65  ata(k);.      re
20c20 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
20c30 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b  e, pTab, zColl);
20c40 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
20c50 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  dif../*.** Gener
20c60 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
20c70 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
20c80 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52  ..**.**        R
20c90 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20  EINDEX          
20ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cb0 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20    -- 1.**       
20cc0 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61   REINDEX  <colla
20cd0 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20  tion>           
20ce0 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20      -- 2.**     
20cf0 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
20d00 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e  tabase>.?<tablen
20d10 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20  ame>  -- 3.**   
20d20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c       REINDEX  ?<
20d30 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65  database>.?<inde
20d40 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a  xname>  -- 4.**.
20d50 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73  ** Form 1 causes
20d60 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20   all indices in 
20d70 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
20d80 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62  abases to be reb
20d90 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20  uilt..** Form 2 
20da0 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64  rebuilds all ind
20db0 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  ices in all data
20dc0 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74  bases that use t
20dd0 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c  he named.** coll
20de0 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20  ating function. 
20df0 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72   Forms 3 and 4 r
20e00 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64  ebuild the named
20e10 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a   index or all.**
20e20 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
20e30 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d  ted with the nam
20e40 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66  ed table..*/.#if
20e50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20e60 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71  _REINDEX.void sq
20e70 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72  lite3Reindex(Par
20e80 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
20e90 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e  n *pName1, Token
20ea0 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c   *pName2){.  Col
20eb0 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
20ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
20ed0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
20ee0 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20  o be reindexed, 
20ef0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61  or NULL */.  cha
20f00 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
20f10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
20f20 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
20f30 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndex */.  const 
20f40 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20  char *zDb;      
20f50 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
20f60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
20f70 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
20f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20f90 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
20fa0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49   database */.  I
20fb0 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
20fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
20fd0 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
20fe0 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20  d with pTab */. 
20ff0 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
21000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21010 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
21020 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  ex number */.  s
21030 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
21040 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68  rse->db;   /* Th
21050 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
21060 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ction */.  Token
21070 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20   *pObjName;     
21080 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
21090 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69  f the table or i
210a0 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64  ndex to be reind
210b0 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  exed */..  /* Re
210c0 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ad the database 
210d0 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72  schema. If an er
210e0 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76  ror occurs, leav
210f0 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
21100 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65  ge.  ** and code
21110 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
21120 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  eturn NULL. */. 
21130 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
21140 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
21150 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
21160 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
21170 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b  if( pName1==0 ){
21180 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61  .    reindexData
21190 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29  bases(pParse, 0)
211a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
211b0 7d 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28  }else if( NEVER(
211c0 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e  pName2==0) || pN
211d0 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  ame2->z==0 ){.  
211e0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20    char *zColl;. 
211f0 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
21200 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c  1->z );.    zCol
21210 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
21220 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
21230 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  >db, pName1);.  
21240 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72    if( !zColl ) r
21250 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c  eturn;.    pColl
21260 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
21270 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62  llSeq(db, ENC(db
21280 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20  ), zColl, 0);.  
21290 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
212a0 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61       reindexData
212b0 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43  bases(pParse, zC
212c0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  oll);.      sqli
212d0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
212e0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oll);.      retu
212f0 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
21300 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
21310 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44  zColl);.  }.  iD
21320 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
21330 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
21340 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
21350 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
21360 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b   iDb<0 ) return;
21370 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
21380 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
21390 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  pObjName);.  if(
213a0 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
213b0 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b    zDb = db->aDb[
213c0 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54  iDb].zName;.  pT
213d0 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
213e0 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62  Table(db, z, zDb
213f0 29 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b  );.  if( pTab ){
21400 0a 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c  .    reindexTabl
21410 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
21420 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  0);.    sqlite3D
21430 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
21440 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
21450 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
21460 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c  FindIndex(db, z,
21470 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   zDb);.  sqlite3
21480 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
21490 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20   if( pIndex ){. 
214a0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
214b0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
214c0 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
214d0 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c     sqlite3Refill
214e0 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49  Index(pParse, pI
214f0 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72  ndex, -1);.    r
21500 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c  eturn;.  }.  sql
21510 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
21520 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
21530 69 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a  identify the obj
21540 65 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65  ect to be reinde
21550 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  xed");.}.#endif.
21560 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
21570 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
21580 65 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70  e that is approp
21590 72 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69  riate for the gi
215a0 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  ven Index..**.**
215b0 20 54 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72   The KeyInfo str
215c0 75 63 74 75 72 65 20 66 6f 72 20 61 6e 20 69 6e  ucture for an in
215d0 64 65 78 20 69 73 20 63 61 63 68 65 64 20 69 6e  dex is cached in
215e0 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
215f0 74 2e 0a 2a 2a 20 53 6f 20 74 68 65 72 65 20 6d  t..** So there m
21600 69 67 68 74 20 62 65 20 6d 75 6c 74 69 70 6c 65  ight be multiple
21610 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
21620 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e  he returned poin
21630 74 65 72 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c  ter.  The.** cal
21640 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 74  ler should not t
21650 72 79 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  ry to modify the
21660 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 2e   KeyInfo object.
21670 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
21680 72 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20  r should invoke 
21690 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
216a0 72 65 66 28 29 20 6f 6e 20 74 68 65 20 72 65 74  ref() on the ret
216b0 75 72 6e 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20  urned object.** 
216c0 77 68 65 6e 20 69 74 20 68 61 73 20 66 69 6e 69  when it has fini
216d0 73 68 65 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a  shed using it..*
216e0 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74  /.KeyInfo *sqlit
216f0 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78  e3KeyInfoOfIndex
21700 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
21710 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
21720 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
21730 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 69 66   ) return 0;.#if
21740 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
21750 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
21760 69 66 28 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e  if( pIdx->pKeyIn
21770 66 6f 20 26 26 20 70 49 64 78 2d 3e 70 4b 65 79  fo && pIdx->pKey
21780 49 6e 66 6f 2d 3e 64 62 21 3d 70 50 61 72 73 65  Info->db!=pParse
21790 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69  ->db ){.    sqli
217a0 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
217b0 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b  pIdx->pKeyInfo);
217c0 0a 20 20 20 20 70 49 64 78 2d 3e 70 4b 65 79 49  .    pIdx->pKeyI
217d0 6e 66 6f 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  nfo = 0;.  }.#en
217e0 64 69 66 0a 20 20 69 66 28 20 70 49 64 78 2d 3e  dif.  if( pIdx->
217f0 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pKeyInfo==0 ){. 
21800 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
21810 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e  t nCol = pIdx->n
21820 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20  Column;.    int 
21830 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b 65  nKey = pIdx->nKe
21840 79 43 6f 6c 3b 0a 20 20 20 20 4b 65 79 49 6e 66  yCol;.    KeyInf
21850 6f 20 2a 70 4b 65 79 3b 0a 20 20 20 20 69 66 28  o *pKey;.    if(
21860 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75   pIdx->uniqNotNu
21870 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79  ll ){.      pKey
21880 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
21890 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  oAlloc(pParse->d
218a0 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b  b, nKey, nCol-nK
218b0 65 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ey);.    }else{.
218c0 20 20 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c        pKey = sql
218d0 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63  ite3KeyInfoAlloc
218e0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f  (pParse->db, nCo
218f0 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l, 0);.    }.   
21900 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
21910 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
21920 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65  e3KeyInfoIsWrite
21930 61 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20 20  able(pKey) );.  
21940 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
21950 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
21960 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d     char *zColl =
21970 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d   pIdx->azColl[i]
21980 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
21990 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20  ( zColl!=0 );.  
219a0 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c        pKey->aCol
219b0 6c 5b 69 5d 20 3d 20 73 74 72 63 6d 70 28 7a 43  l[i] = strcmp(zC
219c0 6f 6c 6c 2c 22 42 49 4e 41 52 59 22 29 3d 3d 30  oll,"BINARY")==0
219d0 20 3f 20 30 20 3a 0a 20 20 20 20 20 20 20 20 20   ? 0 :.         
219e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219f0 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
21a00 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
21a10 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  oll);.        pK
21a20 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ey->aSortOrder[i
21a30 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ] = pIdx->aSortO
21a40 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 7d  rder[i];.      }
21a50 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
21a60 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20  e->nErr ){.     
21a70 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66     sqlite3KeyInf
21a80 6f 55 6e 72 65 66 28 70 4b 65 79 29 3b 0a 20 20  oUnref(pKey);.  
21a90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21aa0 20 20 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66     pIdx->pKeyInf
21ab0 6f 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20  o = pKey;.      
21ac0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
21ad0 74 75 72 6e 20 73 71 6c 69 74 65 33 4b 65 79 49  turn sqlite3KeyI
21ae0 6e 66 6f 52 65 66 28 70 49 64 78 2d 3e 70 4b 65  nfoRef(pIdx->pKe
21af0 79 49 6e 66 6f 29 3b 0a 7d 0a 0a 23 69 66 6e 64  yInfo);.}..#ifnd
21b00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
21b10 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72  TE./* .** This r
21b20 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
21b30 64 20 6f 6e 63 65 20 70 65 72 20 43 54 45 20 62  d once per CTE b
21b40 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
21b50 6c 65 20 70 61 72 73 69 6e 67 20 61 20 0a 2a 2a  le parsing a .**
21b60 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20 0a 2a   WITH clause. .*
21b70 2f 0a 57 69 74 68 20 2a 73 71 6c 69 74 65 33 57  /.With *sqlite3W
21b80 69 74 68 41 64 64 28 0a 20 20 50 61 72 73 65 20  ithAdd(.  Parse 
21b90 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
21ba0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
21bb0 74 65 78 74 20 2a 2f 0a 20 20 57 69 74 68 20 2a  text */.  With *
21bc0 70 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20  pWith,          
21bd0 20 20 2f 2a 20 45 78 69 73 74 69 6e 67 20 57 49    /* Existing WI
21be0 54 48 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55  TH clause, or NU
21bf0 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
21c00 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
21c10 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
21c20 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20  ommon-table */. 
21c30 20 45 78 70 72 4c 69 73 74 20 2a 70 41 72 67 6c   ExprList *pArgl
21c40 69 73 74 2c 20 20 20 20 20 2f 2a 20 4f 70 74 69  ist,     /* Opti
21c50 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  onal column name
21c60 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 74 61   list for the ta
21c70 62 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ble */.  Select 
21c80 2a 70 51 75 65 72 79 20 20 20 20 20 20 20 20 20  *pQuery         
21c90 20 2f 2a 20 51 75 65 72 79 20 75 73 65 64 20 74   /* Query used t
21ca0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
21cb0 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73   table */.){.  s
21cc0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
21cd0 72 73 65 2d 3e 64 62 3b 0a 20 20 57 69 74 68 20  rse->db;.  With 
21ce0 2a 70 4e 65 77 3b 0a 20 20 63 68 61 72 20 2a 7a  *pNew;.  char *z
21cf0 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  Name;..  /* Chec
21d00 6b 20 74 68 61 74 20 74 68 65 20 43 54 45 20 6e  k that the CTE n
21d10 61 6d 65 20 69 73 20 75 6e 69 71 75 65 20 77 69  ame is unique wi
21d20 74 68 69 6e 20 74 68 69 73 20 57 49 54 48 20 63  thin this WITH c
21d30 6c 61 75 73 65 2e 20 49 66 0a 20 20 2a 2a 20 6e  lause. If.  ** n
21d40 6f 74 2c 20 73 74 6f 72 65 20 61 6e 20 65 72 72  ot, store an err
21d50 6f 72 20 69 6e 20 74 68 65 20 50 61 72 73 65 20  or in the Parse 
21d60 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
21d70 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
21d80 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
21d90 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b  rse->db, pName);
21da0 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20  .  if( zName && 
21db0 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74  pWith ){.    int
21dc0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
21dd0 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20   i<pWith->nCte; 
21de0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
21df0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
21e00 4e 61 6d 65 2c 20 70 57 69 74 68 2d 3e 61 5b 69  Name, pWith->a[i
21e10 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
21e20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
21e30 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
21e40 64 75 70 6c 69 63 61 74 65 20 57 49 54 48 20 74  duplicate WITH t
21e50 61 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22 2c 20  able name: %s", 
21e60 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  zName);.      }.
21e70 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
21e80 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e   pWith ){.    in
21e90 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
21ea0 28 2a 70 57 69 74 68 29 20 2b 20 28 73 69 7a 65  (*pWith) + (size
21eb0 6f 66 28 70 57 69 74 68 2d 3e 61 5b 31 5d 29 20  of(pWith->a[1]) 
21ec0 2a 20 70 57 69 74 68 2d 3e 6e 43 74 65 29 3b 0a  * pWith->nCte);.
21ed0 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
21ee0 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
21ef0 70 57 69 74 68 2c 20 6e 42 79 74 65 29 3b 0a 20  pWith, nByte);. 
21f00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
21f10 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
21f20 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
21f30 66 28 2a 70 57 69 74 68 29 29 3b 0a 20 20 7d 0a  f(*pWith));.  }.
21f40 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21    assert( zName!
21f50 3d 30 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 3b  =0 || pNew==0 );
21f60 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d  .  assert( db->m
21f70 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c  allocFailed==0 |
21f80 7c 20 70 4e 65 77 3d 3d 30 20 29 3b 0a 0a 20 20  | pNew==0 );..  
21f90 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
21fa0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
21fb0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 41 72  stDelete(db, pAr
21fc0 67 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  glist);.    sqli
21fd0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
21fe0 64 62 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 20  db, pQuery);.   
21ff0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
22000 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  b, zName);.    p
22010 4e 65 77 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d  New = pWith;.  }
22020 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
22030 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53  a[pNew->nCte].pS
22040 65 6c 65 63 74 20 3d 20 70 51 75 65 72 79 3b 0a  elect = pQuery;.
22050 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
22060 2d 3e 6e 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20  ->nCte].pCols = 
22070 70 41 72 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e  pArglist;.    pN
22080 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
22090 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b  ].zName = zName;
220a0 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65  .    pNew->a[pNe
220b0 77 2d 3e 6e 43 74 65 5d 2e 7a 45 72 72 20 3d 20  w->nCte].zErr = 
220c0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74  0;.    pNew->nCt
220d0 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  e++;.  }..  retu
220e0 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
220f0 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65  * Free the conte
22100 6e 74 73 20 6f 66 20 74 68 65 20 57 69 74 68 20  nts of the With 
22110 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
22120 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
22130 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
22140 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65 28  lite3WithDelete(
22150 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74  sqlite3 *db, Wit
22160 68 20 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28  h *pWith){.  if(
22170 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e   pWith ){.    in
22180 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
22190 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b  ; i<pWith->nCte;
221a0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
221b0 75 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20  uct Cte *pCte = 
221c0 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20  &pWith->a[i];.  
221d0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
221e0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
221f0 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20  te->pCols);.    
22200 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
22210 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e  elete(db, pCte->
22220 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
22230 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
22240 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCte->zName);.
22250 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
22260 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 69 74  3DbFree(db, pWit
22270 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  h);.  }.}.#endif
22280 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
22290 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f  ITE_OMIT_CTE) */
222a0 0a                                               .