/ Hex Artifact Content
Login

Artifact 2dccf54c05a0102fce82a3147c39a4b582a7eb60:


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 73 71 6c 69 74 65   v ){.    sqlite
10b0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
10c0: 50 5f 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a  P_Halt);..    /*
10d0: 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b   The cookie mask
10e0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69   contains one bi
10f0: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
1100: 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20  ase file open.. 
1110: 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20     ** (Bit 0 is 
1120: 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20  for main, bit 1 
1130: 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64  is for temp, and
1140: 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74   so forth.)  Bit
1150: 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74  s are.    ** set
1160: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
1170: 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e  se that is used.
1180: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
1190: 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a  to start a.    *
11a0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  * transaction on
11b0: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
11c0: 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66  ase and to verif
11d0: 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
11e0: 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61  kie.    ** on ea
11f0: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
1200: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1210: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1220: 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 79  oto>0 ){.      y
1230: 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 20  DbMask mask;.   
1240: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
1250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1260: 70 48 65 72 65 28 76 2c 20 70 50 61 72 73 65 2d  pHere(v, pParse-
1270: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a  >cookieGoto-1);.
1280: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30 2c        for(iDb=0,
1290: 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d   mask=1; iDb<db-
12a0: 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20  >nDb; mask<<=1, 
12b0: 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  iDb++){.        
12c0: 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50 61 72  if( (mask & pPar
12d0: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d  se->cookieMask)=
12e0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
12f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1300: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
1310: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
1320: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1330: 2c 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c  ,OP_Transaction,
1340: 20 69 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50   iDb, (mask & pP
1350: 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29  arse->writeMask)
1360: 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  !=0);.        if
1370: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
1380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1390: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
13a0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
13b0: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
13c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13e0: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 0a 20 20  VerifyCookie,.  
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 20 20 20 20 20 20 20 20 20 69 44 62 2c 20 70            iDb, p
1410: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c  Parse->cookieVal
1420: 75 65 5b 69 44 62 5d 2c 0a 20 20 20 20 20 20 20  ue[iDb],.       
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
1450: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65  ].pSchema->iGene
1460: 72 61 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  ration);.       
1470: 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64   }.      }.#ifnd
1480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1490: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
14a0: 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20    {.        int 
14b0: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
14c0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56  =0; i<pParse->nV
14d0: 74 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20  tabLock; i++){. 
14e0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 76           char *v
14f0: 74 61 62 20 3d 20 28 63 68 61 72 20 2a 29 73 71  tab = (char *)sq
1500: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
1510: 62 2c 20 70 50 61 72 73 65 2d 3e 61 70 56 74 61  b, pParse->apVta
1520: 62 4c 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20  bLock[i]);.     
1530: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1540: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65  AddOp4(v, OP_VBe
1550: 67 69 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74  gin, 0, 0, 0, vt
1560: 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20  ab, P4_VTAB);.  
1570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1580: 70 50 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63  pParse->nVtabLoc
1590: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  k = 0;.      }.#
15a0: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
15b0: 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f  Once all the coo
15c0: 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e 20 76  kies have been v
15d0: 65 72 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e  erified and tran
15e0: 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c  sactions opened,
15f0: 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69   .      ** obtai
1600: 6e 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  n the required t
1610: 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73  able-locks. This
1620: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
1630: 73 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ss the .      **
1640: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65   shared-cache fe
1650: 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64  ature is enabled
1660: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1670: 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28   codeTableLocks(
1680: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1690: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  /* Initialize an
16a0: 79 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  y AUTOINCREMENT 
16b0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
16c0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20  required..      
16d0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
16e0: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67  AutoincrementBeg
16f0: 69 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20  in(pParse);..   
1700: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1710: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1720: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1730: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1740: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1750: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1760: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72  OP_Goto, 0, pPar
1770: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b  se->cookieGoto);
1780: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
1790: 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20 70  * Get the VDBE p
17a0: 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72  rogram ready for
17b0: 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a   execution.  */.
17c0: 20 20 69 66 28 20 76 20 26 26 20 41 4c 57 41 59    if( v && ALWAY
17d0: 53 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  S(pParse->nErr==
17e0: 30 29 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  0) && !db->mallo
17f0: 63 46 61 69 6c 65 64 20 29 7b 0a 23 69 66 64 65  cFailed ){.#ifde
1800: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1810: 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d     FILE *trace =
1820: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
1830: 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65 29 21  LITE_VdbeTrace)!
1840: 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b  =0 ? stdout : 0;
1850: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1860: 54 72 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b  Trace(v, trace);
1870: 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
1880: 72 74 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63  rt( pParse->iCac
1890: 68 65 4c 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f  heLevel==0 );  /
18a0: 2a 20 44 69 73 61 62 6c 65 73 20 61 6e 64 20 72  * Disables and r
18b0: 65 2d 65 6e 61 62 6c 65 73 20 6d 61 74 63 68 20  e-enables match 
18c0: 2a 2f 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69  */.    /* A mini
18d0: 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f  mum of one curso
18e0: 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69 66  r is required if
18f0: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69   autoincrement i
1900: 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53 65  s used.    *  Se
1910: 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33 37  e ticket [a69637
1920: 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20  9c1f08866] */.  
1930: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 41    if( pParse->pA
1940: 69 6e 63 21 3d 30 20 26 26 20 70 50 61 72 73 65  inc!=0 && pParse
1950: 2d 3e 6e 54 61 62 3d 3d 30 20 29 20 70 50 61 72  ->nTab==0 ) pPar
1960: 73 65 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20  se->nTab = 1;.  
1970: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b    sqlite3VdbeMak
1980: 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73 65  eReady(v, pParse
1990: 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  );.    pParse->r
19a0: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
19b0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c  .    pParse->col
19c0: 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20  NamesSet = 0;.  
19d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73  }else{.    pPars
19e0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  e->rc = SQLITE_E
19f0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72  RROR;.  }.  pPar
1a00: 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20  se->nTab = 0;.  
1a10: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30  pParse->nMem = 0
1a20: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74  ;.  pParse->nSet
1a30: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1a40: 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50 61 72  nVar = 0;.  pPar
1a50: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d  se->cookieMask =
1a60: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f   0;.  pParse->co
1a70: 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a  okieGoto = 0;.}.
1a80: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70  ./*.** Run the p
1a90: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67  arser and code g
1aa0: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69  enerator recursi
1ab0: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  vely in order to
1ac0: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64   generate.** cod
1ad0: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74  e for the SQL st
1ae0: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e  atement given on
1af0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
1b00: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74  e pParse context
1b10: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  .** currently un
1b20: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
1b30: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73  .  When the pars
1b40: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73  er is run recurs
1b50: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61  ively.** this wa
1b60: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f  y, the final OP_
1b70: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65  Halt is not appe
1b80: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69  nded and other i
1b90: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a  nitialization.**
1ba0: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f   and finalizatio
1bb0: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74  n steps are omit
1bc0: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73  ted because thos
1bd0: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62  e are handling b
1be0: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f  y the.** outermo
1bf0: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a  st parser..**.**
1c00: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20   Not everything 
1c10: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68  is nestable.  Th
1c20: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64  is facility is d
1c30: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69  esigned to permi
1c40: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44  t.** INSERT, UPD
1c50: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
1c60: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e  operations again
1c70: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  st SQLITE_MASTER
1c80: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69  .  Use.** care i
1c90: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20  f you decide to 
1ca0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20  try to use this 
1cb0: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65  routine for some
1cc0: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e   other purposes.
1cd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ce0: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73  NestedParse(Pars
1cf0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
1d00: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1d10: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1d20: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
1d30: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
1d40: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  g = 0;.  sqlite3
1d50: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1d60: 62 3b 0a 23 20 64 65 66 69 6e 65 20 53 41 56 45  b;.# define SAVE
1d70: 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50 61 72  _SZ  (sizeof(Par
1d80: 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 50  se) - offsetof(P
1d90: 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20 63 68  arse,nVar)).  ch
1da0: 61 72 20 73 61 76 65 42 75 66 5b 53 41 56 45 5f  ar saveBuf[SAVE_
1db0: 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  SZ];..  if( pPar
1dc0: 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72  se->nErr ) retur
1dd0: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  n;.  assert( pPa
1de0: 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29  rse->nested<10 )
1df0: 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68  ;  /* Nesting sh
1e00: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20  ould only be of 
1e10: 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20 2a 2f  limited depth */
1e20: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
1e30: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c  zFormat);.  zSql
1e40: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
1e50: 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20  tf(db, zFormat, 
1e60: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
1e70: 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
1e80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 20   ){.    return; 
1e90: 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75    /* A malloc mu
1ea0: 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
1eb0: 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e  /.  }.  pParse->
1ec0: 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63  nested++;.  memc
1ed0: 70 79 28 73 61 76 65 42 75 66 2c 20 26 70 50 61  py(saveBuf, &pPa
1ee0: 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56 45 5f  rse->nVar, SAVE_
1ef0: 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  SZ);.  memset(&p
1f00: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30 2c 20  Parse->nVar, 0, 
1f10: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71 6c 69  SAVE_SZ);.  sqli
1f20: 74 65 33 52 75 6e 50 61 72 73 65 72 28 70 50 61  te3RunParser(pPa
1f30: 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72  rse, zSql, &zErr
1f40: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
1f50: 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
1f60: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  g);.  sqlite3DbF
1f70: 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b 0a 20  ree(db, zSql);. 
1f80: 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73 65 2d   memcpy(&pParse-
1f90: 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66 2c 20  >nVar, saveBuf, 
1fa0: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50 61 72  SAVE_SZ);.  pPar
1fb0: 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a  se->nested--;.}.
1fc0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
1fd0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
1fe0: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
1ff0: 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  ibes a particula
2000: 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61  r database.** ta
2010: 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61  ble given the na
2020: 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65  me of that table
2030: 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79   and (optionally
2040: 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  ) the name of th
2050: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
2060: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62  ntaining the tab
2070: 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  le.  Return NULL
2080: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
2090: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
20a0: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
20b0: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
20c0: 65 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ed for the table
20d0: 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69 72 73   and the.** firs
20e0: 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65  t matching table
20f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
2100: 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  No checking for 
2110: 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c 65 0a  duplicate table.
2120: 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ** names is done
2130: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
2140: 72 64 65 72 20 69 73 20 54 45 4d 50 20 66 69 72  rder is TEMP fir
2150: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
2160: 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78 69 6c  hen any.** auxil
2170: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
2180: 64 64 65 64 20 75 73 69 6e 67 20 74 68 65 20 41  dded using the A
2190: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
21a0: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
21b0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
21c0: 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ()..*/.Table *sq
21d0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 73  lite3FindTable(s
21e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
21f0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
2200: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61  onst char *zData
2210: 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  base){.  Table *
2220: 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  p = 0;.  int i;.
2230: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 61    int nName;.  a
2240: 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20  ssert( zName!=0 
2250: 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  );.  nName = sql
2260: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
2270: 6d 65 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75  me);.  /* All mu
2280: 74 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72  texes are requir
2290: 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63  ed for schema ac
22a0: 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65  cess.  Make sure
22b0: 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a   we hold them. *
22c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44 61 74  /.  assert( zDat
22d0: 61 62 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69  abase!=0 || sqli
22e0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
22f0: 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20  Mutexes(db) );. 
2300: 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50   for(i=OMIT_TEMP
2310: 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  DB; i<db->nDb; i
2320: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
2330: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
2340: 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  ;   /* Search TE
2350: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
2360: 2f 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62  /.    if( zDatab
2370: 61 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65  ase!=0 && sqlite
2380: 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61  3StrICmp(zDataba
2390: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  se, db->aDb[j].z
23a0: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
23b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
23c0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
23d0: 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29  Held(db, j, 0) )
23e0: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
23f0: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
2400: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  Db[j].pSchema->t
2410: 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e  blHash, zName, n
2420: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Name);.    if( p
2430: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
2440: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
2450: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
2460: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
2470: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
2480: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
2490: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
24a0: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
24b0: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
24c0: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
24d0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
24e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
24f0: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
2500: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
2510: 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f  not found.  Also
2520: 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72   leave an.** err
2530: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
2540: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
2550: 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
2560: 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
2570: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c   routine and sql
2580: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
2590: 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20  is that this.** 
25a0: 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61  routine leaves a
25b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
25c0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
25d0: 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69  sg where.** sqli
25e0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64  te3FindTable() d
25f0: 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c  oes not..*/.Tabl
2600: 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  e *sqlite3Locate
2610: 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a  Table(.  Parse *
2620: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
2630: 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68  /* context in wh
2640: 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72  ich to report er
2650: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73  rors */.  int is
2660: 56 69 65 77 2c 20 20 20 20 20 20 20 20 20 20 20  View,           
2670: 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b   /* True if look
2680: 69 6e 67 20 66 6f 72 20 61 20 56 49 45 57 20 72  ing for a VIEW r
2690: 61 74 68 65 72 20 74 68 61 6e 20 61 20 54 41 42  ather than a TAB
26a0: 4c 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  LE */.  const ch
26b0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f  ar *zName,     /
26c0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
26d0: 62 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  ble we are looki
26e0: 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  ng for */.  cons
26f0: 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20  t char *zDbase  
2700: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2710: 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67  e database.  Mig
2720: 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  ht be NULL */.){
2730: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20  .  Table *p;..  
2740: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
2750: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
2760: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2770: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
2780: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
2790: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
27a0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
27b0: 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
27c0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
27d0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
27e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
27f0: 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74    }..  p = sqlit
2800: 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
2810: 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a  se->db, zName, z
2820: 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  Dbase);.  if( p=
2830: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
2840: 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56  char *zMsg = isV
2850: 69 65 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76  iew ? "no such v
2860: 69 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20  iew" : "no such 
2870: 74 61 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20  table";.    if( 
2880: 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  zDbase ){.      
2890: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
28a0: 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e  pParse, "%s: %s.
28b0: 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73  %s", zMsg, zDbas
28c0: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, zName);.    }
28d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
28e0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
28f0: 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d  se, "%s: %s", zM
2900: 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  sg, zName);.    
2910: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
2920: 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
2930: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
2940: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
2950: 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66  he table identif
2960: 69 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a  ied by *p..**.**
2970: 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70 70   This is a wrapp
2980: 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65  er around sqlite
2990: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20  3LocateTable(). 
29a0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
29b0: 65 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  etween.** sqlite
29c0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61  3LocateTable() a
29d0: 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
29e0: 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75   is that this fu
29f0: 6e 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73  nction restricts
2a00: 0a 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 74  .** the search t
2a10: 6f 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63  o schema (p->pSc
2a20: 68 65 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e  hema) if it is n
2a30: 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68  ot NULL. p->pSch
2a40: 65 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f  ema may be.** no
2a50: 6e 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20  n-NULL if it is 
2a60: 70 61 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f  part of a view o
2a70: 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  r trigger progra
2a80: 6d 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65  m definition. Se
2a90: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53  e.** sqlite3FixS
2aa0: 72 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74  rcList() for det
2ab0: 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  ails..*/.Table *
2ac0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
2ad0: 6c 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20  leItem(.  Parse 
2ae0: 2a 70 50 61 72 73 65 2c 20 0a 20 20 69 6e 74 20  *pParse, .  int 
2af0: 69 73 56 69 65 77 2c 20 0a 20 20 73 74 72 75 63  isView, .  struc
2b00: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
2b10: 70 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  p.){.  const cha
2b20: 72 20 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74  r *zDb;.  assert
2b30: 28 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20  ( p->pSchema==0 
2b40: 7c 7c 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d  || p->zDatabase=
2b50: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
2b60: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e  Schema ){.    in
2b70: 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
2b80: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
2b90: 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68  rse->db, p->pSch
2ba0: 65 6d 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20  ema);.    zDb = 
2bb0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
2bc0: 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65  iDb].zName;.  }e
2bd0: 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70  lse{.    zDb = p
2be0: 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d  ->zDatabase;.  }
2bf0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
2c00: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
2c10: 72 73 65 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e  rse, isView, p->
2c20: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a  zName, zDb);.}..
2c30: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
2c40: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
2c50: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2c60: 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63  bes .** a partic
2c70: 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e  ular index given
2c80: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
2c90: 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74  t index.** and t
2ca0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
2cb0: 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e  atabase that con
2cc0: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e  tains the index.
2cd0: 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
2ce0: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
2cf0: 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65  .** If zDatabase
2d00: 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62   is 0, all datab
2d10: 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65  ases are searche
2d20: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62  d for the.** tab
2d30: 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  le and the first
2d40: 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20   matching index 
2d50: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e  is returned.  (N
2d60: 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f  o checking.** fo
2d70: 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65  r duplicate inde
2d80: 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e  x names is done.
2d90: 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72  )  The search or
2da0: 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66  der is.** TEMP f
2db0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2dc0: 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69   then any auxili
2dd0: 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64  ary databases ad
2de0: 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ded.** using the
2df0: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
2e00: 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
2e10: 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69  e3FindIndex(sqli
2e20: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
2e30: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73  har *zName, cons
2e40: 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
2e50: 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20  Index *p = 0;.  
2e60: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61  int i;.  int nNa
2e70: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
2e80: 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 2f  en30(zName);.  /
2e90: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
2ea0: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
2eb0: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
2ec0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
2ed0: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
2ee0: 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73 71  rt( zDb!=0 || sq
2ef0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
2f00: 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
2f10: 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45  .  for(i=OMIT_TE
2f20: 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  MPDB; i<db->nDb;
2f30: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a   i++){.    int j
2f40: 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a   = (i<2) ? i^1 :
2f50: 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54   i;  /* Search T
2f60: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
2f70: 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  */.    Schema *p
2f80: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
2f90: 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [j].pSchema;.   
2fa0: 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61   assert( pSchema
2fb0: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20   );.    if( zDb 
2fc0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2fd0: 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a  p(zDb, db->aDb[j
2fe0: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2ff0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
3000: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3010: 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30  texHeld(db, j, 0
3020: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
3030: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53  ite3HashFind(&pS
3040: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
3050: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
3060: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
3070: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61  ;.}../*.** Recla
3090: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73  im the memory us
30a0: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a  ed by an index.*
30b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
30c0: 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  eeIndex(sqlite3 
30d0: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b 0a  *db, Index *p){.
30e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30f0: 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 71  MIT_ANALYZE.  sq
3100: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
3110: 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b 0a  Samples(db, p);.
3120: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
3130: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
3140: 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29  ->pPartIdxWhere)
3150: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
3160: 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66  e(db, p->zColAff
3170: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65  );.  if( p->isRe
3180: 73 69 7a 65 64 20 29 20 73 71 6c 69 74 65 33 44  sized ) sqlite3D
3190: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 43  bFree(db, p->azC
31a0: 6f 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  oll);.  sqlite3D
31b0: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
31c0: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69  ./*.** For the i
31d0: 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78  ndex called zIdx
31e0: 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f  Name which is fo
31f0: 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  und in the datab
3200: 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69  ase iDb,.** unli
3210: 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66 72  ke that index fr
3220: 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68 65  om its Table the
3230: 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  n remove the ind
3240: 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69  ex from.** the i
3250: 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65 20  ndex hash table 
3260: 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d  and free all mem
3270: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 61  ory structures a
3280: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
3290: 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a  h the index..*/.
32a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69  void sqlite3Unli
32b0: 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78  nkAndDeleteIndex
32c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
32d0: 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61  t iDb, const cha
32e0: 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20  r *zIdxName){.  
32f0: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
3300: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68   int len;.  Hash
3310: 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65   *pHash;..  asse
3320: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3330: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3340: 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73  Db, 0) );.  pHas
3350: 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  h = &db->aDb[iDb
3360: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ].pSchema->idxHa
3370: 73 68 3b 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69  sh;.  len = sqli
3380: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 78  te3Strlen30(zIdx
3390: 4e 61 6d 65 29 3b 0a 20 20 70 49 6e 64 65 78 20  Name);.  pIndex 
33a0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
33b0: 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78 4e  ert(pHash, zIdxN
33c0: 61 6d 65 2c 20 6c 65 6e 2c 20 30 29 3b 0a 20 20  ame, len, 0);.  
33d0: 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e 64 65  if( ALWAYS(pInde
33e0: 78 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  x) ){.    if( pI
33f0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
3400: 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  ndex==pIndex ){.
3410: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54        pIndex->pT
3420: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70  able->pIndex = p
3430: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
3440: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
3450: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 2f  ndex *p;.      /
3460: 2a 20 4a 75 73 74 69 66 69 63 61 74 69 6f 6e 20  * Justification 
3470: 6f 66 20 41 4c 57 41 59 53 28 29 3b 20 20 54 68  of ALWAYS();  Th
3480: 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20  e index must be 
3490: 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 0a 20  on the list of. 
34a0: 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e       ** indices.
34b0: 20 2a 2f 0a 20 20 20 20 20 20 70 20 3d 20 70 49   */.      p = pI
34c0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
34d0: 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c  ndex;.      whil
34e0: 65 28 20 41 4c 57 41 59 53 28 70 29 20 26 26 20  e( ALWAYS(p) && 
34f0: 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78  p->pNext!=pIndex
3500: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
3510: 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c  ; }.      if( AL
3520: 57 41 59 53 28 70 20 26 26 20 70 2d 3e 70 4e 65  WAYS(p && p->pNe
3530: 78 74 3d 3d 70 49 6e 64 65 78 29 20 29 7b 0a 20  xt==pIndex) ){. 
3540: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
3550: 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b  = pIndex->pNext;
3560: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3570: 20 20 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c     freeIndex(db,
3580: 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20   pIndex);.  }.  
3590: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
35a0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
35b0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b  s;.}../*.** Look
35c0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 69 73   through the lis
35d0: 74 20 6f 66 20 6f 70 65 6e 20 64 61 74 61 62 61  t of open databa
35e0: 73 65 20 66 69 6c 65 73 20 69 6e 20 64 62 2d 3e  se files in db->
35f0: 61 44 62 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a 20  aDb[] and if.** 
3600: 61 6e 79 20 68 61 76 65 20 62 65 65 6e 20 63 6c  any have been cl
3610: 6f 73 65 64 2c 20 72 65 6d 6f 76 65 20 74 68 65  osed, remove the
3620: 6d 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 2e  m from the list.
3630: 20 20 52 65 61 6c 6c 6f 63 61 74 65 20 74 68 65    Reallocate the
3640: 0a 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d 20 73 74  .** db->aDb[] st
3650: 72 75 63 74 75 72 65 20 74 6f 20 61 20 73 6d 61  ructure to a sma
3660: 6c 6c 65 72 20 73 69 7a 65 2c 20 69 66 20 70 6f  ller size, if po
3670: 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e  ssible..**.** En
3680: 74 72 79 20 30 20 28 74 68 65 20 22 6d 61 69 6e  try 0 (the "main
3690: 22 20 64 61 74 61 62 61 73 65 29 20 61 6e 64 20  " database) and 
36a0: 65 6e 74 72 79 20 31 20 28 74 68 65 20 22 74 65  entry 1 (the "te
36b0: 6d 70 22 20 64 61 74 61 62 61 73 65 29 0a 2a 2a  mp" database).**
36c0: 20 61 72 65 20 6e 65 76 65 72 20 63 61 6e 64 69   are never candi
36d0: 64 61 74 65 73 20 66 6f 72 20 62 65 69 6e 67 20  dates for being 
36e0: 63 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f  collapsed..*/.vo
36f0: 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70  id sqlite3Collap
3700: 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28  seDatabaseArray(
3710: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
3720: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28  int i, j;.  for(
3730: 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62  i=j=2; i<db->nDb
3740: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
3750: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
3760: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
3770: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
3780: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
3790: 46 72 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a 4e  Free(db, pDb->zN
37a0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  ame);.      pDb-
37b0: 3e 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  >zName = 0;.    
37c0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
37d0: 7d 0a 20 20 20 20 69 66 28 20 6a 3c 69 20 29 7b  }.    if( j<i ){
37e0: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a  .      db->aDb[j
37f0: 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a  ] = db->aDb[i];.
3800: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
3810: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 64 62 2d   }.  memset(&db-
3820: 3e 61 44 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d  >aDb[j], 0, (db-
3830: 3e 6e 44 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64  >nDb-j)*sizeof(d
3840: 62 2d 3e 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64  b->aDb[j]));.  d
3850: 62 2d 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66  b->nDb = j;.  if
3860: 28 20 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20  ( db->nDb<=2 && 
3870: 64 62 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62  db->aDb!=db->aDb
3880: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65  Static ){.    me
3890: 6d 63 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74  mcpy(db->aDbStat
38a0: 69 63 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73  ic, db->aDb, 2*s
38b0: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d  izeof(db->aDb[0]
38c0: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ));.    sqlite3D
38d0: 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44  bFree(db, db->aD
38e0: 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20  b);.    db->aDb 
38f0: 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b  = db->aDbStatic;
3900: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
3910: 73 65 74 20 74 68 65 20 73 63 68 65 6d 61 20 66  set the schema f
3920: 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
3930: 61 74 20 69 6e 64 65 78 20 69 44 62 2e 20 20 41  at index iDb.  A
3940: 6c 73 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a  lso reset the.**
3950: 20 54 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f   TEMP schema..*/
3960: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73  .void sqlite3Res
3970: 65 74 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69  etOneSchema(sqli
3980: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
3990: 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20  ){.  Db *pDb;.  
39a0: 61 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e  assert( iDb<db->
39b0: 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 73  nDb );..  /* Cas
39c0: 65 20 31 3a 20 20 52 65 73 65 74 20 74 68 65 20  e 1:  Reset the 
39d0: 73 69 6e 67 6c 65 20 73 63 68 65 6d 61 20 69 64  single schema id
39e0: 65 6e 74 69 66 69 65 64 20 62 79 20 69 44 62 20  entified by iDb 
39f0: 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  */.  pDb = &db->
3a00: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 61 73 73 65  aDb[iDb];.  asse
3a10: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3a20: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3a30: 44 62 2c 20 30 29 20 29 3b 0a 20 20 61 73 73 65  Db, 0) );.  asse
3a40: 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  rt( pDb->pSchema
3a50: 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
3a60: 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d  SchemaClear(pDb-
3a70: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a  >pSchema);..  /*
3a80: 20 49 66 20 61 6e 79 20 64 61 74 61 62 61 73 65   If any database
3a90: 20 6f 74 68 65 72 20 74 68 61 6e 20 54 45 4d 50   other than TEMP
3aa0: 20 69 73 20 72 65 73 65 74 2c 20 74 68 65 6e 20   is reset, then 
3ab0: 61 6c 73 6f 20 72 65 73 65 74 20 54 45 4d 50 0a  also reset TEMP.
3ac0: 20 20 2a 2a 20 73 69 6e 63 65 20 54 45 4d 50 20    ** since TEMP 
3ad0: 6d 69 67 68 74 20 62 65 20 68 6f 6c 64 69 6e 67  might be holding
3ae0: 20 74 72 69 67 67 65 72 73 20 74 68 61 74 20 72   triggers that r
3af0: 65 66 65 72 65 6e 63 65 20 74 61 62 6c 65 73 20  eference tables 
3b00: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65  in the.  ** othe
3b10: 72 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  r database..  */
3b20: 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b  .  if( iDb!=1 ){
3b30: 0a 20 20 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  .    pDb = &db->
3b40: 61 44 62 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65  aDb[1];.    asse
3b50: 72 74 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  rt( pDb->pSchema
3b60: 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  !=0 );.    sqlit
3b70: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44  e3SchemaClear(pD
3b80: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  b->pSchema);.  }
3b90: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
3ba0: 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63  .** Erase all sc
3bb0: 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hema information
3bc0: 20 66 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68   from all attach
3bd0: 65 64 20 64 61 74 61 62 61 73 65 73 20 28 69 6e  ed databases (in
3be0: 63 6c 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e  cluding.** "main
3bf0: 22 20 61 6e 64 20 22 74 65 6d 70 22 29 20 66 6f  " and "temp") fo
3c00: 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  r a single datab
3c10: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
3c20: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
3c30: 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66  esetAllSchemasOf
3c40: 43 6f 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74  Connection(sqlit
3c50: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
3c60: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
3c70: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
3c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
3c90: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  Db; i++){.    Db
3ca0: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3cb0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3cc0: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
3cd0: 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61     sqlite3Schema
3ce0: 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65  Clear(pDb->pSche
3cf0: 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ma);.    }.  }. 
3d00: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
3d10: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
3d20: 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 56 74  ges;.  sqlite3Vt
3d30: 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29  abUnlockList(db)
3d40: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
3d50: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20  LeaveAll(db);.  
3d60: 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44  sqlite3CollapseD
3d70: 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62 29  atabaseArray(db)
3d80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
3d90: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3da0: 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20  d when a commit 
3db0: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
3dc0: 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
3dd0: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c  ernalChanges(sql
3de0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d  ite3 *db){.  db-
3df0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
3e00: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
3e10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
3e20: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65   memory allocate
3e30: 64 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  d for the column
3e40: 20 6e 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c   names of a tabl
3e50: 65 20 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a  e or view (the.*
3e60: 2a 20 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61  * Table.aCol[] a
3e70: 72 72 61 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rray)..*/.static
3e80: 20 76 6f 69 64 20 73 71 6c 69 74 65 44 65 6c 65   void sqliteDele
3e90: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71  teColumnNames(sq
3ea0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
3eb0: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74   *pTable){.  int
3ec0: 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43   i;.  Column *pC
3ed0: 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54  ol;.  assert( pT
3ee0: 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  able!=0 );.  if(
3ef0: 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d   (pCol = pTable-
3f00: 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20  >aCol)!=0 ){.   
3f10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
3f20: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  le->nCol; i++, p
3f30: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  Col++){.      sq
3f40: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3f50: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pCol->zName);.  
3f60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
3f70: 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  elete(db, pCol->
3f80: 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  pDflt);.      sq
3f90: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3fa0: 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20  pCol->zDflt);.  
3fb0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
3fc0: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70  e(db, pCol->zTyp
3fd0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
3fe0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
3ff0: 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  ->zColl);.    }.
4000: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4010: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43  e(db, pTable->aC
4020: 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ol);.  }.}../*.*
4030: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
4040: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
4050: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
4060: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
4070: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
4080: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
4090: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
40a0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
40b0: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
40c0: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
40d0: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
40e0: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
40f0: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
4100: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
4110: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
4120: 42 75 74 20 69 74 20 64 6f 65 73 20 64 65 73 74  But it does dest
4130: 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74  roy.** memory st
4140: 72 75 63 74 75 72 65 73 20 6f 66 20 74 68 65 20  ructures of the 
4150: 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65  indices and fore
4160: 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63 69 61  ign keys associa
4170: 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65  ted with .** the
4180: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
4190: 65 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 69  e db parameter i
41a0: 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20  s optional.  It 
41b0: 69 73 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  is needed if the
41c0: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a   Table object .*
41d0: 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61  * contains looka
41e0: 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54  side memory.  (T
41f0: 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 69 6e 20  able objects in 
4200: 74 68 65 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f  the schema do no
4210: 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69  t use.** lookasi
4220: 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73  de memory, but s
4230: 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c 20 54 61  ome ephemeral Ta
4240: 62 6c 65 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29  ble objects do.)
4250: 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64 62 20 70    Or the.** db p
4260: 61 72 61 6d 65 74 65 72 20 63 61 6e 20 62 65 20  arameter can be 
4270: 75 73 65 64 20 77 69 74 68 20 64 62 2d 3e 70 6e  used with db->pn
4280: 42 79 74 65 73 46 72 65 65 64 20 74 6f 20 6d 65  BytesFreed to me
4290: 61 73 75 72 65 20 74 68 65 20 6d 65 6d 6f 72 79  asure the memory
42a0: 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20  .** used by the 
42b0: 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Table object..*/
42c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
42d0: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
42e0: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61   *db, Table *pTa
42f0: 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ble){.  Index *p
4300: 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20  Index, *pNext;. 
4310: 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 6e   TESTONLY( int n
4320: 4c 6f 6f 6b 61 73 69 64 65 3b 20 29 20 2f 2a 20  Lookaside; ) /* 
4330: 55 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 6c  Used to verify l
4340: 6f 6f 6b 61 73 69 64 65 20 6e 6f 74 20 75 73 65  ookaside not use
4350: 64 20 66 6f 72 20 73 63 68 65 6d 61 20 2a 2f 0a  d for schema */.
4360: 0a 20 20 61 73 73 65 72 74 28 20 21 70 54 61 62  .  assert( !pTab
4370: 6c 65 20 7c 7c 20 70 54 61 62 6c 65 2d 3e 6e 52  le || pTable->nR
4380: 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f  ef>0 );..  /* Do
4390: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
43a0: 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20  table until the 
43b0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
43c0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f  reaches zero. */
43d0: 0a 20 20 69 66 28 20 21 70 54 61 62 6c 65 20 29  .  if( !pTable )
43e0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
43f0: 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79  (!db || db->pnBy
4400: 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20  tesFreed==0) && 
4410: 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52 65 66 29  (--pTable->nRef)
4420: 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  >0) ) return;.. 
4430: 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e   /* Record the n
4440: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
4450: 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20 61  ding lookaside a
4460: 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e 20 73 63  llocations in sc
4470: 68 65 6d 61 20 54 61 62 6c 65 73 0a 20 20 2a 2a  hema Tables.  **
4480: 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20   prior to doing 
4490: 61 6e 79 20 66 72 65 65 28 29 20 6f 70 65 72 61  any free() opera
44a0: 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65 20 73 63  tions.  Since sc
44b0: 68 65 6d 61 20 54 61 62 6c 65 73 20 64 6f 20 6e  hema Tables do n
44c0: 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b  ot use.  ** look
44d0: 61 73 69 64 65 2c 20 74 68 69 73 20 6e 75 6d 62  aside, this numb
44e0: 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68  er should not ch
44f0: 61 6e 67 65 2e 20 2a 2f 0a 20 20 54 45 53 54 4f  ange. */.  TESTO
4500: 4e 4c 59 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 20  NLY( nLookaside 
4510: 3d 20 28 64 62 20 26 26 20 28 70 54 61 62 6c 65  = (db && (pTable
4520: 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
4530: 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 29 20 3f  Ephemeral)==0) ?
4540: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4550: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f            db->lo
4560: 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 3a 20 30  okaside.nOut : 0
4570: 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65   );..  /* Delete
4580: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
4590: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
45a0: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f  s table. */.  fo
45b0: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c  r(pIndex = pTabl
45c0: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  e->pIndex; pInde
45d0: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29  x; pIndex=pNext)
45e0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49  {.    pNext = pI
45f0: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
4600: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
4610: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65  >pSchema==pTable
4620: 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
4630: 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e   if( !db || db->
4640: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
4650: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
4660: 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a  Name = pIndex->z
4670: 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20 54 45 53  Name; .      TES
4680: 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78 20 2a 70  TONLY ( Index *p
4690: 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74 65 33 48  Old = ) sqlite3H
46a0: 61 73 68 49 6e 73 65 72 74 28 0a 20 20 20 20 20  ashInsert(.     
46b0: 20 20 20 20 26 70 49 6e 64 65 78 2d 3e 70 53 63      &pIndex->pSc
46c0: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a  hema->idxHash, z
46d0: 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72  Name, sqlite3Str
46e0: 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 20 30 0a  len30(zName), 0.
46f0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
4700: 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20  ssert( db==0 || 
4710: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
4720: 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
4730: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
4740: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4750: 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20  pOld==pIndex || 
4760: 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  pOld==0 );.    }
4770: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
4780: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
4790: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
47a0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74   foreign keys at
47b0: 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74  tached to this t
47c0: 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  able. */.  sqlit
47d0: 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70  e3FkDelete(db, p
47e0: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65  Table);..  /* De
47f0: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
4800: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
4810: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 44 65  .  */.  sqliteDe
4820: 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
4830: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73  db, pTable);.  s
4840: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4850: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
4860: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
4870: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f  (db, pTable->zCo
4880: 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  lAff);.  sqlite3
4890: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
48a0: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
48b0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
48c0: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73  E_OMIT_CHECK.  s
48d0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
48e0: 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  lete(db, pTable-
48f0: 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66  >pCheck);.#endif
4900: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4910: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
4920: 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43  E.  sqlite3VtabC
4930: 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29  lear(db, pTable)
4940: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
4950: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
4960: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  ble);..  /* Veri
4970: 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  fy that no looka
4980: 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20  side memory was 
4990: 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74  used by schema t
49a0: 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  ables */.  asser
49b0: 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30  t( nLookaside==0
49c0: 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d   || nLookaside==
49d0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
49e0: 75 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ut );.}../*.** U
49f0: 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20  nlink the given 
4a00: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68  table from the h
4a10: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
4a20: 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  he delete the.**
4a30: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
4a40: 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e   with all its in
4a50: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
4a60: 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20  n keys..*/.void 
4a70: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
4a80: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
4a90: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
4aa0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
4ab0: 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  abName){.  Table
4ac0: 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a   *p;.  Db *pDb;.
4ad0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
4ae0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
4af0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
4b00: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
4b10: 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61   zTabName );.  a
4b20: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
4b30: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
4b40: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 74  , iDb, 0) );.  t
4b50: 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d  estcase( zTabNam
4b60: 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a  e[0]==0 );  /* Z
4b70: 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65  ero-length table
4b80: 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77   names are allow
4b90: 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64  ed */.  pDb = &d
4ba0: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
4bb0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
4bc0: 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65  sert(&pDb->pSche
4bd0: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61  ma->tblHash, zTa
4be0: 62 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  bName,.         
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4c00: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
4c10: 54 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20 20 73  TabName),0);.  s
4c20: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
4c30: 65 28 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e  e(db, p);.  db->
4c40: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
4c50: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d  InternChanges;.}
4c60: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
4c70: 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20  token, return a 
4c80: 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73  string that cons
4c90: 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78 74  ists of the text
4ca0: 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65   of that.** toke
4cb0: 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  n.  Space to hol
4cc0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
4cd0: 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61  tring.** is obta
4ce0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
4cf0: 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  Malloc() and mus
4d00: 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
4d10: 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
4d20: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  ction..**.** Any
4d30: 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73   quotation marks
4d40: 20 28 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27   (ex:  "name", '
4d50: 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f  name', [name], o
4d60: 72 20 60 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a  r `name`) that.*
4d70: 2a 20 73 75 72 72 6f 75 6e 64 20 74 68 65 20 62  * surround the b
4d80: 6f 64 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e  ody of the token
4d90: 20 61 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a   are removed..**
4da0: 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f  .** Tokens are o
4db0: 66 74 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65  ften just pointe
4dc0: 72 73 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  rs into the orig
4dd0: 69 6e 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e  inal SQL text an
4de0: 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20  d so.** are not 
4df0: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20  \000 terminated 
4e00: 61 6e 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73  and are not pers
4e10: 69 73 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74  istent.  The ret
4e20: 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20  urned string.** 
4e30: 69 73 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  is \000 terminat
4e40: 65 64 20 61 6e 64 20 69 73 20 70 65 72 73 69 73  ed and is persis
4e50: 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tent..*/.char *s
4e60: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
4e70: 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ken(sqlite3 *db,
4e80: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
4e90: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
4ea0: 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
4eb0: 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
4ec0: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
4ed0: 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20  char*)pName->z, 
4ee0: 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73  pName->n);.    s
4ef0: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e  qlite3Dequote(zN
4f00: 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
4f10: 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20     zName = 0;.  
4f20: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65  }.  return zName
4f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
4f40: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
4f50: 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69  r table stored i
4f60: 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65  n database numbe
4f70: 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69  r iDb for.** wri
4f80: 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20  ting. The table 
4f90: 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20  is opened using 
4fa0: 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69  cursor 0..*/.voi
4fb0: 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73  d sqlite3OpenMas
4fc0: 74 65 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a  terTable(Parse *
4fd0: 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56  p, int iDb){.  V
4fe0: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
4ff0: 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71  GetVdbe(p);.  sq
5000: 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70  lite3TableLock(p
5010: 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f  , iDb, MASTER_RO
5020: 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54 41  OT, 1, SCHEMA_TA
5030: 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73 71 6c  BLE(iDb));.  sql
5040: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
5050: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
5060: 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  0, MASTER_ROOT, 
5070: 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  iDb);.  sqlite3V
5080: 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d  dbeChangeP4(v, -
5090: 31 2c 20 28 63 68 61 72 20 2a 29 35 2c 20 50 34  1, (char *)5, P4
50a0: 5f 49 4e 54 33 32 29 3b 20 20 2f 2a 20 35 20 63  _INT32);  /* 5 c
50b0: 6f 6c 75 6d 6e 20 74 61 62 6c 65 20 2a 2f 0a 20  olumn table */. 
50c0: 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20   if( p->nTab==0 
50d0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d  ){.    p->nTab =
50e0: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
50f0: 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65   Parameter zName
5100: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c   points to a nul
5110: 2d 74 65 72 6d 69 6e 61 74 65 64 20 62 75 66 66  -terminated buff
5120: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
5130: 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64  e name.** of a d
5140: 61 74 61 62 61 73 65 20 28 22 6d 61 69 6e 22 2c  atabase ("main",
5150: 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e   "temp" or the n
5160: 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68  ame of an attach
5170: 65 64 20 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20  ed db). This.** 
5180: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
5190: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
51a0: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
51b0: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
51c0: 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65 20 6e  r.** -1 if the n
51d0: 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74 20 62  amed db cannot b
51e0: 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  e found..*/.int 
51f0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
5200: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
5210: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
5220: 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b  ){.  int i = -1;
5230: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
5240: 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  base number */. 
5250: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
5260: 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20 20 69    Db *pDb;.    i
5270: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
5280: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
5290: 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44     for(i=(db->nD
52a0: 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61  b-1), pDb=&db->a
52b0: 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Db[i]; i>=0; i--
52c0: 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  , pDb--){.      
52d0: 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44  if( (!OMIT_TEMPD
52e0: 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e  B || i!=1 ) && n
52f0: 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
5300: 30 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26  0(pDb->zName) &&
5310: 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73   .          0==s
5320: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 44  qlite3StrICmp(pD
5330: 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  b->zName, zName)
5340: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
5350: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
5360: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
5370: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f  .}../*.** The to
5380: 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61  ken *pName conta
5390: 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ins the name of 
53a0: 61 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68  a database (eith
53b0: 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20  er "main" or.** 
53c0: 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61  "temp" or the na
53d0: 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65  me of an attache
53e0: 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74  d db). This rout
53f0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a  ine returns the.
5400: 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ** index of the 
5410: 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69  named database i
5420: 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20  n db->aDb[], or 
5430: 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  -1 if the named 
5440: 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  db .** does not 
5450: 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  exist..*/.int sq
5460: 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69  lite3FindDb(sqli
5470: 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a  te3 *db, Token *
5480: 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pName){.  int i;
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
54b0: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
54c0: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  r */.  char *zNa
54d0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
54f0: 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63  ame we are searc
5500: 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e  hing for */.  zN
5510: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
5520: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
5530: 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c  Name);.  i = sql
5540: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
5550: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  b, zName);.  sql
5560: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
5570: 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
5580: 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62  i;.}../* The tab
5590: 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 74 72  le or view or tr
55a0: 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 70 61  igger name is pa
55b0: 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75  ssed to this rou
55c0: 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a  tine via tokens.
55d0: 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e  ** pName1 and pN
55e0: 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62  ame2. If the tab
55f0: 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c  le name was full
5600: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72  y qualified, for
5610: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
5620: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78  CREATE TABLE xxx
5630: 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a  .yyy (...);.** .
5640: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
5650: 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61  s set to "xxx" a
5660: 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e  nd pName2 "yyy".
5670: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
5680: 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  nd if.** the tab
5690: 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66  le name is not f
56a0: 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20  ully qualified, 
56b0: 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41  i.e.:.**.** CREA
56c0: 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e  TE TABLE yyy(...
56d0: 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e  );.**.** Then pN
56e0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
56f0: 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  yyy" and pName2 
5700: 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  is ""..**.** Thi
5710: 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
5720: 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69  he *ppUnqual poi
5730: 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  nter to point at
5740: 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d   the token (pNam
5750: 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29  e1 or.** pName2)
5760: 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65   that stores the
5770: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62   unqualified tab
5780: 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e  le name.  The in
5790: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  dex of the.** da
57a0: 74 61 62 61 73 65 20 22 78 78 78 22 20 69 73 20  tabase "xxx" is 
57b0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
57c0: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
57d0: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
57e0: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
57f0: 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 20 67  rsing and code g
5800: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
5810: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
5820: 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame1,      /* Th
5830: 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 20 6e  e "xxx" in the n
5840: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 6f 72  ame "xxx.yyy" or
5850: 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65   "xxx" */.  Toke
5860: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 20  n *pName2,      
5870: 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 6e 20  /* The "yyy" in 
5880: 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79  the name "xxx.yy
5890: 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a  y" */.  Token **
58a0: 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a 20 57  pUnqual     /* W
58b0: 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 6c 69  rite the unquali
58c0: 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65  fied object name
58d0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
58e0: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
58f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
5900: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68  abase holding th
5910: 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71  e object */.  sq
5920: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5930: 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 41  se->db;..  if( A
5940: 4c 57 41 59 53 28 70 4e 61 6d 65 32 21 3d 30 29  LWAYS(pName2!=0)
5950: 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20   && pName2->n>0 
5960: 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69  ){.    if( db->i
5970: 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20 20 20  nit.busy ) {.   
5980: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5990: 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f 72 72  sg(pParse, "corr
59a0: 75 70 74 20 64 61 74 61 62 61 73 65 22 29 3b 0a  upt database");.
59b0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
59c0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75  rr++;.      retu
59d0: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
59e0: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
59f0: 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  e2;.    iDb = sq
5a00: 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20  lite3FindDb(db, 
5a10: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
5a20: 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20   iDb<0 ){.      
5a30: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5a40: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
5a50: 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70   database %T", p
5a60: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 70 50  Name1);.      pP
5a70: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
5a80: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
5a90: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
5aa0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e    assert( db->in
5ab0: 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d  it.iDb==0 || db-
5ac0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20  >init.busy );.  
5ad0: 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74    iDb = db->init
5ae0: 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75  .iDb;.    *pUnqu
5af0: 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d  al = pName1;.  }
5b00: 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d  .  return iDb;.}
5b10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5b20: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
5b30: 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54 46  check if the UTF
5b40: 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20  -8 string zName 
5b50: 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e  is a legal.** un
5b60: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66  qualified name f
5b70: 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20  or a new schema 
5b80: 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69  object (table, i
5b90: 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a  ndex, view or.**
5ba0: 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e   trigger). All n
5bb0: 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65  ames are legal e
5bc0: 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61 74  xcept those that
5bd0: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
5be0: 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74  string.** "sqlit
5bf0: 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c  e_" (in upper, l
5c00: 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61  ower or mixed ca
5c10: 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f  se). This portio
5c20: 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61  n of the namespa
5c30: 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65  ce.** is reserve
5c40: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
5c50: 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
5c60: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
5c70: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
5c80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
5c90: 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72  me){.  if( !pPar
5ca0: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
5cb0: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73  y && pParse->nes
5cc0: 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  ted==0 .        
5cd0: 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62    && (pParse->db
5ce0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
5cf0: 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30  _WriteSchema)==0
5d00: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30 3d  .          && 0=
5d10: 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  =sqlite3StrNICmp
5d20: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
5d30: 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c  ", 7) ){.    sql
5d40: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5d50: 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d  rse, "object nam
5d60: 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  e reserved for i
5d70: 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22  nternal use: %s"
5d80: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  , zName);.    re
5d90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
5da0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
5db0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5dc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50  .** Return the P
5dd0: 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78  RIMARY KEY index
5de0: 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49   of a table.*/.I
5df0: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69  ndex *sqlite3Pri
5e00: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62  maryKeyIndex(Tab
5e10: 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64  le *pTab){.  Ind
5e20: 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  ex *p;.  for(p=p
5e30: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  Tab->pIndex; p &
5e40: 26 20 70 2d 3e 61 75 74 6f 49 6e 64 65 78 21 3d  & p->autoIndex!=
5e50: 32 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d  2; p=p->pNext){}
5e60: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
5e70: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
5e80: 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
5e90: 20 70 49 64 78 20 74 68 61 74 20 63 6f 72 72 65   pIdx that corre
5ea0: 73 70 6f 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a  sponds to table.
5eb0: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20  ** column iCol. 
5ec0: 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f   Return -1 if no
5ed0: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20  t found..*/.i16 
5ee0: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
5ef0: 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78  ndex(Index *pIdx
5f00: 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69  , i16 iCol){.  i
5f10: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
5f20: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
5f30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
5f40: 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  iCol==pIdx->aiCo
5f50: 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e  lumn[i] ) return
5f60: 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
5f70: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   -1;.}../*.** Be
5f80: 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  gin constructing
5f90: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70   a new table rep
5fa0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d  resentation in m
5fb0: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a  emory.  This is.
5fc0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  ** the first of 
5fd0: 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72  several action r
5fe0: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74  outines that get
5ff0: 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f   called in respo
6000: 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41  nse.** to a CREA
6010: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
6020: 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c  nt.  In particul
6030: 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ar, this routine
6040: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66   is called.** af
6050: 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e  ter seeing token
6060: 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22  s "CREATE" and "
6070: 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74  TABLE" and the t
6080: 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69  able name. The i
6090: 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73  sTemp.** flag is
60a0: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62   true if the tab
60b0: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  le should be sto
60c0: 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c  red in the auxil
60d0: 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  iary database.**
60e0: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
60f0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
6100: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
6110: 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68  s is normally th
6120: 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74  e case.** when t
6130: 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45  he "TEMP" or "TE
6140: 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64  MPORARY" keyword
6150: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
6160: 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64  en.** CREATE and
6170: 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68   TABLE..**.** Th
6180: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
6190: 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  rd is initialize
61a0: 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61  d and put in pPa
61b0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a  rse->pNewTable..
61c0: 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68  ** As more of th
61d0: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
61e0: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
61f0: 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61  ed, additional a
6200: 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65  ction.** routine
6210: 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  s will be called
6220: 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66   to add more inf
6230: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73  ormation to this
6240: 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74   record..** At t
6250: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
6260: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
6270: 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65  ment, the sqlite
6280: 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74  3EndTable() rout
6290: 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
62a0: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
62b0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66   construction of
62c0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   the new table r
62d0: 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ecord..*/.void s
62e0: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
62f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6300: 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63  e,   /* Parser c
6310: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
6320: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20  n *pName1,   /* 
6330: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68  First part of th
6340: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
6350: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
6360: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
6370: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
6380: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
6390: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
63a0: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
63b0: 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p,      /* True 
63c0: 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  if this is a TEM
63d0: 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  P table */.  int
63e0: 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a   isView,      /*
63f0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
6400: 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74   a VIEW */.  int
6410: 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a   isVirtual,   /*
6420: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
6430: 20 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65   a VIRTUAL table
6440: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
6450: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
6460: 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c  hing if table al
6470: 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
6480: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
6490: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  le;.  char *zNam
64a0: 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61  e = 0; /* The na
64b0: 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  me of the new ta
64c0: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
64d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
64e0: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
64f0: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
6500: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
6510: 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68  ber to create th
6520: 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20  e table in */.  
6530: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20  Token *pName;   
6540: 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
6550: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
6560: 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a  e to create */..
6570: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f    /* The table o
6580: 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63  r view name to c
6590: 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64 20  reate is passed 
65a0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
65b0: 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20  via tokens.  ** 
65c0: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
65d0: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
65e0: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
65f0: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
6600: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
6610: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
6620: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a  x.yyy (...);.  *
6630: 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  * .  ** Then pNa
6640: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78  me1 is set to "x
6650: 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22  xx" and pName2 "
6660: 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68  yyy". On the oth
6670: 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20  er hand if.  ** 
6680: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
6690: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
66a0: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a  ified, i.e.:.  *
66b0: 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41  *.  ** CREATE TA
66c0: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20  BLE yyy(...);.  
66d0: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  **.  ** Then pNa
66e0: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
66f0: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
6700: 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  s ""..  **.  ** 
6710: 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73  The call below s
6720: 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f  ets the pName po
6730: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
6740: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
6750: 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d  me1 or.  ** pNam
6760: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
6770: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
6780: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
6790: 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a  variable iDb is.
67a0: 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20    ** set to the 
67b0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
67c0: 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20 74  abase that the t
67d0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20  able or view is 
67e0: 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74  to be.  ** creat
67f0: 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44  ed in..  */.  iD
6800: 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
6810: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
6820: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
6830: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  pName);.  if( iD
6840: 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
6850: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
6860: 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e   && isTemp && pN
6870: 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62  ame2->n>0 && iDb
6880: 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  !=1 ){.    /* If
6890: 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70   creating a temp
68a0: 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65   table, the name
68b0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c   may not be qual
68c0: 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20  ified. Unless . 
68d0: 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
68e0: 73 65 20 6e 61 6d 65 20 69 73 20 22 74 65 6d 70  se name is "temp
68f0: 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20  " anyway.  */.  
6900: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6910: 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f  g(pParse, "tempo
6920: 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20  rary table name 
6930: 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66  must be unqualif
6940: 69 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ied");.    retur
6950: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d  n;.  }.  if( !OM
6960: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
6970: 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a  emp ) iDb = 1;..
6980: 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54    pParse->sNameT
6990: 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20  oken = *pName;. 
69a0: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
69b0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
69c0: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
69d0: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
69e0: 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  n;.  if( SQLITE_
69f0: 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
6a00: 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
6a10: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
6a20: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6a30: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69  e_error;.  }.  i
6a40: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  f( db->init.iDb=
6a50: 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b  =1 ) isTemp = 1;
6a60: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6a70: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
6a80: 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  ON.  assert( (is
6a90: 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d  Temp & 1)==isTem
6aa0: 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74  p );.  {.    int
6ab0: 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20   code;.    char 
6ac0: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
6ad0: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db].zName;.    i
6ae0: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
6af0: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
6b00: 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
6b10: 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c  A_TABLE(isTemp),
6b20: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
6b30: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
6b40: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
6b50: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
6b60: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
6b70: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
6b80: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
6b90: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
6ba0: 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  TE_TEMP_VIEW;.  
6bb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6bc0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
6bd0: 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20  _CREATE_VIEW;.  
6be0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
6bf0: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
6c00: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6c10: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
6c20: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
6c30: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  E_TEMP_TABLE;.  
6c40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6c50: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
6c60: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20  _CREATE_TABLE;. 
6c70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6c80: 20 69 66 28 20 21 69 73 56 69 72 74 75 61 6c 20   if( !isVirtual 
6c90: 26 26 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  && sqlite3AuthCh
6ca0: 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
6cb0: 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  , zName, 0, zDb)
6cc0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
6cd0: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
6ce0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
6cf0: 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
6d00: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
6d10: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
6d20: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
6d30: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
6d40: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
6d50: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
6d60: 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e  abase.  Issue an
6d70: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
6d80: 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20  f.  ** it does. 
6d90: 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
6da0: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
6db0: 74 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 77  t being parsed w
6dc0: 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74  as passed.  ** t
6dd0: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63  o an sqlite3_dec
6de0: 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c  lare_vtab() call
6df0: 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f  . In that case o
6e00: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
6e10: 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79  ames.  ** and ty
6e20: 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  pes will be used
6e30: 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  , so there is no
6e40: 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f   need to test fo
6e50: 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a  r namespace.  **
6e60: 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a   collisions..  *
6e70: 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45 43 4c  /.  if( !IN_DECL
6e80: 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  ARE_VTAB ){.    
6e90: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
6ea0: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
6eb0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
6ec0: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
6ed0: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
6ee0: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
6ef0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
6f00: 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d    }.    pTable =
6f10: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
6f20: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  e(db, zName, zDb
6f30: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  );.    if( pTabl
6f40: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  e ){.      if( !
6f50: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20  noErr ){.       
6f60: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6f70: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
6f80: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
6f90: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
6fa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6fb0: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
6fc0: 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20  it.busy );.     
6fd0: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
6fe0: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
6ff0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d  e, iDb);.      }
7000: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
7010: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
7020: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
7030: 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
7040: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30  , zName, zDb)!=0
7050: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7060: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7070: 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65  , "there is alre
7080: 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d  ady an index nam
7090: 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
70a0: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
70b0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
70c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c    }.  }..  pTabl
70d0: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
70e0: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
70f0: 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66  of(Table));.  if
7100: 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ( pTable==0 ){. 
7110: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
7120: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  led = 1;.    pPa
7130: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
7140: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72  _NOMEM;.    pPar
7150: 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  se->nErr++;.    
7160: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
7170: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54  _error;.  }.  pT
7180: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e  able->zName = zN
7190: 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69  ame;.  pTable->i
71a0: 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61  PKey = -1;.  pTa
71b0: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64  ble->pSchema = d
71c0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
71d0: 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  ema;.  pTable->n
71e0: 52 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 6c  Ref = 1;.  pTabl
71f0: 65 2d 3e 6e 52 6f 77 45 73 74 20 3d 20 31 30 34  e->nRowEst = 104
7200: 38 35 37 36 3b 0a 20 20 61 73 73 65 72 74 28 20  8576;.  assert( 
7210: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
7220: 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65  e==0 );.  pParse
7230: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54  ->pNewTable = pT
7240: 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  able;..  /* If t
7250: 68 69 73 20 69 73 20 74 68 65 20 6d 61 67 69 63  his is the magic
7260: 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
7270: 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 20 61   table used by a
7280: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20  utoincrement,.  
7290: 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61  ** then record a
72a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
72b0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61   table in the ma
72c0: 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 75  in database stru
72d0: 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68  cture.  ** so th
72e0: 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69  at INSERT can fi
72f0: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65 61 73  nd the table eas
7300: 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ily..  */.#ifnde
7310: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
7320: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66  TOINCREMENT.  if
7330: 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  ( !pParse->neste
7340: 64 20 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d  d && strcmp(zNam
7350: 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65  e, "sqlite_seque
7360: 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nce")==0 ){.    
7370: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
7380: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
7390: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
73a0: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
73b0: 61 2d 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61  a->pSeqTab = pTa
73c0: 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ble;.  }.#endif.
73d0: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
73e0: 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20  rating the code 
73f0: 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74  that will insert
7400: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
7410: 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20  d into.  ** the 
7420: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
7430: 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ble.  Note in pa
7440: 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65  rticular that we
7450: 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20   must go ahead. 
7460: 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65   ** and allocate
7470: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
7480: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
7490: 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66   entry now.  Bef
74a0: 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49  ore any.  ** PRI
74b0: 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
74c0: 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  UE keywords are 
74d0: 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b  parsed.  Those k
74e0: 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75  eywords will cau
74f0: 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20  se.  ** indices 
7500: 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e  to be created an
7510: 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  d the table reco
7520: 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66  rd must come bef
7530: 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e  ore the .  ** in
7540: 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74  dices.  Hence, t
7550: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
7560: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d   for the table m
7570: 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
7580: 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  .  ** now..  */.
7590: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
75a0: 62 75 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c  busy && (v = sql
75b0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
75c0: 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  se))!=0 ){.    i
75d0: 6e 74 20 6a 31 3b 0a 20 20 20 20 69 6e 74 20 66  nt j1;.    int f
75e0: 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69  ileFormat;.    i
75f0: 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20 72  nt reg1, reg2, r
7600: 65 67 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eg3;.    sqlite3
7610: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
7620: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
7630: 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
7640: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
7650: 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 69  LTABLE.    if( i
7660: 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  sVirtual ){.    
7670: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7680: 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e  Op0(v, OP_VBegin
7690: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
76a0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
76b0: 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65  ile format and e
76c0: 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64  ncoding in the d
76d0: 61 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74  atabase have not
76e0: 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20   been set, .    
76f0: 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e  ** set them now.
7700: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 31  .    */.    reg1
7710: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
7720: 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
7730: 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d  nMem;.    reg2 =
7740: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
7750: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
7760: 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20 2b 2b  m;.    reg3 = ++
7770: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
7780: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7790: 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f  Op3(v, OP_ReadCo
77a0: 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67 33 2c  okie, iDb, reg3,
77b0: 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d   BTREE_FILE_FORM
77c0: 41 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  AT);.    sqlite3
77d0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
77e0: 20 69 44 62 29 3b 0a 20 20 20 20 6a 31 20 3d 20   iDb);.    j1 = 
77f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7800: 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33  1(v, OP_If, reg3
7810: 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d 61  );.    fileForma
7820: 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  t = (db->flags &
7830: 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69   SQLITE_LegacyFi
7840: 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20  leFmt)!=0 ?.    
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
7860: 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c  : SQLITE_MAX_FIL
7870: 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71  E_FORMAT;.    sq
7880: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7890: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66  v, OP_Integer, f
78a0: 69 6c 65 46 6f 72 6d 61 74 2c 20 72 65 67 33 29  ileFormat, reg3)
78b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
78c0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
78d0: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54  tCookie, iDb, BT
78e0: 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 2c  REE_FILE_FORMAT,
78f0: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
7900: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
7910: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 45 4e 43   OP_Integer, ENC
7920: 28 64 62 29 2c 20 72 65 67 33 29 3b 0a 20 20 20  (db), reg3);.   
7930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7940: 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b  p3(v, OP_SetCook
7950: 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 54  ie, iDb, BTREE_T
7960: 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 72 65  EXT_ENCODING, re
7970: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
7980: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
7990: 6a 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69  j1);..    /* Thi
79a0: 73 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61  s just creates a
79b0: 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65   place-holder re
79c0: 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69  cord in the sqli
79d0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
79e0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f  .    ** The reco
79f0: 72 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20  rd created does 
7a00: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74  not contain anyt
7a10: 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69  hing yet.  It wi
7a20: 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20  ll be replaced. 
7a30: 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61     ** by the rea
7a40: 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20  l entry in code 
7a50: 67 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c  generated at sql
7a60: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a  ite3EndTable()..
7a70: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
7a80: 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  e rowid for the 
7a90: 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66  new entry is lef
7aa0: 74 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  t in register pP
7ab0: 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a  arse->regRowid..
7ac0: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20      ** The root 
7ad0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
7ae0: 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20  he new table is 
7af0: 6c 65 66 74 20 69 6e 20 72 65 67 20 70 50 61 72  left in reg pPar
7b00: 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20  se->regRoot..   
7b10: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 61 6e   ** The rowid an
7b20: 64 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  d root page numb
7b30: 65 72 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65  er values are ne
7b40: 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65  eded by the code
7b50: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c   that.    ** sql
7b60: 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c  ite3EndTable wil
7b70: 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20  l generate..    
7b80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
7b90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
7ba0: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
7bb0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
7bc0: 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20  LTABLE).    if( 
7bd0: 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74  isView || isVirt
7be0: 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ual ){.      sql
7bf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
7c00: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
7c10: 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73   reg2);.    }els
7c20: 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20  e.#endif.    {. 
7c30: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
7c40: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
7c50: 64 64 72 28 76 29 20 3c 20 31 30 30 20 29 3b 0a  ddr(v) < 100 );.
7c60: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 64        pParse->ad
7c70: 64 72 43 72 54 61 62 20 3d 20 28 75 31 36 29 73  drCrTab = (u16)s
7c80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7c90: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
7ca0: 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a  le, iDb, reg2);.
7cb0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7cc0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
7cd0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
7ce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7cf0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
7d00: 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20  wid, 0, reg1);. 
7d10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7d20: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
7d30: 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73   0, reg3);.    s
7d40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7d50: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30  (v, OP_Insert, 0
7d60: 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20  , reg3, reg1);. 
7d70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
7d80: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
7d90: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71  _APPEND);.    sq
7da0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
7db0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20  v, OP_Close);.  
7dc0: 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28  }..  /* Normal (
7dd0: 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72  non-error) retur
7de0: 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a  n. */.  return;.
7df0: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
7e00: 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d  r occurs, we jum
7e10: 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f  p here */.begin_
7e20: 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73  table_error:.  s
7e30: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7e40: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
7e50: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  n;.}../*.** This
7e60: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74   macro is used t
7e70: 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74  o compare two st
7e80: 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d  rings in a case-
7e90: 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e  insensitive mann
7ea0: 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69  er..** It is sli
7eb0: 67 68 74 6c 79 20 66 61 73 74 65 72 20 74 68 61  ghtly faster tha
7ec0: 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  n calling sqlite
7ed0: 33 53 74 72 49 43 6d 70 28 29 20 64 69 72 65 63  3StrICmp() direc
7ee0: 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64  tly, but.** prod
7ef0: 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65  uces larger code
7f00: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
7f10: 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e   This macro is n
7f20: 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  ot compatible wi
7f30: 74 68 20 74 68 65 20 73 74 72 63 6d 70 28 29 20  th the strcmp() 
7f40: 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65  family. It.** re
7f50: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68  turns true if th
7f60: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72  e two strings ar
7f70: 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69  e equal, otherwi
7f80: 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65  se false..*/.#de
7f90: 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20  fine STRICMP(x, 
7fa0: 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70  y) (\.sqlite3Upp
7fb0: 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69  erToLower[*(unsi
7fc0: 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d  gned char *)(x)]
7fd0: 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70  ==   \.sqlite3Up
7fe0: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73  perToLower[*(uns
7ff0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29  igned char *)(y)
8000: 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74  ]     \.&& sqlit
8010: 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c  e3StrICmp((x)+1,
8020: 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a  (y)+1)==0 )../*.
8030: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c  ** Add a new col
8040: 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65  umn to the table
8050: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
8060: 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a   constructed..**
8070: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
8080: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
8090: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
80a0: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
80b0: 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  on.** in a CREAT
80c0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
80d0: 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  t.  sqlite3Start
80e0: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
80f0: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
8100: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
8110: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
8120: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
8130: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
8140: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8150: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  e3AddColumn(Pars
8160: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
8170: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
8180: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
8190: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75   char *z;.  Colu
81a0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  mn *pCol;.  sqli
81b0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
81c0: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d  ->db;.  if( (p =
81d0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
81e0: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
81f0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
8200: 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e  COLUMN.  if( p->
8210: 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69  nCol+1>db->aLimi
8220: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
8230: 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
8240: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8250: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
8260: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20  columns on %s", 
8270: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  p->zName);.    r
8280: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
8290: 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  f.  z = sqlite3N
82a0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
82b0: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
82c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
82d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
82e0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
82f0: 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e  ( STRICMP(z, p->
8300: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29  aCol[i].zName) )
8310: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
8320: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8330: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
8340: 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b  n name: %s", z);
8350: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
8360: 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
8370: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8380: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
8390: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
83a0: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
83b0: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
83c0: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
83d0: 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43  b,p->aCol,(p->nC
83e0: 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  ol+8)*sizeof(p->
83f0: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aCol[0]));.    i
8400: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
8410: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8420: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
8430: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
8440: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77    p->aCol = aNew
8450: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26  ;.  }.  pCol = &
8460: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
8470: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c  ;.  memset(pCol,
8480: 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43   0, sizeof(p->aC
8490: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d  ol[0]));.  pCol-
84a0: 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20  >zName = z;. .  
84b0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
84c0: 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  o type specified
84d0: 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74  , columns have t
84e0: 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e  he default affin
84f0: 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e  ity.  ** 'NONE'.
8500: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
8510: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 74  ype specified, t
8520: 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f  hen sqlite3AddCo
8530: 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a  lumnType() will.
8540: 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e    ** be called n
8550: 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d  ext to set pCol-
8560: 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63  >affinity correc
8570: 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  tly..  */.  pCol
8580: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
8590: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
85a0: 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 31 3b  pCol->szEst = 1;
85b0: 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a  .  p->nCol++;.}.
85c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
85d0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
85e0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
85f0: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
8600: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
8610: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
8620: 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20  tement.  A "NOT 
8630: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
8640: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65   has.** been see
8650: 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n on a column.  
8660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
8670: 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c  s the notNull fl
8680: 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c  ag on.** the col
8690: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
86a0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
86b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
86c0: 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73  3AddNotNull(Pars
86d0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
86e0: 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65  nError){.  Table
86f0: 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61 72 73   *p;.  p = pPars
8700: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
8710: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45  if( p==0 || NEVE
8720: 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72  R(p->nCol<1) ) r
8730: 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  eturn;.  p->aCol
8740: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e  [p->nCol-1].notN
8750: 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ull = (u8)onErro
8760: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e  r;.}../*.** Scan
8770: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
8780: 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e   name zType (len
8790: 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72  gth nType) and r
87a0: 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73  eturn the.** ass
87b0: 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74 79  ociated affinity
87c0: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   type..**.** Thi
87d0: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61  s routine does a
87e0: 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e   case-independen
87f0: 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70  t search of zTyp
8800: 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75  e for the .** su
8810: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
8820: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e  following table.
8830: 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   If one of the s
8840: 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20  ubstrings is.** 
8850: 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65  found, the corre
8860: 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74  sponding affinit
8870: 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  y is returned. I
8880: 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73  f zType contains
8890: 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  .** more than on
88a0: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
88b0: 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77  ngs, entries tow
88c0: 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a  ard the top of .
88d0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b  ** the table tak
88e0: 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20  e priority. For 
88f0: 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70  example, if zTyp
8900: 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20  e is 'BLOBINT', 
8910: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  .** SQLITE_AFF_I
8920: 4e 54 45 47 45 52 20 69 73 20 72 65 74 75 72 6e  NTEGER is return
8930: 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72  ed..**.** Substr
8940: 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69  ing     | Affini
8950: 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ty.** ----------
8960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8970: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20  ------.** 'INT' 
8980: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8990: 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20  _AFF_INTEGER.** 
89a0: 27 43 48 41 52 27 20 20 20 20 20 20 20 20 7c 20  'CHAR'        | 
89b0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
89c0: 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20  ** 'CLOB'       
89d0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
89e0: 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20  XT.** 'TEXT'    
89f0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8a00: 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20  _TEXT.** 'BLOB' 
8a10: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8a20: 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41  AFF_NONE.** 'REA
8a30: 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  L'        | SQLI
8a40: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27  TE_AFF_REAL.** '
8a50: 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53  FLOA'        | S
8a60: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
8a70: 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20 20 20  * 'DOUB'        
8a80: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
8a90: 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20  L.**.** If none 
8aa0: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
8ab0: 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74  s in the above t
8ac0: 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a  able are found,.
8ad0: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ** SQLITE_AFF_NU
8ae0: 4d 45 52 49 43 20 69 73 20 72 65 74 75 72 6e 65  MERIC is returne
8af0: 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74  d..*/.char sqlit
8b00: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63  e3AffinityType(c
8b10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20  onst char *zIn, 
8b20: 75 38 20 2a 70 73 7a 45 73 74 29 7b 0a 20 20 75  u8 *pszEst){.  u
8b30: 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72  32 h = 0;.  char
8b40: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8b50: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e  F_NUMERIC;.  con
8b60: 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72 20 3d  st char *zChar =
8b70: 20 30 3b 0a 0a 20 20 69 66 28 20 7a 49 6e 3d 3d   0;..  if( zIn==
8b80: 30 20 29 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  0 ) return aff;.
8b90: 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20    while( zIn[0] 
8ba0: 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38  ){.    h = (h<<8
8bb0: 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72  ) + sqlite3Upper
8bc0: 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26 30  ToLower[(*zIn)&0
8bd0: 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b  xff];.    zIn++;
8be0: 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63  .    if( h==(('c
8bf0: 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29  '<<24)+('h'<<16)
8c00: 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29  +('a'<<8)+'r') )
8c10: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {             /*
8c20: 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61   CHAR */.      a
8c30: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8c40: 54 45 58 54 3b 0a 20 20 20 20 20 20 7a 43 68 61  TEXT;.      zCha
8c50: 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c  r = zIn;.    }el
8c60: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c  se if( h==(('c'<
8c70: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
8c80: 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20  'o'<<8)+'b') ){ 
8c90: 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f        /* CLOB */
8ca0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
8cb0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
8cc0: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
8cd0: 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c  ('t'<<24)+('e'<<
8ce0: 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27  16)+('x'<<8)+'t'
8cf0: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45  ) ){       /* TE
8d00: 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  XT */.      aff 
8d10: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
8d20: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
8d30: 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28   h==(('b'<<24)+(
8d40: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
8d50: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
8d60: 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20  /* BLOB */.     
8d70: 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49     && (aff==SQLI
8d80: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c  TE_AFF_NUMERIC |
8d90: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
8da0: 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20  F_REAL) ){.     
8db0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8dc0: 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 69 66  F_NONE;.      if
8dd0: 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20 29 20  ( zIn[0]=='(' ) 
8de0: 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23 69 66  zChar = zIn;.#if
8df0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8e00: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
8e10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
8e20: 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27  =(('r'<<24)+('e'
8e30: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
8e40: 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l')          /* 
8e50: 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20  REAL */.        
8e60: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
8e70: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
8e80: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
8e90: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
8ea0: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66  else if( h==(('f
8eb0: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
8ec0: 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20  +('o'<<8)+'a')  
8ed0: 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20          /* FLOA 
8ee0: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
8ef0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
8f00: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
8f10: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8f20: 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  REAL;.    }else 
8f30: 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34  if( h==(('d'<<24
8f40: 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27  )+('o'<<16)+('u'
8f50: 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20  <<8)+'b')       
8f60: 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20     /* DOUB */.  
8f70: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
8f80: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
8f90: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
8fa0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
8fb0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
8fc0: 65 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46  e if( (h&0x00FFF
8fd0: 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29  FFF)==(('i'<<16)
8fe0: 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29  +('n'<<8)+'t') )
8ff0: 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20  {    /* INT */. 
9000: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9010: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
9020: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9030: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  }.  }..  /* If p
9040: 73 7a 45 73 74 20 69 73 20 6e 6f 74 20 4e 55 4c  szEst is not NUL
9050: 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73 74 69  L, store an esti
9060: 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69 65 6c  mate of the fiel
9070: 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20 20 2a  d size.  The.  *
9080: 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20 73 63  * estimate is sc
9090: 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  aled so that the
90a0: 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74 65   size of an inte
90b0: 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20  ger is 1.  */.  
90c0: 69 66 28 20 70 73 7a 45 73 74 20 29 7b 0a 20 20  if( pszEst ){.  
90d0: 20 20 2a 70 73 7a 45 73 74 20 3d 20 31 3b 20 20    *pszEst = 1;  
90e0: 20 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65   /* default size
90f0: 20 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74   is approx 4 byt
9100: 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66  es */.    if( af
9110: 66 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  f<=SQLITE_AFF_NO
9120: 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  NE ){.      if( 
9130: 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20 20  zChar ){.       
9140: 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d   while( zChar[0]
9150: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
9160: 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  ( sqlite3Isdigit
9170: 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20  (zChar[0]) ){.  
9180: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 20            int v 
9190: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
91a0: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
91b0: 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a 20 20 20  (zChar, &v);.   
91c0: 20 20 20 20 20 20 20 20 20 76 20 3d 20 76 2f 34           v = v/4
91d0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   + 1;.          
91e0: 20 20 69 66 28 20 76 3e 32 35 35 20 29 20 76 20    if( v>255 ) v 
91f0: 3d 20 32 35 35 3b 0a 20 20 20 20 20 20 20 20 20  = 255;.         
9200: 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 76 3b 20     *pszEst = v; 
9210: 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43  /* BLOB(k), VARC
9220: 48 41 52 28 6b 29 2c 20 43 48 41 52 28 6b 29 20  HAR(k), CHAR(k) 
9230: 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a  -> r=(k/4+1) */.
9240: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9250: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
9260: 20 20 20 20 20 20 20 20 20 7a 43 68 61 72 2b 2b           zChar++
9270: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9290: 20 2a 70 73 7a 45 73 74 20 3d 20 35 3b 20 20 20   *pszEst = 5;   
92a0: 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43  /* BLOB, TEXT, C
92b0: 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70  LOB -> r=5  (app
92c0: 72 6f 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a  rox 20 bytes)*/.
92d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
92e0: 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  }.  return aff;.
92f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
9300: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
9310: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
9320: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
9330: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
9340: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
9350: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70  tatement.  The p
9360: 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74  First token is t
9370: 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65  he first.** toke
9380: 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  n in the sequenc
9390: 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74  e of tokens that
93a0: 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 79   describe the ty
93b0: 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c  pe of the.** col
93c0: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
93d0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
93e0: 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74 68 65  .   pLast is the
93f0: 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69   last token.** i
9400: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20  n the sequence. 
9410: 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d   Use this inform
9420: 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75  ation to constru
9430: 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74  ct a string.** t
9440: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
9450: 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65   typename of the
9460: 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72   column and stor
9470: 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a  e that string.**
9480: 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76   in zType..*/ .v
9490: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
94a0: 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a  lumnType(Parse *
94b0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
94c0: 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Type){.  Table *
94d0: 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  p;.  Column *pCo
94e0: 6c 3b 0a 0a 20 20 70 20 3d 20 70 50 61 72 73 65  l;..  p = pParse
94f0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
9500: 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52  f( p==0 || NEVER
9510: 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65  (p->nCol<1) ) re
9520: 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26  turn;.  pCol = &
9530: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
9540: 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
9550: 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 3b 0a  ol->zType==0 );.
9560: 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20    pCol->zType = 
9570: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
9580: 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
9590: 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d   pType);.  pCol-
95a0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
95b0: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
95c0: 70 43 6f 6c 2d 3e 7a 54 79 70 65 2c 20 26 70 43  pCol->zType, &pC
95d0: 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 7d 0a 0a 2f  ol->szEst);.}../
95e0: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
95f0: 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ion is the defau
9600: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
9610: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
9620: 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  dded column.** o
9630: 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  f the table curr
9640: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
9650: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
9660: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78  Default value ex
9670: 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62  pressions must b
9680: 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69  e constant.  Rai
9690: 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  se an exception 
96a0: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f  if this.** is no
96b0: 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a  t the case..**.*
96c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
96d0: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
96e0: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
96f0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
9700: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
9710: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
9720: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
9730: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
9740: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
9750: 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e   ExprSpan *pSpan
9760: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
9770: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
9780: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9790: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d  Parse->db;.  p =
97a0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
97b0: 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29  le;.  if( p!=0 )
97c0: 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70  {.    pCol = &(p
97d0: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
97e0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c  ]);.    if( !sql
97f0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
9800: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53 70  ntOrFunction(pSp
9810: 61 6e 2d 3e 70 45 78 70 72 29 20 29 7b 0a 20 20  an->pExpr) ){.  
9820: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9830: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66  Msg(pParse, "def
9840: 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f  ault value of co
9850: 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74  lumn [%s] is not
9860: 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20   constant",.    
9870: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
9880: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
9890: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
98a0: 66 20 70 45 78 70 72 20 69 73 20 75 73 65 64 20  f pExpr is used 
98b0: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f  instead of the o
98c0: 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70  riginal, as pExp
98d0: 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  r contains.     
98e0: 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20   ** tokens that 
98f0: 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c  point to volatil
9900: 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27 73  e memory. The 's
9910: 70 61 6e 27 20 6f 66 20 74 68 65 20 65 78 70 72  pan' of the expr
9920: 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ession.      ** 
9930: 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 70  is required by p
9940: 72 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f  ragma table_info
9950: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
9960: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
9970: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
9980: 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  lt);.      pCol-
9990: 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >pDflt = sqlite3
99a0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 70 61  ExprDup(db, pSpa
99b0: 6e 2d 3e 70 45 78 70 72 2c 20 45 58 50 52 44 55  n->pExpr, EXPRDU
99c0: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20  P_REDUCE);.     
99d0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
99e0: 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b  b, pCol->zDflt);
99f0: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 44 66  .      pCol->zDf
9a00: 6c 74 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  lt = sqlite3DbSt
9a10: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
9a20: 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a  )pSpan->zStart,.
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a50: 20 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e       (int)(pSpan
9a60: 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e  ->zEnd - pSpan->
9a70: 7a 53 74 61 72 74 29 29 3b 0a 20 20 20 20 7d 0a  zStart));.    }.
9a80: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
9a90: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 53 70 61  rDelete(db, pSpa
9aa0: 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  n->pExpr);.}../*
9ab0: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
9ac0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
9ad0: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
9ae0: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
9af0: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
9b00: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
9b10: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
9b20: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
9b30: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
9b40: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
9b50: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
9b60: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
9b70: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
9b80: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
9b90: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
9ba0: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
9bb0: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
9bc0: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
9bd0: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
9be0: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
9bf0: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
9c00: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
9c10: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
9c20: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
9c30: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
9c40: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
9c50: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
9c60: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
9c70: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
9c80: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
9c90: 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62  id.  Set the Tab
9ca0: 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c  le.iPKey.** fiel
9cb0: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75  d of the table u
9cc0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
9cd0: 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65  n to be the inde
9ce0: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45  x of the.** INTE
9cf0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
9d00: 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69  column.  Table.i
9d10: 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d  PKey is set to -
9d20: 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  1 if there is.**
9d30: 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d   no INTEGER PRIM
9d40: 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49  ARY KEY..**.** I
9d50: 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74  f the key is not
9d60: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
9d70: 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72  ARY KEY, then cr
9d80: 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a  eate a unique.**
9d90: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b   index for the k
9da0: 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73  ey.  No index is
9db0: 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54   created for INT
9dc0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
9dd0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
9de0: 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
9df0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9e00: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
9e10: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
9e20: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f  rList *pList,  /
9e30: 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20  * List of field 
9e40: 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65  names to be inde
9e50: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
9e60: 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68  rror,      /* Wh
9e70: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20  at to do with a 
9e80: 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c  uniqueness confl
9e90: 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74  ict */.  int aut
9ea0: 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72  oInc,      /* Tr
9eb0: 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e  ue if the AUTOIN
9ec0: 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20  CREMENT keyword 
9ed0: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
9ee0: 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20  int sortOrder   
9ef0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41    /* SQLITE_SO_A
9f00: 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f  SC or SQLITE_SO_
9f10: 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  DESC */.){.  Tab
9f20: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
9f30: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
9f40: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b  char *zType = 0;
9f50: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31  .  int iCol = -1
9f60: 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d  , i;.  int nTerm
9f70: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
9f80: 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
9f90: 41 42 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72  AB ) goto primar
9fa0: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66  y_key_exit;.  if
9fb0: 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73  ( pTab->tabFlags
9fc0: 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79   & TF_HasPrimary
9fd0: 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
9fe0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9ff0: 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65  e, .      "table
a000: 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65   \"%s\" has more
a010: 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72   than one primar
a020: 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e  y key", pTab->zN
a030: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70  ame);.    goto p
a040: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
a050: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62  .  }.  pTab->tab
a060: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50  Flags |= TF_HasP
a070: 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28  rimaryKey;.  if(
a080: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
a090: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   iCol = pTab->nC
a0a0: 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62  ol - 1;.    pTab
a0b0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c  ->aCol[iCol].col
a0c0: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
a0d0: 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 7a 54  _PRIMKEY;.    zT
a0e0: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
a0f0: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
a100: 20 20 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d    nTerm = 1;.  }
a110: 65 6c 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20  else{.    nTerm 
a120: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
a130: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
a140: 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
a150: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
a160: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
a170: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
a180: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
a190: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
a1a0: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
a1b0: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  [iCol].zName)==0
a1c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
a1d0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63  ab->aCol[iCol].c
a1e0: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
a1f0: 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20  AG_PRIMKEY;.    
a200: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
a210: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
a220: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
a230: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
a240: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a250: 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d   }.  if( nTerm==
a260: 31 0a 20 20 20 26 26 20 7a 54 79 70 65 20 26 26  1.   && zType &&
a270: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a280: 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22  zType, "INTEGER"
a290: 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72 74 4f  )==0.   && sortO
a2a0: 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  rder==SQLITE_SO_
a2b0: 41 53 43 0a 20 20 29 7b 0a 20 20 20 20 70 54 61  ASC.  ){.    pTa
a2c0: 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b  b->iPKey = iCol;
a2d0: 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f  .    pTab->keyCo
a2e0: 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  nf = (u8)onError
a2f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 75  ;.    assert( au
a300: 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f  toInc==0 || auto
a310: 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54  Inc==1 );.    pT
a320: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
a330: 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69  autoInc*TF_Autoi
a340: 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66  ncrement;.    if
a350: 28 20 70 4c 69 73 74 20 29 20 70 50 61 72 73 65  ( pList ) pParse
a360: 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d  ->iPkSortOrder =
a370: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72   pList->a[0].sor
a380: 74 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65 20  tOrder;.  }else 
a390: 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23  if( autoInc ){.#
a3a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a3b0: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
a3c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
a3d0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55  rMsg(pParse, "AU
a3e0: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f  TOINCREMENT is o
a3f0: 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61  nly allowed on a
a400: 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45  n ".       "INTE
a410: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
a420: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
a430: 65 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  e{.    Index *p;
a440: 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
a450: 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72  CreateIndex(pPar
a460: 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69  se, 0, 0, 0, pLi
a470: 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a  st, onError, 0,.
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a490: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 6f             0, so
a4a0: 72 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20 20  rtOrder, 0);.   
a4b0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
a4c0: 70 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 32  p->autoIndex = 2
a4d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73  ;.    }.    pLis
a4e0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d  t = 0;.  }..prim
a4f0: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20  ary_key_exit:.  
a500: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
a510: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
a520: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75  , pList);.  retu
a530: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rn;.}../*.** Add
a540: 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e   a new CHECK con
a550: 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74  straint to the t
a560: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
a570: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
a580: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
a590: 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72  e3AddCheckConstr
a5a0: 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
a5b0: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
a5c0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
a5d0: 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78    Expr *pCheckEx
a5e0: 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b  pr  /* The check
a5f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29   expression */.)
a600: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
a610: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61  _OMIT_CHECK.  Ta
a620: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
a630: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
a640: 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49 4e   if( pTab && !IN
a650: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b  _DECLARE_VTAB ){
a660: 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63  .    pTab->pChec
a670: 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  k = sqlite3ExprL
a680: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
a690: 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20  , pTab->pCheck, 
a6a0: 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20  pCheckExpr);.   
a6b0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e   if( pParse->con
a6c0: 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b  straintName.n ){
a6d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
a6e0: 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
a6f0: 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65  arse, pTab->pChe
a700: 63 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e  ck, &pParse->con
a710: 73 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b  straintName, 1);
a720: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
a730: 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71  endif.  {.    sq
a740: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
a750: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65  pParse->db, pChe
a760: 63 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  ckExpr);.  }.}..
a770: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
a780: 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  llation function
a790: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
a7a0: 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62  ently parsed tab
a7b0: 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20  le column.** to 
a7c0: 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65  the CollSeq give
a7d0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
a7e0: 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65  e3AddCollateType
a7f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
a800: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
a810: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
a820: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  t i;.  char *zCo
a830: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
a840: 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d   /* Dequoted nam
a850: 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  e of collation s
a860: 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c  equence */.  sql
a870: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
a880: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
a890: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
a8a0: 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e  turn;.  i = p->n
a8b0: 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50  Col-1;.  db = pP
a8c0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c  arse->db;.  zCol
a8d0: 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  l = sqlite3NameF
a8e0: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f  romToken(db, pTo
a8f0: 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f  ken);.  if( !zCo
a900: 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  ll ) return;..  
a910: 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  if( sqlite3Locat
a920: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
a930: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49   zColl) ){.    I
a940: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
a950: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
a960: 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  , p->aCol[i].zCo
a970: 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c  ll);.    p->aCol
a980: 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c  [i].zColl = zCol
a990: 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  l;.  .    /* If 
a9a0: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65  the column is de
a9b0: 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65  clared as "<name
a9c0: 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f  > PRIMARY KEY CO
a9d0: 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20  LLATE <type>",. 
a9e0: 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e     ** then an in
a9f0: 64 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65  dex may have bee
aa00: 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69  n created on thi
aa10: 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20  s column before 
aa20: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61  the.    ** colla
aa30: 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64  tion type was ad
aa40: 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69  ded. Correct thi
aa50: 73 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63  s if it is the c
aa60: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
aa70: 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64  for(pIdx=p->pInd
aa80: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
aa90: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
aaa0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
aab0: 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20  >nKeyCol==1 );. 
aac0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
aad0: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b  iColumn[0]==i ){
aae0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
aaf0: 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43  zColl[0] = p->aC
ab00: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[i].zColl;.   
ab10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
ab20: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  se{.    sqlite3D
ab30: 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
ab40: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
ab50: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
ab60: 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  urns the collati
ab70: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20  on sequence for 
ab80: 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20  database native 
ab90: 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67  text.** encoding
aba0: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
abb0: 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c  he string zName,
abc0: 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a   length nName..*
abd0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75  *.** If the requ
abe0: 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ested collation 
abf0: 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20  sequence is not 
ac00: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f  available, or no
ac10: 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69  t available.** i
ac20: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  n the database n
ac30: 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20  ative encoding, 
ac40: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61  the collation fa
ac50: 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64  ctory is invoked
ac60: 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69   to.** request i
ac70: 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74  t. If the collat
ac80: 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73  ion factory does
ac90: 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68   not supply such
aca0: 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20   a sequence,.** 
acb0: 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65  and the sequence
acc0: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e   is available in
acd0: 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e   another text en
ace0: 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61  coding, then tha
acf0: 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  t is.** returned
ad00: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
ad10: 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f  If no versions o
ad20: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
ad30: 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65  collations seque
ad40: 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c  nce are availabl
ad50: 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72  e, or.** another
ad60: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e   error occurs, N
ad70: 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20  ULL is returned 
ad80: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  and an error mes
ad90: 73 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74  sage written int
ada0: 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a  o.** pParse..**.
adb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
adc0: 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f  is a wrapper aro
add0: 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43  und sqlite3FindC
ade0: 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20  ollSeq().  This 
adf0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b  routine.** invok
ae00: 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  es the collation
ae10: 20 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20   factory if the 
ae20: 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  named collation 
ae30: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a  cannot be found.
ae40: 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73  ** and generates
ae50: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
ae60: 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
ae70: 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  o: sqlite3FindCo
ae80: 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33  llSeq(), sqlite3
ae90: 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a  GetCollSeq().*/.
aea0: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
aeb0: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61  LocateCollSeq(Pa
aec0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
aed0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
aee0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
aef0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75   pParse->db;.  u
af00: 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
af10: 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d  .  u8 initbusy =
af20: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a   db->init.busy;.
af30: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
af40: 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  ;..  pColl = sql
af50: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
af60: 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20  db, enc, zName, 
af70: 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28  initbusy);.  if(
af80: 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21   !initbusy && (!
af90: 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d  pColl || !pColl-
afa0: 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43  >xCmp) ){.    pC
afb0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74  oll = sqlite3Get
afc0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
afd0: 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d  enc, pColl, zNam
afe0: 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  e);.  }..  retur
aff0: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pColl;.}.../*.
b000: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
b010: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65   that will incre
b020: 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
b030: 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cookie..**.** Th
b040: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
b050: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
b060: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
b070: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
b080: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
b090: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
b0a0: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
b0b0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
b0c0: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
b0d0: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
b0e0: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
b0f0: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
b100: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
b110: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
b120: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
b130: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
b140: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
b150: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
b160: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
b170: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
b180: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
b190: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
b1a0: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
b1b0: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
b1c0: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
b1d0: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
b1e0: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
b1f0: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
b200: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
b210: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
b220: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
b230: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
b240: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
b250: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
b260: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
b270: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
b280: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
b290: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
b2a0: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
b2b0: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
b2c0: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
b2d0: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
b2e0: 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50  Cookie(Parse *pP
b2f0: 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
b300: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
b310: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
b320: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  rse);.  sqlite3 
b330: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
b340: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
b350: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61  arse->pVdbe;.  a
b360: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
b370: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
b380: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 73  , iDb, 0) );.  s
b390: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
b3a0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
b3b0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
b3c0: 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
b3d0: 6b 69 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71  kie+1, r1);.  sq
b3e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
b3f0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
b400: 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43 48 45   iDb, BTREE_SCHE
b410: 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 72 31 29 3b  MA_VERSION, r1);
b420: 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73  .  sqlite3Releas
b430: 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
b440: 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   r1);.}../*.** M
b450: 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62 65  easure the numbe
b460: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
b470: 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75 74  needed to output
b480: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64   the given.** id
b490: 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20 6e  entifier.  The n
b4a0: 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69  umber returned i
b4b0: 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f 74  ncludes any quot
b4c0: 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20 64  es used.** but d
b4d0: 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20  oes not include 
b4e0: 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61  the null termina
b4f0: 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  tor..**.** The e
b500: 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73 65  stimate is conse
b510: 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69 67  rvative.  It mig
b520: 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ht be larger tha
b530: 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65 61  t what is.** rea
b540: 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73  lly needed..*/.s
b550: 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74 4c  tatic int identL
b560: 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72  ength(const char
b570: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *z){.  int n;. 
b580: 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b   for(n=0; *z; n+
b590: 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  +, z++){.    if(
b5a0: 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b   *z=='"' ){ n++;
b5b0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
b5c0: 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n + 2;.}../*.** 
b5d0: 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  The first parame
b5e0: 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
b5f0: 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 62 75   to an output bu
b600: 66 66 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64  ffer. The second
b610: 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69   .** parameter i
b620: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
b630: 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 63  n integer that c
b640: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f 66 66 73  ontains the offs
b650: 65 74 20 61 74 0a 2a 2a 20 77 68 69 63 68 20 74  et at.** which t
b660: 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65  o write into the
b670: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 20   output buffer. 
b680: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
b690: 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d  pies the.** nul-
b6a0: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
b6b0: 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  g pointed to by 
b6c0: 74 68 65 20 74 68 69 72 64 20 70 61 72 61 6d 65  the third parame
b6d0: 74 65 72 2c 20 7a 53 69 67 6e 65 64 49 64 65 6e  ter, zSignedIden
b6e0: 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70 65  t,.** to the spe
b6f0: 63 69 66 69 65 64 20 6f 66 66 73 65 74 20 69 6e  cified offset in
b700: 20 74 68 65 20 62 75 66 66 65 72 20 61 6e 64 20   the buffer and 
b710: 75 70 64 61 74 65 73 20 2a 70 49 64 78 20 74 6f  updates *pIdx to
b720: 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68 65   refer.** to the
b730: 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65   first byte afte
b740: 72 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  r the last byte 
b750: 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 72  written before r
b760: 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a  eturning..** .**
b770: 20 49 66 20 74 68 65 20 73 74 72 69 6e 67 20 7a   If the string z
b780: 53 69 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e 73  SignedIdent cons
b790: 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66  ists entirely of
b7a0: 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a 2a   alpha-numeric.*
b7b0: 2a 20 63 68 61 72 61 63 74 65 72 73 2c 20 64 6f  * characters, do
b7c0: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
b7d0: 68 20 61 20 64 69 67 69 74 20 61 6e 64 20 69 73  h a digit and is
b7e0: 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79 77   not an SQL keyw
b7f0: 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20  ord,.** then it 
b800: 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65  is copied to the
b810: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 65   output buffer e
b820: 78 61 63 74 6c 79 20 61 73 20 69 74 20 69 73 2e  xactly as it is.
b830: 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 69   Otherwise,.** i
b840: 74 20 69 73 20 71 75 6f 74 65 64 20 75 73 69 6e  t is quoted usin
b850: 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2e  g double-quotes.
b860: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b870: 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a  identPut(char *z
b880: 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61  , int *pIdx, cha
b890: 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29  r *zSignedIdent)
b8a0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
b8b0: 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73  r *zIdent = (uns
b8c0: 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67  igned char*)zSig
b8d0: 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20  nedIdent;.  int 
b8e0: 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b  i, j, needQuote;
b8f0: 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a 20  .  i = *pIdx;.. 
b900: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
b910: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69  [j]; j++){.    i
b920: 66 28 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e  f( !sqlite3Isaln
b930: 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26  um(zIdent[j]) &&
b940: 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20   zIdent[j]!='_' 
b950: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e  ) break;.  }.  n
b960: 65 65 64 51 75 6f 74 65 20 3d 20 73 71 6c 69 74  eedQuote = sqlit
b970: 65 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74  e3Isdigit(zIdent
b980: 5b 30 5d 29 20 7c 7c 20 73 71 6c 69 74 65 33 4b  [0]) || sqlite3K
b990: 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e  eywordCode(zIden
b9a0: 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20 20  t, j)!=TK_ID;.  
b9b0: 69 66 28 20 21 6e 65 65 64 51 75 6f 74 65 20 29  if( !needQuote )
b9c0: 7b 0a 20 20 20 20 6e 65 65 64 51 75 6f 74 65 20  {.    needQuote 
b9d0: 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 7d  = zIdent[j];.  }
b9e0: 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ..  if( needQuot
b9f0: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
ba00: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
ba10: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
ba20: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
ba30: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
ba40: 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a  dent[j]=='"' ) z
ba50: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d  [i++] = '"';.  }
ba60: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
ba70: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
ba80: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
ba90: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
baa0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
bab0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
bac0: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
bad0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
bae0: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
baf0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
bb00: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
bb10: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
bb20: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
bb30: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
bb40: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
bb50: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
bb60: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
bb70: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
bb80: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
bb90: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
bba0: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
bbb0: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
bbc0: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
bbd0: 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  nd;.  Column *pC
bbe0: 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66  ol;.  n = 0;.  f
bbf0: 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f  or(pCol = p->aCo
bc00: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
bc10: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
bc20: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c  .    n += identL
bc30: 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  ength(pCol->zNam
bc40: 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20  e) + 5;.  }.  n 
bc50: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70  += identLength(p
bc60: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
bc70: 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65  n<50 ){ .    zSe
bc80: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70  p = "";.    zSep
bc90: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e  2 = ",";.    zEn
bca0: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65  d = ")";.  }else
bcb0: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e  {.    zSep = "\n
bcc0: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d    ";.    zSep2 =
bcd0: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45   ",\n  ";.    zE
bce0: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a  nd = "\n)";.  }.
bcf0: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d    n += 35 + 6*p-
bd00: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d  >nCol;.  zStmt =
bd10: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
bd20: 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28  Raw(0, n);.  if(
bd30: 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20   zStmt==0 ){.   
bd40: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
bd50: 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  d = 1;.    retur
bd60: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
bd70: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a  e3_snprintf(n, z
bd80: 53 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41  Stmt, "CREATE TA
bd90: 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71  BLE ");.  k = sq
bda0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53  lite3Strlen30(zS
bdb0: 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74  tmt);.  identPut
bdc0: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a  (zStmt, &k, p->z
bdd0: 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b  Name);.  zStmt[k
bde0: 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72  ++] = '(';.  for
bdf0: 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69  (pCol=p->aCol, i
be00: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
be10: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
be20: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
be30: 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70  ar * const azTyp
be40: 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
be50: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  /* SQLITE_AFF_TE
be60: 58 54 20 20 20 20 2a 2f 20 22 20 54 45 58 54 22  XT    */ " TEXT"
be70: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
be80: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20  ITE_AFF_NONE    
be90: 2a 2f 20 22 22 2c 0a 20 20 20 20 20 20 20 20 2f  */ "",.        /
bea0: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  * SQLITE_AFF_NUM
beb0: 45 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a  ERIC */ " NUM",.
bec0: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
bed0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f  E_AFF_INTEGER */
bee0: 20 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20   " INT",.       
bef0: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52   /* SQLITE_AFF_R
bf00: 45 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c  EAL    */ " REAL
bf10: 22 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74  ".    };.    int
bf20: 20 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20   len;.    const 
bf30: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20  char *zType;..  
bf40: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
bf50: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
bf60: 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20  ], zSep);.    k 
bf70: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
bf80: 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20  30(&zStmt[k]);. 
bf90: 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b     zSep = zSep2;
bfa0: 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53  .    identPut(zS
bfb0: 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a  tmt, &k, pCol->z
bfc0: 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Name);.    asser
bfd0: 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  t( pCol->affinit
bfe0: 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  y-SQLITE_AFF_TEX
bff0: 54 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73  T >= 0 );.    as
c000: 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69  sert( pCol->affi
c010: 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f  nity-SQLITE_AFF_
c020: 54 45 58 54 20 3c 20 41 72 72 61 79 53 69 7a 65  TEXT < ArraySize
c030: 28 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20  (azType) );.    
c040: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
c050: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
c060: 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20  _AFF_TEXT );.   
c070: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
c080: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
c090: 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 3b 0a 20 20  E_AFF_NONE );.  
c0a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
c0b0: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
c0c0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
c0d0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
c0e0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
c0f0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
c100: 45 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ER );.    testca
c110: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
c120: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ty==SQLITE_AFF_R
c130: 45 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20  EAL );.    .    
c140: 7a 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70  zType = azType[p
c150: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20  Col->affinity - 
c160: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 5d  SQLITE_AFF_TEXT]
c170: 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69  ;.    len = sqli
c180: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70  te3Strlen30(zTyp
c190: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
c1a0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
c1b0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
c1c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
c1d0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
c1e0: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
c1f0: 79 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b  ype(zType, 0) );
c200: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74  .    memcpy(&zSt
c210: 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65  mt[k], zType, le
c220: 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e  n);.    k += len
c230: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c  ;.    assert( k<
c240: 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  =n );.  }.  sqli
c250: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b  te3_snprintf(n-k
c260: 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73  , &zStmt[k], "%s
c270: 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75  ", zEnd);.  retu
c280: 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a  rn zStmt;.}../*.
c290: 2a 2a 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64  ** Resize an Ind
c2a0: 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c  ex object to hol
c2b0: 64 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61  d N columns tota
c2c0: 6c 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  l.  Return SQLIT
c2d0: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
c2e0: 73 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f  ss and SQLITE_NO
c2f0: 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72  MEM on an OOM er
c300: 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ror..*/.static i
c310: 6e 74 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62  nt resizeIndexOb
c320: 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62  ject(sqlite3 *db
c330: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69  , Index *pIdx, i
c340: 6e 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a  nt N){.  char *z
c350: 45 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79  Extra;.  int nBy
c360: 74 65 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e  te;.  if( pIdx->
c370: 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74  nColumn>=N ) ret
c380: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
c390: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69   assert( pIdx->i
c3a0: 73 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20  sResized==0 );. 
c3b0: 20 6e 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66   nByte = (sizeof
c3c0: 28 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66  (char*) + sizeof
c3d0: 28 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20  (i16) + 1)*N;.  
c3e0: 7a 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33  zExtra = sqlite3
c3f0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
c400: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a   nByte);.  if( z
c410: 45 78 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72  Extra==0 ) retur
c420: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
c430: 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c    memcpy(zExtra,
c440: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73   pIdx->azColl, s
c450: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 49 64  izeof(char*)*pId
c460: 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70  x->nColumn);.  p
c470: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63  Idx->azColl = (c
c480: 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20  har**)zExtra;.  
c490: 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66  zExtra += sizeof
c4a0: 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d  (char*)*N;.  mem
c4b0: 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78  cpy(zExtra, pIdx
c4c0: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65  ->aiColumn, size
c4d0: 6f 66 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43  of(i16)*pIdx->nC
c4e0: 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e  olumn);.  pIdx->
c4f0: 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a  aiColumn = (i16*
c500: 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72  )zExtra;.  zExtr
c510: 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29  a += sizeof(i16)
c520: 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  *N;.  memcpy(zEx
c530: 74 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74  tra, pIdx->aSort
c540: 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f  Order, pIdx->nCo
c550: 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61  lumn);.  pIdx->a
c560: 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a  SortOrder = (u8*
c570: 29 7a 45 78 74 72 61 3b 0a 20 20 70 49 64 78 2d  )zExtra;.  pIdx-
c580: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20  >nColumn = N;.  
c590: 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64 20  pIdx->isResized 
c5a0: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
c5b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
c5c0: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 74  * Estimate the t
c5d0: 6f 74 61 6c 20 72 6f 77 20 77 69 64 74 68 20 66  otal row width f
c5e0: 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  or a table..*/.s
c5f0: 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d  tatic void estim
c600: 61 74 65 54 61 62 6c 65 57 69 64 74 68 28 54 61  ateTableWidth(Ta
c610: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e  ble *pTab){.  un
c620: 73 69 67 6e 65 64 20 77 54 61 62 6c 65 20 3d 20  signed wTable = 
c630: 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d  0;.  const Colum
c640: 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e  n *pTabCol;.  in
c650: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61  t i;.  for(i=pTa
c660: 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c  b->nCol, pTabCol
c670: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30  =pTab->aCol; i>0
c680: 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b  ; i--, pTabCol++
c690: 29 7b 0a 20 20 20 20 77 54 61 62 6c 65 20 2b 3d  ){.    wTable +=
c6a0: 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b   pTabCol->szEst;
c6b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62 2d  .  }.  if( pTab-
c6c0: 3e 69 50 4b 65 79 3c 30 20 29 20 77 54 61 62 6c  >iPKey<0 ) wTabl
c6d0: 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54  e++;.  pTab->szT
c6e0: 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c  abRow = sqlite3L
c6f0: 6f 67 45 73 74 28 77 54 61 62 6c 65 2a 34 29 3b  ogEst(wTable*4);
c700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  .}../*.** Estima
c710: 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20 73  te the average s
c720: 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 66 6f 72  ize of a row for
c730: 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74   an index..*/.st
c740: 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61  atic void estima
c750: 74 65 49 6e 64 65 78 57 69 64 74 68 28 49 6e 64  teIndexWidth(Ind
c760: 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73  ex *pIdx){.  uns
c770: 69 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20 30  igned wIndex = 0
c780: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
c790: 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20  st Column *aCol 
c7a0: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
c7b0: 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aCol;.  for(i=0;
c7c0: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
c7d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20  ; i++){.    i16 
c7e0: 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  x = pIdx->aiColu
c7f0: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  mn[i];.    asser
c800: 74 28 20 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c  t( x<pIdx->pTabl
c810: 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77  e->nCol );.    w
c820: 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31  Index += x<0 ? 1
c830: 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69   : aCol[pIdx->ai
c840: 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74  Column[i]].szEst
c850: 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a  ;.  }.  pIdx->sz
c860: 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  IdxRow = sqlite3
c870: 4c 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34 29  LogEst(wIndex*4)
c880: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  ;.}../* Return t
c890: 72 75 65 20 69 66 20 76 61 6c 75 65 20 78 20 69  rue if value x i
c8a0: 73 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20 74  s found any of t
c8b0: 68 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e  he first nCol en
c8c0: 74 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d  tries of aiCol[]
c8d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
c8e0: 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69  asColumn(const i
c8f0: 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e  16 *aiCol, int n
c900: 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77  Col, int x){.  w
c910: 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30  hile( nCol-- > 0
c920: 20 29 20 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f   ) if( x==*(aiCo
c930: 6c 2b 2b 29 20 29 20 72 65 74 75 72 6e 20 31 3b  l++) ) return 1;
c940: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
c950: 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  /*.** The table 
c960: 70 54 61 62 20 68 61 73 20 61 20 57 49 54 48 4f  pTab has a WITHO
c970: 55 54 20 52 4f 57 49 44 20 63 6c 61 75 73 65 20  UT ROWID clause 
c980: 61 74 20 74 68 65 20 65 6e 64 2e 20 20 47 6f 20  at the end.  Go 
c990: 74 68 72 6f 75 67 68 20 61 6e 64 0a 2a 2a 20 6d  through and.** m
c9a0: 61 6b 65 20 61 6c 6c 20 74 68 65 20 63 68 61 6e  ake all the chan
c9b0: 67 65 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f  ges necessary to
c9c0: 20 6d 61 6b 65 20 74 68 69 73 20 61 20 57 49 54   make this a WIT
c9d0: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
c9e0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  ..**.**     (1) 
c9f0: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 4f 50 5f   Convert the OP_
ca00: 43 72 65 61 74 65 54 61 62 6c 65 20 69 6e 74 6f  CreateTable into
ca10: 20 61 6e 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 20 20   an no-op..**   
ca20: 20 20 28 32 29 20 20 4d 61 6b 65 20 73 75 72 65    (2)  Make sure
ca30: 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d   all table colum
ca40: 6e 73 20 61 72 65 20 70 61 72 74 20 6f 66 20 74  ns are part of t
ca50: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 0a 2a  he PRIMARY KEY.*
ca60: 2a 20 20 20 20 20 28 33 29 20 20 4d 61 6b 65 20  *     (3)  Make 
ca70: 73 75 72 65 20 61 6c 6c 20 50 52 49 4d 41 52 59  sure all PRIMARY
ca80: 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20 61 72 65   KEY columns are
ca90: 20 70 61 72 74 20 6f 66 20 61 6c 6c 20 55 4e 49   part of all UNI
caa0: 51 55 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  QUE.**          
cab0: 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69  indices.*/.stati
cac0: 63 20 76 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f  c void convertTo
cad0: 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c  WithoutRowidTabl
cae0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
caf0: 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20   Table *pTab){. 
cb00: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
cb10: 49 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e  Index *pPk;.  in
cb20: 74 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20  t nPk;.  int i, 
cb30: 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  j;.  sqlite3 *db
cb40: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
cb50: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
cb60: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20   OP_CreateTable 
cb70: 6f 70 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c  opcode that woul
cb80: 64 20 6e 6f 72 6d 61 6c 6c 79 20 63 72 65 61 74  d normally creat
cb90: 65 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6f 74 2d  e the.  ** root-
cba0: 70 61 67 65 20 66 6f 72 20 74 68 65 20 74 61 62  page for the tab
cbb0: 6c 65 20 69 6e 74 6f 20 61 20 4f 50 5f 4e 75 6c  le into a OP_Nul
cbc0: 6c 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20  l opcode.  This 
cbd0: 70 72 65 76 65 6e 74 73 20 74 68 65 0a 20 20 2a  prevents the.  *
cbe0: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  * allocation of 
cbf0: 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 28 77  the root-page (w
cc00: 68 69 63 68 20 77 6f 75 6c 64 20 6e 65 76 65 72  hich would never
cc10: 20 62 65 65 6e 20 75 73 65 64 2c 20 61 73 20 61   been used, as a
cc20: 6c 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20  ll.  ** content 
cc30: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
cc40: 20 70 72 69 6d 61 72 79 2d 6b 65 79 20 69 6e 64   primary-key ind
cc50: 65 78 20 69 6e 73 74 65 61 64 29 20 61 6e 64 20  ex instead) and 
cc60: 69 74 20 63 61 75 73 65 73 0a 20 20 2a 2a 20 61  it causes.  ** a
cc70: 20 4e 55 4c 4c 20 76 61 6c 75 65 20 69 6e 20 74   NULL value in t
cc80: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
cc90: 2e 72 6f 6f 74 70 61 67 65 20 66 69 65 6c 64 20  .rootpage field 
cca0: 6f 66 20 74 68 65 20 73 63 68 65 6d 61 2e 0a 20  of the schema.. 
ccb0: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
ccc0: 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b 0a 20  ->addrCrTab ){. 
ccd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65     sqlite3VdbeGe
cce0: 74 4f 70 28 70 50 61 72 73 65 2d 3e 70 56 64 62  tOp(pParse->pVdb
ccf0: 65 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43  e, pParse->addrC
cd00: 72 54 61 62 29 2d 3e 6f 70 63 6f 64 65 20 3d 20  rTab)->opcode = 
cd10: 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 7d 0a 0a 20 20  OP_Null;.  }..  
cd20: 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 50 52  /* Locate the PR
cd30: 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e  IMARY KEY index.
cd40: 20 20 4f 72 2c 20 69 66 20 74 68 69 73 20 74 61    Or, if this ta
cd50: 62 6c 65 20 77 61 73 20 6f 72 69 67 69 6e 61 6c  ble was original
cd60: 6c 79 0a 20 20 2a 2a 20 61 6e 20 49 4e 54 45 47  ly.  ** an INTEG
cd70: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 74  ER PRIMARY KEY t
cd80: 61 62 6c 65 2c 20 63 72 65 61 74 65 20 61 20 6e  able, create a n
cd90: 65 77 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  ew PRIMARY KEY i
cda0: 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ndex. .  */.  if
cdb0: 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30  ( pTab->iPKey>=0
cdc0: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
cdd0: 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 69   *pList;.    pLi
cde0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
cdf0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
ce00: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  e, 0, 0);.    if
ce10: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
ce20: 75 72 6e 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  urn;.    pList->
ce30: 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c  a[0].zName = sql
ce40: 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
ce50: 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce80: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62   pTab->aCol[pTab
ce90: 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b  ->iPKey].zName);
cea0: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  .    pList->a[0]
ceb0: 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 50 61  .sortOrder = pPa
cec0: 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65  rse->iPkSortOrde
ced0: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
cee0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
cef0: 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20 20 70 50  ==pTab );.    pP
cf00: 6b 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  k = sqlite3Creat
cf10: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30  eIndex(pParse, 0
cf20: 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c 20 70  , 0, 0, pList, p
cf30: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c 20 30 2c  Tab->keyConf, 0,
cf40: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
cf50: 66 28 20 70 50 6b 3d 3d 30 20 29 20 72 65 74 75  f( pPk==0 ) retu
cf60: 72 6e 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50  rn;.    pTab->iP
cf70: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  Key = -1;.  }els
cf80: 65 7b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c  e{.    pPk = sql
cf90: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
cfa0: 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 0a 20  dex(pTab);.  }. 
cfb0: 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d 30 20   assert( pPk!=0 
cfc0: 29 3b 0a 20 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e  );.  nPk = pPk->
cfd0: 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 4d  nKeyCol;..  /* M
cfe0: 61 6b 65 20 73 75 72 65 20 65 76 65 72 79 20 63  ake sure every c
cff0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 50 52 49  olumn of the PRI
d000: 4d 41 52 59 20 4b 45 59 20 69 73 20 4e 4f 54 20  MARY KEY is NOT 
d010: 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  NULL */.  for(i=
d020: 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a  0; i<nPk; i++){.
d030: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70      pTab->aCol[p
d040: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d  Pk->aiColumn[i]]
d050: 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20  .notNull = 1;.  
d060: 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
d070: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
d080: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  resentation of a
d090: 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64 69 63 65  ll UNIQUE indice
d0a0: 73 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a  s by converting.
d0b0: 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 72    ** the final r
d0c0: 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f  owid column into
d0d0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c   one or more col
d0e0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d  umns of the PRIM
d0f0: 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20  ARY KEY..  */.  
d100: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
d110: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
d120: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
d130: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69      int n;.    i
d140: 66 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64  f( pIdx->autoInd
d150: 65 78 3d 3d 32 20 29 20 63 6f 6e 74 69 6e 75 65  ex==2 ) continue
d160: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
d170: 6e 4b 65 79 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e  nKeyCol==pTab->n
d180: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 64  Col ){.      pId
d190: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61  x->nColumn = pTa
d1a0: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 63  b->nCol;.      c
d1b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
d1c0: 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c     for(i=n=0; i<
d1d0: 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nPk; i++){.     
d1e0: 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28   if( !hasColumn(
d1f0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  pIdx->aiColumn, 
d200: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70  pIdx->nKeyCol, p
d210: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29  Pk->aiColumn[i])
d220: 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) n++;.    }.  
d230: 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65    if( resizeInde
d240: 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64 78  xObject(db, pIdx
d250: 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b  , pIdx->nKeyCol+
d260: 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  n) ) return;.   
d270: 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78   for(i=0, j=pIdx
d280: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b  ->nKeyCol; i<nPk
d290: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
d2a0: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64  ( !hasColumn(pId
d2b0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20  x->aiColumn, j, 
d2c0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
d2d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
d2e0: 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c  ert( j<pPk->nCol
d2f0: 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  umn );.        p
d300: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
d310: 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
d320: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 64  [i];.        pId
d330: 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70  x->azColl[j] = p
d340: 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  Pk->azColl[i];. 
d350: 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20         j++;.    
d360: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
d370: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c  sert( pIdx->nCol
d380: 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20 61 73  umn==j );.    as
d390: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79  sert( pIdx->nKey
d3a0: 43 6f 6c 2b 6e 3d 3d 6a 20 29 3b 0a 20 20 7d 0a  Col+n==j );.  }.
d3b0: 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61  .  /* Add all ta
d3c0: 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74  ble columns to t
d3d0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
d3e0: 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ndex.  */.  if( 
d3f0: 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  nPk<pTab->nCol )
d400: 7b 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65  {.    if( resize
d410: 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20  IndexObject(db, 
d420: 70 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29  pPk, pTab->nCol)
d430: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66   ) return;.    f
d440: 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69  or(i=0, j=nPk; i
d450: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  <pTab->nCol; i++
d460: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61  ){.      if( !ha
d470: 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43  sColumn(pPk->aiC
d480: 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a  olumn, j, i) ){.
d490: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d4a0: 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  j<pPk->nColumn )
d4b0: 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61  ;.        pPk->a
d4c0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a  iColumn[j] = i;.
d4d0: 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43          pPk->azC
d4e0: 6f 6c 6c 5b 6a 5d 20 3d 20 22 42 49 4e 41 52 59  oll[j] = "BINARY
d4f0: 22 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a  ";.        j++;.
d500: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d510: 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e    assert( pPk->n
d520: 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20  Column==j );.   
d530: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
d540: 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 0a 7d 0a  Col==j );.  }.}.
d550: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d560: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
d570: 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61   report the fina
d580: 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69  l ")" that termi
d590: 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54  nates.** a CREAT
d5a0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
d5b0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  t..**.** The tab
d5c0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61  le structure tha
d5d0: 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72  t other action r
d5e0: 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65  outines have bee
d5f0: 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73  n building.** is
d600: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
d610: 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c  ternal hash tabl
d620: 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20  es, assuming no 
d630: 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f  errors have.** o
d640: 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  ccurred..**.** A
d650: 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  n entry for the 
d660: 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e  table is made in
d670: 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
d680: 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73  e on disk, unles
d690: 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74  s.** this is a t
d6a0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
d6b0: 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  r db->init.busy=
d6c0: 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e  =1.  When db->in
d6d0: 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74  it.busy==1.** it
d6e0: 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65   means we are re
d6f0: 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  ading the sqlite
d700: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65  _master table be
d710: 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a  cause we just.**
d720: 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68   connected to th
d730: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65  e database or be
d740: 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65  cause the sqlite
d750: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61  _master table ha
d760: 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68  s.** recently ch
d770: 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e  anged, so the en
d780: 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62  try for this tab
d790: 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  le already exist
d7a0: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s in.** the sqli
d7b0: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e  te_master table.
d7c0: 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74    We do not want
d7d0: 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67   to create it ag
d7e0: 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ain..**.** If th
d7f0: 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65  e pSelect argume
d800: 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  nt is not NULL, 
d810: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
d820: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61  is routine.** wa
d830: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
d840: 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72  te a table gener
d850: 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20  ated from a .** 
d860: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e  "CREATE TABLE ..
d870: 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22  . AS SELECT ..."
d880: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
d890: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66   column names of
d8a0: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c  .** the new tabl
d8b0: 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65  e will match the
d8c0: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
d8d0: 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f  he SELECT..*/.vo
d8e0: 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  id sqlite3EndTab
d8f0: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
d900: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
d910: 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a   Parse context *
d920: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73  /.  Token *pCons
d930: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
d940: 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74  he ',' token aft
d950: 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  er the last colu
d960: 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f  mn defn. */.  To
d970: 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20  ken *pEnd,      
d980: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27        /* The ')'
d990: 20 62 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20   before options 
d9a0: 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41  in the CREATE TA
d9b0: 42 4c 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f  BLE */.  u8 tabO
d9c0: 70 74 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  pts,            
d9d0: 20 2f 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20   /* Extra table 
d9e0: 6f 70 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79  options. Usually
d9f0: 20 30 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20   0. */.  Select 
da00: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 20  *pSelect        
da10: 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20   /* Select from 
da20: 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53  a "CREATE ... AS
da30: 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20   SELECT" */.){. 
da40: 20 54 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20   Table *p;      
da50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
da60: 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
da70: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
da80: 50 61 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68  Parse->db; /* Th
da90: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
daa0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
dab0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
dac0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
dad0: 20 69 6e 20 77 68 69 63 68 20 74 68 65 20 74 61   in which the ta
dae0: 62 6c 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49  ble lives */.  I
daf0: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
db00: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
db10: 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20  mplied index of 
db20: 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20  the table */..  
db30: 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20  if( (pEnd==0 && 
db40: 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 64  pSelect==0) || d
db50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
db60: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
db70: 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d   }.  p = pParse-
db80: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
db90: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
dba0: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ..  assert( !db-
dbb0: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70  >init.busy || !p
dbc0: 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69 66 28  Select );..  if(
dbd0: 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69   tabOpts & TF_Wi
dbe0: 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20  thoutRowid ){.  
dbf0: 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61    if( (p->tabFla
dc00: 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61  gs & TF_HasPrima
dc10: 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20  ryKey)==0 ){.   
dc20: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
dc30: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 50  sg(pParse, "no P
dc40: 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 74  RIMARY KEY for t
dc50: 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61  able %s", p->zNa
dc60: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
dc70: 20 20 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67        p->tabFlag
dc80: 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74 52  s |= TF_WithoutR
dc90: 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e 76  owid;.      conv
dca0: 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69  ertToWithoutRowi
dcb0: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  dTable(pParse, p
dcc0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
dcd0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
dce0: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
dcf0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66  ->pSchema);..#if
dd00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
dd10: 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f  _CHECK.  /* Reso
dd20: 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c  lve names in all
dd30: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
dd40: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20  t expressions.. 
dd50: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68   */.  if( p->pCh
dd60: 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  eck ){.    sqlit
dd70: 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
dd80: 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70  erence(pParse, p
dd90: 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30 2c  , NC_IsCheck, 0,
dda0: 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20 7d   p->pCheck);.  }
ddb0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
ddc0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ddd0: 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20  CHECK) */..  /* 
dde0: 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76 65  Estimate the ave
ddf0: 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66 6f  rage row size fo
de00: 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  r the table and 
de10: 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64 20  for all implied 
de20: 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73 74  indices */.  est
de30: 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28  imateTableWidth(
de40: 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70  p);.  for(pIdx=p
de50: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
de60: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
de70: 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65 49  ){.    estimateI
de80: 6e 64 65 78 57 69 64 74 68 28 70 49 64 78 29 3b  ndexWidth(pIdx);
de90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
dea0: 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  e db->init.busy 
deb0: 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65  is 1 it means we
dec0: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
ded0: 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a   SQL off the.  *
dee0: 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  * "sqlite_master
def0: 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d  " or "sqlite_tem
df00: 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20  p_master" table 
df10: 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a  on the disk..  *
df20: 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74  * So do not writ
df30: 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67  e to the disk ag
df40: 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68  ain.  Extract th
df50: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
df60: 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
df70: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64  table from the d
df80: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20  b->init.newTnum 
df90: 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67  field.  (The pag
dfa0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68  e number.  ** sh
dfb0: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70  ould have been p
dfc0: 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65 20  ut there by the 
dfd0: 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75  sqliteOpenCb rou
dfe0: 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66  tine.).  */.  if
dff0: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
e000: 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d  ){.    p->tnum =
e010: 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
e020: 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  m;.  }..  /* If 
e030: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67  not initializing
e040: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
e050: 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e  record for the n
e060: 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  ew table.  ** in
e070: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
e080: 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ER table of the 
e090: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20  database..  **. 
e0a0: 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   ** If this is a
e0b0: 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65   TEMPORARY table
e0c0: 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72  , write the entr
e0d0: 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c  y into the auxil
e0e0: 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69  iary.  ** file i
e0f0: 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74  nstead of into t
e100: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
e110: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
e120: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
e130: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20   ){.    int n;. 
e140: 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20     Vdbe *v;.    
e150: 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20  char *zType;    
e160: 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61  /* "view" or "ta
e170: 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  ble" */.    char
e180: 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22   *zType2;   /* "
e190: 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22  VIEW" or "TABLE"
e1a0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
e1b0: 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20  tmt;    /* Text 
e1c0: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41  of the CREATE TA
e1d0: 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49  BLE or CREATE VI
e1e0: 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EW statement */.
e1f0: 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
e200: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
e210: 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76  .    if( NEVER(v
e220: 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a  ==0) ) return;..
e230: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e240: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
e250: 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a  e, 0);..    /* .
e260: 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a      ** Initializ
e270: 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  e zType for the 
e280: 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c  new view or tabl
e290: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
e2a0: 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  ( p->pSelect==0 
e2b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65  ){.      /* A re
e2c0: 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20  gular table */. 
e2d0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61       zType = "ta
e2e0: 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70  ble";.      zTyp
e2f0: 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69  e2 = "TABLE";.#i
e300: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e310: 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65  T_VIEW.    }else
e320: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65  {.      /* A vie
e330: 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65  w */.      zType
e340: 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20   = "view";.     
e350: 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22   zType2 = "VIEW"
e360: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
e370: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
e380: 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  s a CREATE TABLE
e390: 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e   xx AS SELECT ..
e3a0: 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53  ., execute the S
e3b0: 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61  ELECT.    ** sta
e3c0: 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61  tement to popula
e3d0: 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  te the new table
e3e0: 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  . The root-page 
e3f0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20  number for the. 
e400: 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20     ** new table 
e410: 69 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 70  is in register p
e420: 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a  Parse->regRoot..
e430: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e      **.    ** On
e440: 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61  ce the SELECT ha
e450: 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20  s been coded by 
e460: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c  sqlite3Select(),
e470: 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20   it is in a.    
e480: 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74  ** suitable stat
e490: 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74  e to query for t
e4a0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
e4b0: 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20  and types to be 
e4c0: 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  used.    ** by t
e4d0: 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20  he new table..  
e4e0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68    **.    ** A sh
e4f0: 61 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65  ared-cache write
e500: 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71  -lock is not req
e510: 75 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74  uired to write t
e520: 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c  o the new table,
e530: 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68  .    ** as a sch
e540: 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61  ema-lock must ha
e550: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
e560: 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61  obtained to crea
e570: 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20  te it. Since.   
e580: 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63   ** a schema-loc
e590: 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f  k excludes all o
e5a0: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73  ther database us
e5b0: 65 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c  ers, the write-l
e5c0: 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a  ock would.    **
e5d0: 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20   be redundant.. 
e5e0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
e5f0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53  elect ){.      S
e600: 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a  electDest dest;.
e610: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65        Table *pSe
e620: 6c 54 61 62 3b 0a 0a 20 20 20 20 20 20 61 73 73  lTab;..      ass
e630: 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62  ert(pParse->nTab
e640: 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ==1);.      sqli
e650: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
e660: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31   OP_OpenWrite, 1
e670: 2c 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  , pParse->regRoo
e680: 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  t, iDb);.      s
e690: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
e6a0: 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49  P5(v, OPFLAG_P2I
e6b0: 53 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61  SREG);.      pPa
e6c0: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20  rse->nTab = 2;. 
e6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
e6e0: 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
e6f0: 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b  , SRT_Table, 1);
e700: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
e710: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
e720: 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20  lect, &dest);.  
e730: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e740: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
e750: 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 1);.      if(
e760: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
e770: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   ){.        pSel
e780: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
e790: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
e7a0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b  Parse, pSelect);
e7b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
e7c0: 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  lTab==0 ) return
e7d0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
e7e0: 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a  ( p->aCol==0 );.
e7f0: 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20          p->nCol 
e800: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
e810: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c  .        p->aCol
e820: 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c   = pSelTab->aCol
e830: 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61  ;.        pSelTa
e840: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
e850: 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43       pSelTab->aC
e860: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
e870: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
e880: 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b  le(db, pSelTab);
e890: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
e8a0: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
e8b0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
e8c0: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73   of the CREATE s
e8d0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
e8e0: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
e8f0: 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65       zStmt = cre
e900: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c  ateTableStmt(db,
e910: 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   p);.    }else{.
e920: 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e        Token *pEn
e930: 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26  d2 = tabOpts ? &
e940: 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
e950: 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20  en : pEnd;.     
e960: 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32   n = (int)(pEnd2
e970: 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e  ->z - pParse->sN
e980: 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20  ameToken.z);.   
e990: 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b     if( pEnd2->z[
e9a0: 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70  0]!=';' ) n += p
e9b0: 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a  End2->n;.      z
e9c0: 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
e9d0: 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20  rintf(db, .     
e9e0: 20 20 20 20 20 22 43 52 45 41 54 45 20 25 73 20       "CREATE %s 
e9f0: 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e  %.*s", zType2, n
ea00: 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  , pParse->sNameT
ea10: 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a  oken.z.      );.
ea20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20      }..    /* A 
ea30: 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63  slot for the rec
ea40: 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20  ord has already 
ea50: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69  been allocated i
ea60: 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51  n the .    ** SQ
ea70: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
ea80: 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64  e.  We just need
ea90: 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20   to update that 
eaa0: 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20  slot with all.  
eab0: 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61    ** the informa
eac0: 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65  tion we've colle
ead0: 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  cted..    */.   
eae0: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
eaf0: 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
eb00: 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
eb10: 22 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20  ".         "SET 
eb20: 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d  type='%s', name=
eb30: 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c  %Q, tbl_name=%Q,
eb40: 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73   rootpage=#%d, s
eb50: 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22  ql=%Q ".       "
eb60: 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22  WHERE rowid=#%d"
eb70: 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ,.      db->aDb[
eb80: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
eb90: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20  MA_TABLE(iDb),. 
eba0: 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20       zType,.    
ebb0: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
ebc0: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20    p->zName,.    
ebd0: 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f    pParse->regRoo
ebe0: 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a  t,.      zStmt,.
ebf0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65        pParse->re
ec00: 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20  gRowid.    );.  
ec10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
ec20: 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20  db, zStmt);.    
ec30: 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
ec40: 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
ec50: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
ec60: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
ec70: 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63  MENT.    /* Chec
ec80: 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e  k to see if we n
ec90: 65 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  eed to create an
eca0: 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
ecb0: 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a   table for.    *
ecc0: 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20  * keeping track 
ecd0: 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  of autoincrement
ece0: 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20   keys..    */.  
ecf0: 20 20 69 66 28 20 70 2d 3e 74 61 62 46 6c 61 67    if( p->tabFlag
ed00: 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
ed10: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 44 62  ment ){.      Db
ed20: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
ed30: 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 73 73  [iDb];.      ass
ed40: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
ed50: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
ed60: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20  iDb, 0) );.     
ed70: 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
ed80: 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b  a->pSeqTab==0 ){
ed90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
eda0: 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
edb0: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43  se,.          "C
edc0: 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73  REATE TABLE %Q.s
edd0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e  qlite_sequence(n
ede0: 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20  ame,seq)",.     
edf0: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a       pDb->zName.
ee00: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
ee10: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
ee20: 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20  .    /* Reparse 
ee30: 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70  everything to up
ee40: 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
ee50: 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
ee60: 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  s */.    sqlite3
ee70: 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
ee80: 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20  maOp(v, iDb,.   
ee90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d          sqlite3M
eea0: 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f  Printf(db, "tbl_
eeb0: 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
eec0: 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20  pe!='trigger'", 
eed0: 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a  p->zName));.  }.
eee0: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74  ..  /* Add the t
eef0: 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d  able to the in-m
ef00: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
ef10: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61  tion of the data
ef20: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
ef30: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
ef40: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c  {.    Table *pOl
ef50: 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  d;.    Schema *p
ef60: 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68  Schema = p->pSch
ef70: 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ema;.    assert(
ef80: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
ef90: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
efa0: 20 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20   0) );.    pOld 
efb0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
efc0: 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  ert(&pSchema->tb
efd0: 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c  lHash, p->zName,
efe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
f000: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d  lite3Strlen30(p-
f010: 3e 7a 4e 61 6d 65 29 2c 70 29 3b 0a 20 20 20 20  >zName),p);.    
f020: 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
f030: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
f040: 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
f050: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
f060: 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
f070: 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 64 62  rt() */.      db
f080: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
f090: 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
f0a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
f0b0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
f0c0: 30 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  0;.    db->flags
f0d0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
f0e0: 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64  nChanges;..#ifnd
f0f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
f100: 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66  LTERTABLE.    if
f110: 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b  ( !p->pSelect ){
f120: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
f130: 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
f140: 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d  t char *)pParse-
f150: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20  >sNameToken.z;. 
f160: 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a       int nName;.
f170: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
f180: 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20  Select && pCons 
f190: 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20  && pEnd );.     
f1a0: 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30   if( pCons->z==0
f1b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e   ){.        pCon
f1c0: 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  s = pEnd;.      
f1d0: 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20  }.      nName = 
f1e0: 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61  (int)((const cha
f1f0: 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a  r *)pCons->z - z
f200: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Name);.      p->
f210: 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31  addColOffset = 1
f220: 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43  3 + sqlite3Utf8C
f230: 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e  harLen(zName, nN
f240: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ame);.    }.#end
f250: 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  if.  }.}..#ifnde
f260: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
f270: 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72  EW./*.** The par
f280: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
f290: 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20  outine in order 
f2a0: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
f2b0: 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  VIEW.*/.void sql
f2c0: 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a  ite3CreateView(.
f2d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
f2e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
f2f0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
f300: 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20   Token *pBegin, 
f310: 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
f320: 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
f330: 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ins the statemen
f340: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
f350: 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame1,     /* The
f360: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
f370: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
f380: 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  e view */.  Toke
f390: 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
f3a0: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
f3b0: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
f3c0: 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
f3d0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
f3e0: 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20  ,   /* A SELECT 
f3f0: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77  statement that w
f400: 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
f410: 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  ew view */.  int
f420: 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20   isTemp,        
f430: 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45  /* TRUE for a TE
f440: 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a  MPORARY view */.
f450: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
f460: 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73       /* Suppress
f470: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
f480: 69 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20  if VIEW already 
f490: 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  exists */.){.  T
f4a0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  able *p;.  int n
f4b0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
f4c0: 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b  z;.  Token sEnd;
f4d0: 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b  .  DbFixer sFix;
f4e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  .  Token *pName 
f4f0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  = 0;.  int iDb;.
f500: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
f510: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
f520: 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  f( pParse->nVar>
f530: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
f540: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f550: 20 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65   "parameters are
f560: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20   not allowed in 
f570: 76 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c  views");.    sql
f580: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
f590: 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
f5a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
f5b0: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
f5c0: 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
f5d0: 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d  1, pName2, isTem
f5e0: 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b  p, 1, 0, noErr);
f5f0: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
f600: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
f610: 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
f620: 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  nErr ){.    sqli
f630: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
f640: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
f650: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
f660: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
f670: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
f680: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
f690: 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  e);.  iDb = sqli
f6a0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
f6b0: 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
f6c0: 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e  ;.  sqlite3FixIn
f6d0: 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
f6e0: 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70  , iDb, "view", p
f6f0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c  Name);.  if( sql
f700: 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73  ite3FixSelect(&s
f710: 46 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29 7b  Fix, pSelect) ){
f720: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
f730: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
f740: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
f750: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  n;.  }..  /* Mak
f760: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
f770: 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74  entire SELECT st
f780: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66  atement that def
f790: 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20  ines the view.. 
f7a0: 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f   ** This will fo
f7b0: 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72  rce all the Expr
f7c0: 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20  .token.z values 
f7d0: 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c  to be dynamicall
f7e0: 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
f7f0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69   rather than poi
f800: 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20  nt to the input 
f810: 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d  string - which m
f820: 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74  eans that.  ** t
f830: 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74  hey will persist
f840: 20 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65   after the curre
f850: 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  nt sqlite3_exec(
f860: 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a  ) call returns..
f870: 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63    */.  p->pSelec
f880: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
f890: 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74  tDup(db, pSelect
f8a0: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
f8b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
f8c0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
f8d0: 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62 2d  lect);.  if( db-
f8e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
f8f0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
f900: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
f910: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c  .busy ){.    sql
f920: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
f930: 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  nNames(pParse, p
f940: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
f950: 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ate the end of t
f960: 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73  he CREATE VIEW s
f970: 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20  tatement.  Make 
f980: 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20  sEnd point to.  
f990: 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f  ** the end..  */
f9a0: 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65  .  sEnd = pParse
f9b0: 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20  ->sLastToken;.  
f9c0: 69 66 28 20 41 4c 57 41 59 53 28 73 45 6e 64 2e  if( ALWAYS(sEnd.
f9d0: 7a 5b 30 5d 21 3d 30 29 20 26 26 20 73 45 6e 64  z[0]!=0) && sEnd
f9e0: 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20  .z[0]!=';' ){.  
f9f0: 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64    sEnd.z += sEnd
fa00: 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e  .n;.  }.  sEnd.n
fa10: 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74   = 0;.  n = (int
fa20: 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69  )(sEnd.z - pBegi
fa30: 6e 2d 3e 7a 29 3b 0a 20 20 7a 20 3d 20 70 42 65  n->z);.  z = pBe
fa40: 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28  gin->z;.  while(
fa50: 20 41 4c 57 41 59 53 28 6e 3e 30 29 20 26 26 20   ALWAYS(n>0) && 
fa60: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a  sqlite3Isspace(z
fa70: 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d  [n-1]) ){ n--; }
fa80: 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e  .  sEnd.z = &z[n
fa90: 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20  -1];.  sEnd.n = 
faa0: 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c  1;..  /* Use sql
fab0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74  ite3EndTable() t
fac0: 6f 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74  o add the view t
fad0: 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  o the SQLITE_MAS
fae0: 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  TER table */.  s
faf0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
fb00: 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c  Parse, 0, &sEnd,
fb10: 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e   0, 0);.  return
fb20: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
fb30: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
fb40: 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
fb50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
fb60: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
fb70: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
fb80: 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68  LTABLE)./*.** Th
fb90: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
fba0: 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c  e pTable is real
fbb0: 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c  ly a VIEW.  Fill
fbc0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   in the names of
fbd0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  .** the columns 
fbe0: 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74  of the view in t
fbf0: 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74  he pTable struct
fc00: 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ure.  Return the
fc10: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
fc20: 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72  rors.  If an err
fc30: 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65  or is seen leave
fc40: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
fc50: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
fc60: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
fc70: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
fc80: 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
fc90: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
fca0: 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ble){.  Table *p
fcb0: 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66  SelTab;   /* A f
fcc0: 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77  ake table from w
fcd0: 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20  hich we get the 
fce0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
fcf0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20  Select *pSel;   
fd00: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65    /* Copy of the
fd10: 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70   SELECT that imp
fd20: 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
fd30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d   */.  int nErr =
fd40: 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
fd50: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
fd60: 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74  untered */.  int
fd70: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   n;            /
fd80: 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f  * Temporarily ho
fd90: 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lds the number o
fda0: 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e  f cursors assign
fdb0: 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ed */.  sqlite3 
fdc0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
fdd0: 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
fde0: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61  onnection for ma
fdf0: 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20  lloc errors */. 
fe00: 20 69 6e 74 20 28 2a 78 41 75 74 68 29 28 76 6f   int (*xAuth)(vo
fe10: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
fe20: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ar*,const char*,
fe30: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
fe40: 74 20 63 68 61 72 2a 29 3b 0a 0a 20 20 61 73 73  t char*);..  ass
fe50: 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
fe60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fe70: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
fe80: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 74  .  if( sqlite3Vt
fe90: 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50  abCallConnect(pP
fea0: 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b  arse, pTable) ){
feb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
fec0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
fed0: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
fee0: 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30  able) ) return 0
fef0: 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
ff00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
ff10: 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69  EW.  /* A positi
ff20: 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68  ve nCol means th
ff30: 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20  e columns names 
ff40: 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72  for this view ar
ff50: 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b  e.  ** already k
ff60: 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nown..  */.  if(
ff70: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20   pTable->nCol>0 
ff80: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
ff90: 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * A negative nCo
ffa0: 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d  l is a special m
ffb0: 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68  arker meaning th
ffc0: 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  at we are curren
ffd0: 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20  tly.  ** trying 
ffe0: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63  to compute the c
fff0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66  olumn names.  If
10000 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72   we enter this r
10010 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a  outine with.  **
10020 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   a negative nCol
10030 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f  , it means two o
10040 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72  r more views for
10050 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74  m a loop, like t
10060 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
10070 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f     CREATE VIEW o
10080 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  ne AS SELECT * F
10090 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20  ROM two;.  **   
100a0 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77    CREATE VIEW tw
100b0 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  o AS SELECT * FR
100c0 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a  OM one;.  **.  *
100d0 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20  * Actually, the 
100e0 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e  error above is n
100f0 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20  ow caught prior 
10100 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73  to reaching this
10110 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74   point..  ** But
10120 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
10130 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70  est is still imp
10140 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65  ortant as it doe
10150 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69  s come up.  ** i
10160 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  n the following:
10170 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20  .  ** .  **     
10180 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69  CREATE TABLE mai
10190 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20  n.ex1(a);.  **  
101a0 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 56     CREATE TEMP V
101b0 49 45 57 20 65 78 31 20 41 53 20 53 45 4c 45 43  IEW ex1 AS SELEC
101c0 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20  T a FROM ex1;.  
101d0 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  **     SELECT * 
101e0 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20  FROM temp.ex1;. 
101f0 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
10200 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ->nCol<0 ){.    
10210 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
10220 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73  pParse, "view %s
10230 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64   is circularly d
10240 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d  efined", pTable-
10250 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
10260 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 1;.  }.  ass
10270 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ert( pTable->nCo
10280 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  l>=0 );..  /* If
10290 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
102a0 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65  , it means we ne
102b0 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
102c0 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20  e table names.. 
102d0 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
102e0 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
102f0 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
10300 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
10310 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
10320 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65  ements in the re
10330 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65  sults set of the
10340 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61   view and will a
10350 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20  ssign cursors.  
10360 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e  ** to the elemen
10370 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ts of the FROM c
10380 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64  lause.  But we d
10390 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65  o not want these
103a0 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
103b0 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20   be permanent.  
103c0 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  So the computati
103d0 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20  on is done on a 
103e0 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
103f0 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  CT.  ** statemen
10400 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
10410 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20  he view..  */.  
10420 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
10430 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65  pSelect );.  pSe
10440 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  l = sqlite3Selec
10450 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d  tDup(db, pTable-
10460 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
10470 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20  if( pSel ){.    
10480 75 38 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69  u8 enableLookasi
10490 64 65 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  de = db->lookasi
104a0 64 65 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20 20  de.bEnabled;.   
104b0 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61   n = pParse->nTa
104c0 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  b;.    sqlite3Sr
104d0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
104e0 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  rs(pParse, pSel-
104f0 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62  >pSrc);.    pTab
10500 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  le->nCol = -1;. 
10510 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
10520 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 23  .bEnabled = 0;.#
10530 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10540 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
10550 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d  .    xAuth = db-
10560 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e  >xAuth;.    db->
10570 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70  xAuth = 0;.    p
10580 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
10590 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
105a0 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b  t(pParse, pSel);
105b0 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d  .    db->xAuth =
105c0 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20   xAuth;.#else.  
105d0 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
105e0 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
105f0 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
10600 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64  l);.#endif.    d
10610 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
10620 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65 4c 6f  abled = enableLo
10630 6f 6b 61 73 69 64 65 3b 0a 20 20 20 20 70 50 61  okaside;.    pPa
10640 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20  rse->nTab = n;. 
10650 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29     if( pSelTab )
10660 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
10670 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
10680 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  );.      pTable-
10690 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
106a0 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61  >nCol;.      pTa
106b0 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c  ble->aCol = pSel
106c0 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
106d0 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
106e0 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61   0;.      pSelTa
106f0 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
10700 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
10710 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61  Table(db, pSelTa
10720 62 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  b);.      assert
10730 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
10740 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
10750 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29  pTable->pSchema)
10760 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65   );.      pTable
10770 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73  ->pSchema->flags
10780 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69   |= DB_UnresetVi
10790 65 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ews;.    }else{.
107a0 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43        pTable->nC
107b0 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45  ol = 0;.      nE
107c0 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rr++;.    }.    
107d0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
107e0 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20  ete(db, pSel);. 
107f0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45   } else {.    nE
10800 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rr++;.  }.#endif
10810 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10820 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e  VIEW */.  return
10830 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
10840 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
10850 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
10860 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
10870 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
10880 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  ABLE) */..#ifnde
10890 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
108a0 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  EW./*.** Clear t
108b0 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
108c0 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20  from every VIEW 
108d0 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e  in database idx.
108e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
108f0 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
10900 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
10910 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
10920 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72  Elem *i;.  asser
10930 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
10940 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64  MutexHeld(db, id
10950 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21  x, 0) );.  if( !
10960 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
10970 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
10980 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
10990 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
109a0 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
109b0 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d  Db[idx].pSchema-
109c0 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73  >tblHash); i;i=s
109d0 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
109e0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
109f0 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
10a00 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
10a10 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
10a20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c  .      sqliteDel
10a30 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64  eteColumnNames(d
10a40 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
10a50 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a  pTab->aCol = 0;.
10a60 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c        pTab->nCol
10a70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
10a80 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
10a90 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
10aa0 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23  resetViews);.}.#
10ab0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71  else.# define sq
10ac0 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
10ad0 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20  (A,B).#endif /* 
10ae0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
10af0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
10b00 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
10b10 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74  ed by the VDBE t
10b20 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74  o adjust the int
10b30 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
10b40 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77  used by SQLite w
10b50 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61  hen the btree la
10b60 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c  yer moves a tabl
10b70 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65  e root page. The
10b80 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  .** root-page of
10b90 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
10ba0 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44  x in database iD
10bb0 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72  b has changed fr
10bc0 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69  om iFrom.** to i
10bd0 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74  To..**.** Ticket
10be0 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d   #1728:  The sym
10bf0 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20  bol table might 
10c00 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e  still contain in
10c10 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20  formation.** on 
10c20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e  tables and/or in
10c30 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74  dices that are t
10c40 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  he process of be
10c50 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20  ing deleted..** 
10c60 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63  If you are unluc
10c70 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ky, one of those
10c80 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73   deleted indices
10c90 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74   or tables might
10ca0 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d  .** have the sam
10cb0 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65  e rootpage numbe
10cc0 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61  r as the real ta
10cd0 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61  ble or index tha
10ce0 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f  t is.** being mo
10cf0 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e  ved.  So we cann
10d00 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e  ot stop searchin
10d10 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73  g after the firs
10d20 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61  t match .** beca
10d30 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61  use the first ma
10d40 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72  tch might be for
10d50 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65   one of the dele
10d60 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f  ted indices.** o
10d70 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74  r tables and not
10d80 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
10d90 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c   that is actuall
10da0 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a  y being moved..*
10db0 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e  * We must contin
10dc0 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ue looping until
10dd0 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20   all tables and 
10de0 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20  indices with.** 
10df0 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20  rootpage==iFrom 
10e00 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72  have been conver
10e10 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f  ted to have a ro
10e20 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a  otpage of iTo.**
10e30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
10e40 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20  certain that we 
10e50 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e  got the right on
10e60 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
10e70 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
10e80 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65  CUUM.void sqlite
10e90 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73  3RootPageMoved(s
10ea0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
10eb0 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20  iDb, int iFrom, 
10ec0 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68  int iTo){.  Hash
10ed0 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48  Elem *pElem;.  H
10ee0 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62  ash *pHash;.  Db
10ef0 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74   *pDb;..  assert
10f00 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
10f10 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
10f20 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20  , 0) );.  pDb = 
10f30 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
10f40 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70   pHash = &pDb->p
10f50 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b  Schema->tblHash;
10f60 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c  .  for(pElem=sql
10f70 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61  iteHashFirst(pHa
10f80 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65  sh); pElem; pEle
10f90 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  m=sqliteHashNext
10fa0 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61  (pElem)){.    Ta
10fb0 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69  ble *pTab = sqli
10fc0 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d  teHashData(pElem
10fd0 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  );.    if( pTab-
10fe0 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a  >tnum==iFrom ){.
10ff0 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d        pTab->tnum
11000 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20   = iTo;.    }.  
11010 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62  }.  pHash = &pDb
11020 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
11030 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d  sh;.  for(pElem=
11040 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
11050 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70  pHash); pElem; p
11060 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e  Elem=sqliteHashN
11070 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20  ext(pElem)){.   
11080 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73   Index *pIdx = s
11090 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45  qliteHashData(pE
110a0 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49  lem);.    if( pI
110b0 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20  dx->tnum==iFrom 
110c0 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74  ){.      pIdx->t
110d0 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d  num = iTo;.    }
110e0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
110f0 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20  *.** Write code 
11100 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62  to erase the tab
11110 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
11120 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61  e iTable from da
11130 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41  tabase iDb..** A
11140 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74  lso write code t
11150 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c  o modify the sql
11160 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
11170 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
11180 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f  hema.** if a roo
11190 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65  t-page of anothe
111a0 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64  r table is moved
111b0 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61   by the btree-la
111c0 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72  yer whilst.** er
111d0 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68  asing iTable (th
111e0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69  is can happen wi
111f0 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  th an auto-vacuu
11200 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20  m database)..*/ 
11210 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
11220 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72  troyRootPage(Par
11230 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
11240 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29  iTable, int iDb)
11250 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
11260 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
11270 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d  rse);.  int r1 =
11280 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
11290 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
112a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
112b0 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69  v, OP_Destroy, i
112c0 54 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b  Table, r1, iDb);
112d0 0a 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f  .  sqlite3MayAbo
112e0 72 74 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e  rt(pParse);.#ifn
112f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11300 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
11310 4f 50 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65  OP_Destroy store
11320 73 20 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20  s an in integer 
11330 72 31 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65  r1. If this inte
11340 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d  ger.  ** is non-
11350 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73  zero, then it is
11360 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
11370 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65  umber of a table
11380 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c   moved to.  ** l
11390 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20  ocation iTable. 
113a0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  The following co
113b0 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20  de modifies the 
113c0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
113d0 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c  ble to.  ** refl
113e0 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20  ect this..  **. 
113f0 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69   ** The "#NNN" i
11400 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73  n the SQL is a s
11410 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20  pecial constant 
11420 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65  that means whate
11430 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69  ver value.  ** i
11440 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e  s in register NN
11450 4e 2e 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20  N.  See grammar 
11460 72 75 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64  rules associated
11470 20 77 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47   with the TK_REG
11480 49 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e  ISTER.  ** token
11490 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
114a0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a  information..  *
114b0 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65  /.  sqlite3Neste
114c0 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a  dParse(pParse, .
114d0 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
114e0 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d  %s SET rootpage=
114f0 25 64 20 57 48 45 52 45 20 23 25 64 20 41 4e 44  %d WHERE #%d AND
11500 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a   rootpage=#%d",.
11510 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d       pParse->db-
11520 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
11530 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
11540 62 29 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20  b), iTable, r1, 
11550 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  r1);.#endif.  sq
11560 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
11570 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
11580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
11590 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61  VDBE code to era
115a0 73 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e  se table pTab an
115b0 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64  d all associated
115c0 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b   indices on disk
115d0 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64  ..** Code to upd
115e0 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ate the sqlite_m
115f0 61 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64  aster tables and
11600 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
11610 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20   definitions.** 
11620 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70  in case a root-p
11630 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
11640 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69   another table i
11650 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62  s moved by the b
11660 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73  tree layer.** is
11670 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69   also added (thi
11680 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
11690 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
116a0 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73   database)..*/.s
116b0 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
116c0 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  oyTable(Parse *p
116d0 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
116e0 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  ab){.#ifdef SQLI
116f0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
11700 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  UM.  Index *pIdx
11710 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71  ;.  int iDb = sq
11720 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
11730 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
11740 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
11750 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
11760 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74  (pParse, pTab->t
11770 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72  num, iDb);.  for
11780 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
11790 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
117a0 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
117b0 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
117c0 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74  (pParse, pIdx->t
117d0 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23  num, iDb);.  }.#
117e0 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65  else.  /* If the
117f0 20 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65   database may be
11800 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70   auto-vacuum cap
11810 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f  able (if SQLITE_
11820 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
11830 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69    ** is not defi
11840 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73  ned), then it is
11850 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61   important to ca
11860 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e  ll OP_Destroy on
11870 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20   the.  ** table 
11880 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70  and index root-p
11890 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73  ages in order, s
118a0 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
118b0 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20   numerically .  
118c0 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  ** largest root-
118d0 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69  page number. Thi
118e0 73 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  s guarantees tha
118f0 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  t none of the ro
11900 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f  ot-pages.  ** to
11910 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73   be destroyed is
11920 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e   relocated by an
11930 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74   earlier OP_Dest
11940 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65  roy. i.e. if the
11950 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  .  ** following 
11960 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a  were coded:.  **
11970 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
11980 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20   4 0.  ** ....  
11990 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20  ** OP_Destroy 5 
119a0 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20  0.  **.  ** and 
119b0 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70  root page 5 happ
119c0 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c  ened to be the l
119d0 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
119e0 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20   number in the. 
119f0 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
11a00 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77  en root page 5 w
11a10 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f  ould be moved to
11a20 20 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a   page 4 by the .
11a30 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79    ** "OP_Destroy
11a40 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68   4 0" opcode. Th
11a50 65 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50  e subsequent "OP
11a60 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f  _Destroy 5 0" wo
11a70 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66  uld hit.  ** a f
11a80 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20  ree-list page.. 
11a90 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
11aa0 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69   pTab->tnum;.  i
11ab0 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20  nt iDestroyed = 
11ac0 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29  0;..  while( 1 )
11ad0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
11ae0 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67  x;.    int iLarg
11af0 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  est = 0;..    if
11b00 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20  ( iDestroyed==0 
11b10 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79  || iTab<iDestroy
11b20 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72  ed ){.      iLar
11b30 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20  gest = iTab;.   
11b40 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d   }.    for(pIdx=
11b50 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
11b60 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
11b70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
11b80 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e   iIdx = pIdx->tn
11b90 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  um;.      assert
11ba0 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d  ( pIdx->pSchema=
11bb0 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
11bc0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65  ;.      if( (iDe
11bd0 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69  stroyed==0 || (i
11be0 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29  Idx<iDestroyed))
11bf0 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73   && iIdx>iLarges
11c00 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61  t ){.        iLa
11c10 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20  rgest = iIdx;.  
11c20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
11c30 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20  if( iLargest==0 
11c40 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  ){.      return;
11c50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
11c60 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
11c70 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
11c80 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
11c90 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
11ca0 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d     assert( iDb>=
11cb0 30 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d  0 && iDb<pParse-
11cc0 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  >db->nDb );.    
11cd0 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
11ce0 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
11cf0 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  st, iDb);.      
11d00 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61  iDestroyed = iLa
11d10 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  rgest;.    }.  }
11d20 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
11d30 20 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20   Remove entries 
11d40 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f  from the sqlite_
11d50 73 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f  statN tables (fo
11d60 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a  r N in (1,2,3)).
11d70 2a 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50 20  ** after a DROP 
11d80 49 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41  INDEX or DROP TA
11d90 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  BLE command..*/.
11da0 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
11db0 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
11dc0 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
11dd0 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
11de0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
11df0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ext */.  int iDb
11e00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
11e10 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
11e20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73  number */.  cons
11e30 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20  t char *zType,  
11e40 20 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22     /* "idx" or "
11e50 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tbl" */.  const 
11e60 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20  char *zName     
11e70 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65   /* Name of inde
11e80 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  x or table */.){
11e90 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
11ea0 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20  t char *zDbName 
11eb0 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  = pParse->db->aD
11ec0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
11ed0 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69  for(i=1; i<=4; i
11ee0 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54  ++){.    char zT
11ef0 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69  ab[24];.    sqli
11f00 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
11f10 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22  eof(zTab),zTab,"
11f20 73 71 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69  sqlite_stat%d",i
11f30 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
11f40 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72  e3FindTable(pPar
11f50 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44  se->db, zTab, zD
11f60 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  bName) ){.      
11f70 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
11f80 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
11f90 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
11fa0 25 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25  %Q.%s WHERE %s=%
11fb0 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e  Q",.        zDbN
11fc0 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65  ame, zTab, zType
11fd0 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  , zName.      );
11fe0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
11ff0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
12000 65 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c  e to drop a tabl
12010 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
12020 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28  e3CodeDropTable(
12030 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
12040 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20  able *pTab, int 
12050 69 44 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29  iDb, int isView)
12060 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  {.  Vdbe *v;.  s
12070 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
12080 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67  rse->db;.  Trigg
12090 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20  er *pTrigger;.  
120a0 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
120b0 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20  Db[iDb];..  v = 
120c0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
120d0 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74  Parse);.  assert
120e0 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( v!=0 );.  sqli
120f0 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
12100 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31  ration(pParse, 1
12110 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
12120 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
12130 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
12140 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
12150 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
12160 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56  beAddOp0(v, OP_V
12170 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64  Begin);.  }.#end
12180 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c  if..  /* Drop al
12190 6c 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63  l triggers assoc
121a0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74  iated with the t
121b0 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70  able being dropp
121c0 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73  ed. Code.  ** is
121d0 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65   generated to re
121e0 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f  move entries fro
121f0 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  m sqlite_master 
12200 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69  and/or.  ** sqli
12210 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69  te_temp_master i
12220 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f  f required..  */
12230 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71  .  pTrigger = sq
12240 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74  lite3TriggerList
12250 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
12260 20 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65    while( pTrigge
12270 72 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  r ){.    assert(
12280 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65   pTrigger->pSche
12290 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
122a0 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54  a || .        pT
122b0 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d  rigger->pSchema=
122c0 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  =db->aDb[1].pSch
122d0 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ema );.    sqlit
122e0 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72  e3DropTriggerPtr
122f0 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65  (pParse, pTrigge
12300 72 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72  r);.    pTrigger
12310 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65   = pTrigger->pNe
12320 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  xt;.  }..#ifndef
12330 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12340 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20  OINCREMENT.  /* 
12350 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69  Remove any entri
12360 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  es of the sqlite
12370 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
12380 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
12390 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62    ** the table b
123a0 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68  eing dropped. Th
123b0 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72  is is done befor
123c0 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64  e the table is d
123d0 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74  ropped.  ** at t
123e0 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20  he btree level, 
123f0 69 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69  in case the sqli
12400 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
12410 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20  e needs to.  ** 
12420 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74  move as a result
12430 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61   of the drop (ca
12440 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f  n happen in auto
12450 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20  -vacuum mode).. 
12460 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   */.  if( pTab->
12470 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
12480 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20  toincrement ){. 
12490 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
124a0 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
124b0 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
124c0 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65   %Q.sqlite_seque
124d0 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  nce WHERE name=%
124e0 51 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a  Q",.      pDb->z
124f0 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
12500 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e  e.    );.  }.#en
12510 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61  dif..  /* Drop a
12520 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  ll SQLITE_MASTER
12530 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
12540 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65   entries that re
12550 66 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  fer to the.  ** 
12560 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72  table. The progr
12570 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68  am name loops th
12580 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72  rough the master
12590 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74   table and delet
125a0 65 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f  es.  ** every ro
125b0 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  w that refers to
125c0 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20   a table of the 
125d0 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
125e0 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20   one being.  ** 
125f0 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72  dropped. Trigger
12600 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65  s are handled se
12610 70 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65  parately because
12620 20 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62   a trigger can b
12630 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69  e.  ** created i
12640 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  n the temp datab
12650 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20  ase that refers 
12660 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e  to a table in an
12670 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62  other.  ** datab
12680 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ase..  */.  sqli
12690 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
126a0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44  Parse, .      "D
126b0 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73  ELETE FROM %Q.%s
126c0 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d   WHERE tbl_name=
126d0 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72  %Q and type!='tr
126e0 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70  igger'",.      p
126f0 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db->zName, SCHEM
12700 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54  A_TABLE(iDb), pT
12710 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ab->zName);.  if
12720 28 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73  ( !isView && !Is
12730 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
12740 0a 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c  .    destroyTabl
12750 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b  e(pParse, pTab);
12760 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
12770 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  e the table entr
12780 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20  y from SQLite's 
12790 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
127a0 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20  and modify.  ** 
127b0 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
127c0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73  e..  */.  if( Is
127d0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
127e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
127f0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65  AddOp4(v, OP_VDe
12800 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30  stroy, iDb, 0, 0
12810 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
12820 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
12830 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
12840 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c  _DropTable, iDb,
12850 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61   0, 0, pTab->zNa
12860 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  me, 0);.  sqlite
12870 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
12880 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71  arse, iDb);.  sq
12890 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
128a0 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a  (db, iDb);.}../*
128b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
128c0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f   is called to do
128d0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44   the work of a D
128e0 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ROP TABLE statem
128f0 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73  ent..** pName is
12900 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
12910 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f   table to be dro
12920 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  pped..*/.void sq
12930 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50  lite3DropTable(P
12940 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
12950 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
12960 74 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f  t isView, int no
12970 45 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  Err){.  Table *p
12980 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  Tab;.  Vdbe *v;.
12990 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
129a0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
129b0 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62  t iDb;..  if( db
129c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
129d0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
129e0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
129f0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
12a00 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61  ->nErr==0 );.  a
12a10 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
12a20 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e  rc==1 );.  if( n
12a30 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72  oErr ) db->suppr
12a40 65 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54 61 62  essErr++;.  pTab
12a50 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
12a60 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
12a70 2c 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65  , isView, &pName
12a80 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e  ->a[0]);.  if( n
12a90 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72  oErr ) db->suppr
12aa0 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28  essErr--;..  if(
12ab0 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   pTab==0 ){.    
12ac0 69 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69  if( noErr ) sqli
12ad0 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d  te3CodeVerifyNam
12ae0 65 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  edSchema(pParse,
12af0 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
12b00 74 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74  tabase);.    got
12b10 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
12b20 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73  e;.  }.  iDb = s
12b30 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
12b40 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53  dex(db, pTab->pS
12b50 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74  chema);.  assert
12b60 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
12b70 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a  db->nDb );..  /*
12b80 20 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69   If pTab is a vi
12b90 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c  rtual table, cal
12ba0 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  l ViewGetColumnN
12bb0 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65  ames() to ensure
12bc0 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74  .  ** it is init
12bd0 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
12be0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
12bf0 61 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69  ab) && sqlite3Vi
12c00 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
12c10 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29  (pParse, pTab) )
12c20 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
12c30 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
12c40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12c50 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
12c60 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  N.  {.    int co
12c70 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  de;.    const ch
12c80 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d  ar *zTab = SCHEM
12c90 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20  A_TABLE(iDb);.  
12ca0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
12cb0 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
12cc0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73  .zName;.    cons
12cd0 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20  t char *zArg2 = 
12ce0 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
12cf0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
12d00 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
12d10 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
12d20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
12d30 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
12d40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56     }.    if( isV
12d50 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  iew ){.      if(
12d60 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
12d70 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
12d80 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
12d90 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b  _DROP_TEMP_VIEW;
12da0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12db0 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
12dc0 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20  ITE_DROP_VIEW;. 
12dd0 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
12de0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
12df0 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73  ALTABLE.    }els
12e00 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28  e if( IsVirtual(
12e10 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63  pTab) ){.      c
12e20 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
12e30 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  P_VTABLE;.      
12e40 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47  zArg2 = sqlite3G
12e50 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61  etVTable(db, pTa
12e60 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b  b)->pMod->zName;
12e70 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
12e80 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  e{.      if( !OM
12e90 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
12ea0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
12eb0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
12ec0 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  P_TEMP_TABLE;.  
12ed0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12ee0 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
12ef0 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _DROP_TABLE;.   
12f00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
12f10 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
12f20 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
12f30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
12f40 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Arg2, zDb) ){.  
12f50 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
12f60 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
12f70 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
12f80 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
12f90 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20   SQLITE_DELETE, 
12fa0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20  pTab->zName, 0, 
12fb0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
12fc0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
12fd0 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  le;.    }.  }.#e
12fe0 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74  ndif.  if( sqlit
12ff0 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
13000 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
13010 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26  ", 7)==0 .    &&
13020 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
13030 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
13040 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29  qlite_stat", 11)
13050 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
13060 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13070 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
13080 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22   not be dropped"
13090 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
130a0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
130b0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23  op_table;.  }..#
130c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
130d0 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73  IT_VIEW.  /* Ens
130e0 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69  ure DROP TABLE i
130f0 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20  s not used on a 
13100 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56  view, and DROP V
13110 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a  IEW is not used.
13120 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e    ** on a table.
13130 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69  .  */.  if( isVi
13140 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
13150 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ect==0 ){.    sq
13160 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13170 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
13180 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20  TABLE to delete 
13190 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d  table %s", pTab-
131a0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
131b0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
131c0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73  e;.  }.  if( !is
131d0 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
131e0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c  elect ){.    sql
131f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13200 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56  rse, "use DROP V
13210 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69  IEW to delete vi
13220 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  ew %s", pTab->zN
13230 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
13240 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
13250 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
13260 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
13270 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62  o remove the tab
13280 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  le from the mast
13290 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e  er table.  ** on
132a0 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20   disk..  */.  v 
132b0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
132c0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
132d0 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
132e0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
132f0 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
13300 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
13310 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28  ClearStatTables(
13320 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62  pParse, iDb, "tb
13330 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  l", pTab->zName)
13340 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44  ;.    sqlite3FkD
13350 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ropTable(pParse,
13360 20 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20   pName, pTab);. 
13370 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72     sqlite3CodeDr
13380 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
13390 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65  pTab, iDb, isVie
133a0 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72  w);.  }..exit_dr
133b0 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69  op_table:.  sqli
133c0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
133d0 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
133e0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
133f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
13400 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
13410 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
13420 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
13430 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
13440 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
13450 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
13460 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
13470 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
13480 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
13490 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
134a0 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
134b0 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
134c0 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
134d0 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
134e0 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
134f0 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
13500 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20  e referred to.  
13510 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74  pToCol is a list
13520 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
13530 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74  e other.** pTo t
13540 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f  able that the fo
13550 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73  reign key points
13560 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74   to.  flags cont
13570 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f  ains all.** info
13580 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
13590 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
135a0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
135b0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e   specified.** in
135c0 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20   the ON DELETE, 
135d0 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
135e0 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e   INSERT clauses.
135f0 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73  .**.** An FKey s
13600 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
13610 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f  ted and added to
13620 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
13630 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f  ntly.** under co
13640 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
13650 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
13660 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a  ble field..**.**
13670 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
13680 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45   is set for IMME
13690 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67  DIATE processing
136a0 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  .  A subsequent 
136b0 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  call.** to sqlit
136c0 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
136d0 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
136e0 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
136f0 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
13700 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b  e3CreateForeignK
13710 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
13720 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
13730 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
13740 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72  .  ExprList *pFr
13750 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d  omCol,  /* Colum
13760 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ns in this table
13770 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
13780 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
13790 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20  Token *pTo,     
137a0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
137b0 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
137c0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
137d0 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  ToCol,    /* Col
137e0 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65  umns in the othe
137f0 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  r table */.  int
13800 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
13810 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
13820 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
13830 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  hms. */.){.  sql
13840 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
13850 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  e->db;.#ifndef S
13860 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
13870 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70  GN_KEY.  FKey *p
13880 46 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79  FKey = 0;.  FKey
13890 20 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62   *pNextTo;.  Tab
138a0 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  le *p = pParse->
138b0 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74  pNewTable;.  int
138c0 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b   nByte;.  int i;
138d0 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63  .  int nCol;.  c
138e0 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72  har *z;..  asser
138f0 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69  t( pTo!=0 );.  i
13900 66 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45  f( p==0 || IN_DE
13910 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
13920 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20  o fk_end;.  if( 
13930 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
13940 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
13950 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28  >nCol-1;.    if(
13960 20 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29 20 29   NEVER(iCol<0) )
13970 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
13980 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20    if( pToCol && 
13990 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31  pToCol->nExpr!=1
139a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
139b0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
139c0 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  , "foreign key o
139d0 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22  n %s".         "
139e0 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63   should referenc
139f0 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d  e only one colum
13a00 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a  n of table %T",.
13a10 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c           p->aCol
13a20 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54  [iCol].zName, pT
13a30 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  o);.      goto f
13a40 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  k_end;.    }.   
13a50 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c   nCol = 1;.  }el
13a60 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26  se if( pToCol &&
13a70 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
13a80 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20  pFromCol->nExpr 
13a90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
13aa0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
13ab0 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f         "number o
13ac0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72  f columns in for
13ad0 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f  eign key does no
13ae0 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  t match the numb
13af0 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20  er of ".        
13b00 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20  "columns in the 
13b10 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
13b20 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ");.    goto fk_
13b30 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  end;.  }else{.  
13b40 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f    nCol = pFromCo
13b50 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20  l->nExpr;.  }.  
13b60 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
13b70 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31  pFKey) + (nCol-1
13b80 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e  )*sizeof(pFKey->
13b90 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e  aCol[0]) + pTo->
13ba0 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f  n + 1;.  if( pTo
13bb0 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
13bc0 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45  =0; i<pToCol->nE
13bd0 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
13be0 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
13bf0 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c  3Strlen30(pToCol
13c00 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20  ->a[i].zName) + 
13c10 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
13c20 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62  FKey = sqlite3Db
13c30 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
13c40 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46  Byte );.  if( pF
13c50 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  Key==0 ){.    go
13c60 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20  to fk_end;.  }. 
13c70 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20   pFKey->pFrom = 
13c80 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  p;.  pFKey->pNex
13c90 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79  tFrom = p->pFKey
13ca0 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26  ;.  z = (char*)&
13cb0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c  pFKey->aCol[nCol
13cc0 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20  ];.  pFKey->zTo 
13cd0 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  = z;.  memcpy(z,
13ce0 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29   pTo->z, pTo->n)
13cf0 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20  ;.  z[pTo->n] = 
13d00 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75  0;.  sqlite3Dequ
13d10 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70  ote(z);.  z += p
13d20 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79  To->n+1;.  pFKey
13d30 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
13d40 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
13d50 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61   ){.    pFKey->a
13d60 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70  Col[0].iFrom = p
13d70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73  ->nCol-1;.  }els
13d80 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
13d90 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
13da0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
13db0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
13dc0 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
13dd0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
13de0 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d  rICmp(p->aCol[j]
13df0 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c  .zName, pFromCol
13e00 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
13e10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
13e20 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72  Key->aCol[i].iFr
13e30 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  om = j;.        
13e40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
13e50 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
13e60 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20   if( j>=p->nCol 
13e70 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
13e80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13e90 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75  e, .          "u
13ea0 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22  nknown column \"
13eb0 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20  %s\" in foreign 
13ec0 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c  key definition",
13ed0 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f   .          pFro
13ee0 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
13ef0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
13f00 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  fk_end;.      }.
13f10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
13f20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
13f30 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
13f40 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
13f50 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
13f60 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  30(pToCol->a[i].
13f70 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
13f80 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
13f90 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
13fa0 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
13fb0 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
13fc0 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
13fd0 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
13fe0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
13ff0 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
14000 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69  ;.  pFKey->aActi
14010 6f 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c 61  on[0] = (u8)(fla
14020 67 73 20 26 20 30 78 66 66 29 3b 20 20 20 20 20  gs & 0xff);     
14030 20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c         /* ON DEL
14040 45 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ETE action */.  
14050 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31  pFKey->aAction[1
14060 5d 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20  ] = (u8)((flags 
14070 3e 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b 20  >> 8 ) & 0xff); 
14080 20 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20     /* ON UPDATE 
14090 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73  action */..  ass
140a0 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
140b0 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
140c0 30 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 20 29  0, p->pSchema) )
140d0 3b 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20 28 46  ;.  pNextTo = (F
140e0 4b 65 79 20 2a 29 73 71 6c 69 74 65 33 48 61 73  Key *)sqlite3Has
140f0 68 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68  hInsert(&p->pSch
14100 65 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a  ema->fkeyHash, .
14110 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f        pFKey->zTo
14120 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
14130 30 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2c 20 28  0(pFKey->zTo), (
14140 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29  void *)pFKey.  )
14150 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d  ;.  if( pNextTo=
14160 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 64 62  =pFKey ){.    db
14170 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
14180 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f   1;.    goto fk_
14190 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  end;.  }.  if( p
141a0 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73  NextTo ){.    as
141b0 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70  sert( pNextTo->p
141c0 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20  PrevTo==0 );.   
141d0 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20   pFKey->pNextTo 
141e0 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70  = pNextTo;.    p
141f0 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20  NextTo->pPrevTo 
14200 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20  = pFKey;.  }..  
14210 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65  /* Link the fore
14220 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74  ign key to the t
14230 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74  able as the last
14240 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d   step..  */.  p-
14250 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a  >pFKey = pFKey;.
14260 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b    pFKey = 0;..fk
14270 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44  _end:.  sqlite3D
14280 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29  bFree(db, pFKey)
14290 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ;.#endif /* !def
142a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
142b0 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f  _FOREIGN_KEY) */
142c0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
142d0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72  stDelete(db, pFr
142e0 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  omCol);.  sqlite
142f0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
14300 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a  db, pToCol);.}..
14310 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
14320 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
14330 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49  n an INITIALLY I
14340 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54  MMEDIATE or INIT
14350 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a  IALLY DEFERRED.*
14360 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e  * clause is seen
14370 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f   as part of a fo
14380 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
14390 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66  tion.  The isDef
143a0 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74  erred.** paramet
143b0 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54  er is 1 for INIT
143c0 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61  IALLY DEFERRED a
143d0 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c  nd 0 for INITIAL
143e0 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a  LY IMMEDIATE..**
143f0 20 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   The behavior of
14400 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
14410 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69  ly created forei
14420 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74  gn key is adjust
14430 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c  ed.** accordingl
14440 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
14450 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
14460 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
14470 20 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29   int isDeferred)
14480 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
14490 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
144a0 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  Y.  Table *pTab;
144b0 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a  .  FKey *pFKey;.
144c0 20 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50    if( (pTab = pP
144d0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
144e0 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20  ==0 || (pFKey = 
144f0 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20  pTab->pFKey)==0 
14500 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
14510 72 74 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d  rt( isDeferred==
14520 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d  0 || isDeferred=
14530 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33  =1 ); /* EV: R-3
14540 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20  0323-21917 */.  
14550 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65  pFKey->isDeferre
14560 64 20 3d 20 28 75 38 29 69 73 44 65 66 65 72 72  d = (u8)isDeferr
14570 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  ed;.#endif.}../*
14580 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
14590 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73  e that will eras
145a0 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64  e and refill ind
145b0 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20  ex *pIdx.  This 
145c0 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e  is.** used to in
145d0 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79  itialize a newly
145e0 20 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f   created index o
145f0 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74  r to recompute t
14600 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
14610 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73   an index in res
14620 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44  ponse to a REIND
14630 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
14640 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65  * if memRootPage
14650 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65   is not negative
14660 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
14670 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77  the index is new
14680 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20  ly.** created.  
14690 54 68 65 20 72 65 67 69 73 74 65 72 20 73 70 65  The register spe
146a0 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f  cified by memRoo
146b0 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74  tPage contains t
146c0 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
146d0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
146e0 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74  dex.  If memRoot
146f0 50 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65  Page is negative
14700 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e  , then.** the in
14710 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73  dex already exis
14720 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63  ts and must be c
14730 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65  leared before be
14740 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64  ing refilled and
14750 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67  .** the root pag
14760 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
14770 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66  index is taken f
14780 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  rom pIndex->tnum
14790 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
147a0 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
147b0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
147c0 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  e, Index *pIndex
147d0 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67  , int memRootPag
147e0 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  e){.  Table *pTa
147f0 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  b = pIndex->pTab
14800 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  le;  /* The tabl
14810 65 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65  e that is indexe
14820 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20  d */.  int iTab 
14830 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
14840 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
14850 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
14860 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  Tab */.  int iId
14870 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  x = pParse->nTab
14880 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ++;     /* Btree
14890 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
148a0 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74   pIndex */.  int
148b0 20 69 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20   iSorter;       
148c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
148d0 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20  ursor opened by 
148e0 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69  OpenSorter (if i
148f0 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20  n use) */.  int 
14900 61 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20  addr1;          
14910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
14920 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20  dress of top of 
14930 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64  loop */.  int ad
14940 64 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr2;            
14950 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
14960 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66  ess to jump to f
14970 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f  or next iteratio
14980 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b  n */.  int tnum;
14990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149a0 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
149b0 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  ge of index */. 
149c0 20 69 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62   int iPartIdxLab
149d0 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
149e0 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20  /* Jump to this 
149f0 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20  label to skip a 
14a00 72 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  row */.  Vdbe *v
14a10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14a20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
14a30 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
14a40 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
14a50 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  ne */.  KeyInfo 
14a60 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20  *pKey;          
14a70 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66         /* KeyInf
14a80 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  o for index */. 
14a90 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20   int regRecord; 
14aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ab0 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
14ac0 69 6e 67 20 61 73 73 65 6d 62 6c 69 65 64 20 69  ing assemblied i
14ad0 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
14ae0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
14af0 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
14b00 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
14b10 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
14b20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
14b30 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
14b40 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  b, pIndex->pSche
14b50 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
14b60 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
14b70 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71  IZATION.  if( sq
14b80 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
14b90 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
14ba0 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a  INDEX, pIndex->z
14bb0 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64  Name, 0,.      d
14bc0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
14bd0 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e ) ){.    retur
14be0 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
14bf0 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77 72   /* Require a wr
14c00 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
14c10 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d  table to perform
14c20 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
14c30 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  */.  sqlite3Tabl
14c40 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
14c50 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31  b, pTab->tnum, 1
14c60 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
14c70 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
14c80 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
14c90 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
14ca0 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f  rn;.  if( memRoo
14cb0 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  tPage>=0 ){.    
14cc0 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61  tnum = memRootPa
14cd0 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
14ce0 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e   tnum = pIndex->
14cf0 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79  tnum;.  }.  pKey
14d00 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b   = sqlite3IndexK
14d10 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70  eyinfo(pParse, p
14d20 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 4f 70  Index);..  /* Op
14d30 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63 75  en the sorter cu
14d40 72 73 6f 72 20 69 66 20 77 65 20 61 72 65 20 74  rsor if we are t
14d50 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20  o use one. */.  
14d60 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65  iSorter = pParse
14d70 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69  ->nTab++;.  sqli
14d80 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
14d90 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20   OP_SorterOpen, 
14da0 69 53 6f 72 74 65 72 2c 20 30 2c 20 30 2c 20 28  iSorter, 0, 0, (
14db0 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b  char*)pKey, P4_K
14dc0 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f 2a 20 4f  EYINFO);..  /* O
14dd0 70 65 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 4c  pen the table. L
14de0 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
14df0 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c  rows of the tabl
14e00 65 2c 20 69 6e 73 65 72 74 69 6e 67 20 69 6e 64  e, inserting ind
14e10 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72 64 73 20  ex.  ** records 
14e20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74 65 72 2e  into the sorter.
14e30 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4f 70 65   */.  sqlite3Ope
14e40 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
14e50 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Tab, iDb, pTab, 
14e60 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
14e70 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
14e80 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
14e90 52 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29  Rewind, iTab, 0)
14ea0 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20  ;.  regRecord = 
14eb0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
14ec0 67 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 73 71  g(pParse);..  sq
14ed0 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64  lite3GenerateInd
14ee0 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70 49  exKey(pParse, pI
14ef0 6e 64 65 78 2c 20 69 54 61 62 2c 20 72 65 67 52  ndex, iTab, regR
14f00 65 63 6f 72 64 2c 20 31 2c 20 26 69 50 61 72 74  ecord, 1, &iPart
14f10 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c  IdxLabel);.  sql
14f20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
14f30 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e 73 65 72  , OP_SorterInser
14f40 74 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52  t, iSorter, regR
14f50 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
14f60 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
14f70 6c 28 76 2c 20 69 50 61 72 74 49 64 78 4c 61 62  l(v, iPartIdxLab
14f80 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  el);.  sqlite3Vd
14f90 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
14fa0 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31  ext, iTab, addr1
14fb0 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +1);.  sqlite3Vd
14fc0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
14fd0 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52  dr1);.  if( memR
14fe0 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69  ootPage<0 ) sqli
14ff0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
15000 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c   OP_Clear, tnum,
15010 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33   iDb);.  sqlite3
15020 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
15030 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78  _OpenWrite, iIdx
15040 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20  , tnum, iDb, .  
15050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15060 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20    (char *)pKey, 
15070 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
15080 46 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  FF);.  sqlite3Vd
15090 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
150a0 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28 28 6d  FLAG_BULKCSR|((m
150b0 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29 3f 4f  emRootPage>=0)?O
150c0 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3a 30 29  PFLAG_P2ISREG:0)
150d0 29 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20 73 71  );..  addr1 = sq
150e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
150f0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74  v, OP_SorterSort
15100 2c 20 69 53 6f 72 74 65 72 2c 20 30 29 3b 0a 20  , iSorter, 0);. 
15110 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45   if( pIndex->onE
15120 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b  rror!=OE_None ){
15130 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d 20 73 71  .    int j2 = sq
15140 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
15150 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20 20 20  Addr(v) + 3;.   
15160 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15170 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
15180 2c 20 6a 32 29 3b 0a 20 20 20 20 61 64 64 72 32  , j2);.    addr2
15190 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
151a0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
151b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
151c0 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op3(v, OP_Sorter
151d0 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74 65 72  Compare, iSorter
151e0 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72 64 29  , j2, regRecord)
151f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 6c  ;.    sqlite3Hal
15200 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  tConstraint(pPar
15210 73 65 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  se, SQLITE_CONST
15220 52 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20  RAINT_UNIQUE,.  
15230 20 20 20 20 20 20 4f 45 5f 41 62 6f 72 74 2c 20        OE_Abort, 
15240 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73  "indexed columns
15250 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22   are not unique"
15260 2c 20 50 34 5f 53 54 41 54 49 43 0a 20 20 20 20  , P4_STATIC.    
15270 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
15280 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
15290 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
152a0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
152b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
152c0 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f  _SorterData, iSo
152d0 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29  rter, regRecord)
152e0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
152f0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp3(v, OP_IdxI
15300 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67  nsert, iIdx, reg
15310 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 73 71  Record, 1);.  sq
15320 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
15330 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
15340 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
15350 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
15360 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
15370 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
15380 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15390 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53  P_SorterNext, iS
153a0 6f 72 74 65 72 2c 20 61 64 64 72 32 29 3b 0a 20  orter, addr2);. 
153b0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
153c0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
153d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
153e0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
153f0 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74  , iTab);.  sqlit
15400 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
15410 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b  OP_Close, iIdx);
15420 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15430 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
15440 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f  , iSorter);.}../
15450 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68 65  *.** Allocate he
15460 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64  ap space to hold
15470 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   an Index object
15480 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d   with nCol colum
15490 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61  ns..**.** Increa
154a0 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  se the allocatio
154b0 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69 64  n size to provid
154c0 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74 72  e an extra nExtr
154d0 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38 2d  a bytes.** of 8-
154e0 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70 61  byte aligned spa
154f0 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64  ce after the Ind
15500 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65  ex object and re
15510 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65  turn a.** pointe
15520 72 20 74 6f 20 74 68 69 73 20 65 78 74 72 61 20  r to this extra 
15530 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74 72  space in *ppExtr
15540 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  a..*/.Index *sql
15550 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65  ite3AllocateInde
15560 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69 74  xObject(.  sqlit
15570 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
15580 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
15590 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20  ection */.  i16 
155a0 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
155b0 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
155c0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
155d0 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  he index */.  in
155e0 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
155f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
15600 62 79 74 65 73 20 6f 66 20 65 78 74 72 61 20 73  bytes of extra s
15610 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f  pace to alloc */
15620 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74 72  .  char **ppExtr
15630 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  a       /* Point
15640 65 72 20 74 6f 20 74 68 65 20 22 65 78 74 72 61  er to the "extra
15650 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20 20  " space */.){.  
15660 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20  Index *p;       
15670 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
15680 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  d index object *
15690 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
156a0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
156b0 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 49  s of space for I
156c0 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61 72  ndex object + ar
156d0 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74 65  rays */..  nByte
156e0 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
156f0 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20  (Index)) +      
15700 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
15710 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20   structure  */. 
15720 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28           ROUND8(
15730 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43  sizeof(char*)*nC
15740 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a  ol) +         /*
15750 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20   Index.azColl   
15760 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52    */.          R
15770 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 74 52 6f  OUND8(sizeof(tRo
15780 77 63 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b  wcnt)*(nCol+1) +
15790 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52      /* Index.aiR
157a0 6f 77 45 73 74 20 20 20 2a 2f 0a 20 20 20 20 20  owEst   */.     
157b0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
157c0 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 20 2b 20 20  of(i16)*nCol +  
157d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
157e0 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f  ex.aiColumn   */
157f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15800 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f    sizeof(u8)*nCo
15810 6c 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  l);             
15820 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72  /* Index.aSortOr
15830 64 65 72 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  der */.  p = sql
15840 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
15850 28 64 62 2c 20 6e 42 79 74 65 20 2b 20 6e 45 78  (db, nByte + nEx
15860 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  tra);.  if( p ){
15870 0a 20 20 20 20 63 68 61 72 20 2a 70 45 78 74 72  .    char *pExtr
15880 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29 2b 52  a = ((char*)p)+R
15890 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e 64  OUND8(sizeof(Ind
158a0 65 78 29 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 43  ex));.    p->azC
158b0 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 70 45  oll = (char**)pE
158c0 78 74 72 61 3b 20 20 20 20 20 20 70 45 78 74 72  xtra;      pExtr
158d0 61 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  a += ROUND8(size
158e0 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c 29 3b  of(char*)*nCol);
158f0 0a 20 20 20 20 70 2d 3e 61 69 52 6f 77 45 73 74  .    p->aiRowEst
15900 20 3d 20 28 74 52 6f 77 63 6e 74 2a 29 70 45 78   = (tRowcnt*)pEx
15910 74 72 61 3b 20 20 70 45 78 74 72 61 20 2b 3d 20  tra;  pExtra += 
15920 73 69 7a 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a  sizeof(tRowcnt)*
15930 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20 70 2d  (nCol+1);.    p-
15940 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36  >aiColumn = (i16
15950 2a 29 70 45 78 74 72 61 3b 20 20 20 20 20 20 70  *)pExtra;      p
15960 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
15970 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70  i16)*nCol;.    p
15980 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
15990 75 38 2a 29 70 45 78 74 72 61 3b 0a 20 20 20 20  u8*)pExtra;.    
159a0 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f  p->nColumn = nCo
159b0 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65 79 43 6f  l;.    p->nKeyCo
159c0 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20  l = nCol - 1;.  
159d0 20 20 2a 70 70 45 78 74 72 61 20 3d 20 28 28 63    *ppExtra = ((c
159e0 68 61 72 2a 29 70 29 20 2b 20 6e 42 79 74 65 3b  har*)p) + nByte;
159f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
15a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
15a10 20 61 20 6e 65 77 20 69 6e 64 65 78 20 66 6f 72   a new index for
15a20 20 61 6e 20 53 51 4c 20 74 61 62 6c 65 2e 20 20   an SQL table.  
15a30 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32 20 69 73  pName1.pName2 is
15a40 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
15a50 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e 64 20 70   index .** and p
15a60 54 62 6c 4c 69 73 74 20 69 73 20 74 68 65 20 6e  TblList is the n
15a70 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
15a80 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
15a90 6e 64 65 78 65 64 2e 20 20 42 6f 74 68 20 77 69  ndexed.  Both wi
15aa0 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c 4c 20 66  ll .** be NULL f
15ab0 6f 72 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79  or a primary key
15ac0 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 74 68 61   or an index tha
15ad0 74 20 69 73 20 63 72 65 61 74 65 64 20 74 6f 20  t is created to 
15ae0 73 61 74 69 73 66 79 20 61 0a 2a 2a 20 55 4e 49  satisfy a.** UNI
15af0 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
15b00 20 49 66 20 70 54 61 62 6c 65 20 61 6e 64 20 70   If pTable and p
15b10 49 6e 64 65 78 20 61 72 65 20 4e 55 4c 4c 2c 20  Index are NULL, 
15b20 75 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  use pParse->pNew
15b30 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74 68 65 20  Table.** as the 
15b40 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
15b50 78 65 64 2e 20 20 70 50 61 72 73 65 2d 3e 70 4e  xed.  pParse->pN
15b60 65 77 54 61 62 6c 65 20 69 73 20 61 20 74 61 62  ewTable is a tab
15b70 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 63 75  le that is.** cu
15b80 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f  rrently being co
15b90 6e 73 74 72 75 63 74 65 64 20 62 79 20 61 20 43  nstructed by a C
15ba0 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
15bb0 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69  ement..**.** pLi
15bc0 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
15bd0 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
15be0 64 65 78 65 64 2e 20 20 70 4c 69 73 74 20 77 69  dexed.  pList wi
15bf0 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66 20 74 68  ll be NULL if th
15c00 69 73 0a 2a 2a 20 69 73 20 61 20 70 72 69 6d 61  is.** is a prima
15c10 72 79 20 6b 65 79 20 6f 72 20 75 6e 69 71 75 65  ry key or unique
15c20 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 74  -constraint on t
15c30 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63  he most recent c
15c40 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a 2a 20 74  olumn added.** t
15c50 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
15c60 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
15c70 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a  truction.  .**.*
15c80 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 69  * If the index i
15c90 73 20 63 72 65 61 74 65 64 20 73 75 63 63 65 73  s created succes
15ca0 73 66 75 6c 6c 79 2c 20 72 65 74 75 72 6e 20 61  sfully, return a
15cb0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
15cc0 6e 65 77 20 49 6e 64 65 78 0a 2a 2a 20 73 74 72  new Index.** str
15cd0 75 63 74 75 72 65 2e 20 54 68 69 73 20 69 73 20  ucture. This is 
15ce0 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 41  used by sqlite3A
15cf0 64 64 50 72 69 6d 61 72 79 4b 65 79 28 29 20 74  ddPrimaryKey() t
15d00 6f 20 6d 61 72 6b 20 74 68 65 20 69 6e 64 65 78  o mark the index
15d10 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
15d20 73 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28 49  s primary key (I
15d30 6e 64 65 78 2e 61 75 74 6f 49 6e 64 65 78 3d 3d  ndex.autoIndex==
15d40 32 29 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  2)..*/.Index *sq
15d50 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
15d60 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
15d70 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e  e,     /* All in
15d80 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
15d90 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20  this parse */.  
15da0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
15db0 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74     /* First part
15dc0 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
15dd0 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
15de0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
15df0 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61      /* Second pa
15e00 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
15e10 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
15e20 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c  .  SrcList *pTbl
15e30 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74  Name, /* Table t
15e40 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61  o index. Use pPa
15e50 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
15e60 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  f 0 */.  ExprLis
15e70 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41  t *pList,   /* A
15e80 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
15e90 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a   to be indexed *
15ea0 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c  /.  int onError,
15eb0 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f         /* OE_Abo
15ec0 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f  rt, OE_Ignore, O
15ed0 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45  E_Replace, or OE
15ee0 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  _None */.  Token
15ef0 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a   *pStart,     /*
15f00 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65   The CREATE toke
15f10 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68  n that begins th
15f20 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  is statement */.
15f30 20 20 45 78 70 72 20 2a 70 50 49 57 68 65 72 65    Expr *pPIWhere
15f40 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c  ,    /* WHERE cl
15f50 61 75 73 65 20 66 6f 72 20 70 61 72 74 69 61 6c  ause for partial
15f60 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
15f70 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20  t sortOrder,    
15f80 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f   /* Sort order o
15f90 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68  f primary key wh
15fa0 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a  en pList==NULL *
15fb0 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69  /.  int ifNotExi
15fc0 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65  st     /* Omit e
15fd0 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c  rror if index al
15fe0 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
15ff0 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 52 65 74  ){.  Index *pRet
16000 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 6f 69   = 0;     /* Poi
16010 6e 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 2a  nter to return *
16020 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  /.  Table *pTab 
16030 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c  = 0;     /* Tabl
16040 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
16050 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
16060 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  ex = 0;   /* The
16070 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65   index to be cre
16080 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ated */.  char *
16090 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  zName = 0;     /
160a0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
160b0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  dex */.  int nNa
160c0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
160d0 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
160e0 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a  cters in zName *
160f0 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  /.  int i, j;.  
16100 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20 20  DbFixer sFix;   
16110 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69       /* For assi
16120 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e  gning database n
16130 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a  ames to pTable *
16140 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
16150 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f  rMask;   /* 1 to
16160 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69   honor DESC in i
16170 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f  ndex.  0 to igno
16180 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  re. */.  sqlite3
16190 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
161a0 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  b;.  Db *pDb;   
161b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
161c0 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65 20   specific table 
161d0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69  containing the i
161e0 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65 20  ndexed database 
161f0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
16200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
16210 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
16220 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  se that is being
16230 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f   written */.  To
16240 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20  ken *pName = 0; 
16250 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
16260 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  d name of the in
16270 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  dex to create */
16280 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
16290 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74  st_item *pListIt
162a0 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  em; /* For loopi
162b0 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f  ng over pList */
162c0 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20  .  const Column 
162d0 2a 70 54 61 62 43 6f 6c 3b 20 20 20 20 20 20 20  *pTabCol;       
162e0 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20      /* A column 
162f0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
16300 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30    int nExtra = 0
16310 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16320 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f     /* Space allo
16330 63 61 74 65 64 20 66 6f 72 20 7a 45 78 74 72 61  cated for zExtra
16340 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  [] */.  int nExt
16350 72 61 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  raCol;          
16360 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16370 65 72 20 6f 66 20 65 78 74 72 61 20 63 6f 6c 75  er of extra colu
16380 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20  mns needed */.  
16390 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 20 20 20  char *zExtra;   
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20   /* Extra space 
163c0 61 66 74 65 72 20 74 68 65 20 49 6e 64 65 78 20  after the Index 
163d0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65  object */.  Inde
163e0 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20 20  x *pPk = 0;     
163f0 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   /* PRIMARY KEY 
16400 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55  index for WITHOU
16410 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a  T ROWID tables *
16420 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
16430 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20  rse->nErr==0 ); 
16440 20 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61       /* Never ca
16450 6c 6c 65 64 20 77 69 74 68 20 70 72 69 6f 72 20  lled with prior 
16460 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 66 28 20  errors */.  if( 
16470 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
16480 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56   || IN_DECLARE_V
16490 54 41 42 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  TAB ){.    goto 
164a0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
164b0 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c  x;.  }.  if( SQL
164c0 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
164d0 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
164e0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
164f0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
16500 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
16510 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74  Find the table t
16520 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64  hat is to be ind
16530 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61  exed.  Return ea
16540 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  rly if not found
16550 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62  ..  */.  if( pTb
16560 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20  lName!=0 ){..   
16570 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d   /* Use the two-
16580 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20  part index name 
16590 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
165a0 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
165b0 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20  * to search for 
165c0 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27  the table. 'Fix'
165d0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
165e0 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a  to this db.    *
165f0 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67  * before looking
16600 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20   up the table.. 
16610 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
16620 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d  ( pName1 && pNam
16630 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20  e2 );.    iDb = 
16640 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
16650 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
16660 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
16670 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c  e);.    if( iDb<
16680 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
16690 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
166a0 61 73 73 65 72 74 28 20 70 4e 61 6d 65 20 26 26  assert( pName &&
166b0 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69   pName->z );..#i
166c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
166d0 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20  T_TEMPDB.    /* 
166e0 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  If the index nam
166f0 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65  e was unqualifie
16700 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65 20  d, check if the 
16710 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  table.    ** is 
16720 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66  a temp table. If
16730 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74   so, set the dat
16740 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e  abase to 1. Do n
16750 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a  ot do this.    *
16760 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e  * if initialisin
16770 67 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68  g a database sch
16780 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ema..    */.    
16790 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
167a0 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  sy ){.      pTab
167b0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
167c0 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  tLookup(pParse, 
167d0 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  pTblName);.     
167e0 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d   if( pName2->n==
167f0 30 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61  0 && pTab && pTa
16800 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  b->pSchema==db->
16810 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
16820 7b 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20  {.        iDb = 
16830 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
16840 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c  .#endif..    sql
16850 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
16860 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
16870 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b  "index", pName);
16880 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
16890 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78  FixSrcList(&sFix
168a0 2c 20 70 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20  , pTblName) ){. 
168b0 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65 20       /* Because 
168c0 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e 73 74  the parser const
168d0 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65 20 66  ructs pTblName f
168e0 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65  rom a single ide
168f0 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20 20 2a  ntifier,.      *
16900 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c  * sqlite3FixSrcL
16910 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20 66 61  ist can never fa
16920 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  il. */.      ass
16930 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ert(0);.    }.  
16940 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
16950 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28  LocateTableItem(
16960 70 50 61 72 73 65 2c 20 30 2c 20 26 70 54 62 6c  pParse, 0, &pTbl
16970 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20  Name->a[0]);.   
16980 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
16990 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20  locFailed==0 || 
169a0 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69  pTab==0 );.    i
169b0 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 6f 74  f( pTab==0 ) got
169c0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
169d0 64 65 78 3b 0a 20 20 20 20 69 66 28 20 69 44 62  dex;.    if( iDb
169e0 3d 3d 31 20 26 26 20 64 62 2d 3e 61 44 62 5b 69  ==1 && db->aDb[i
169f0 44 62 5d 2e 70 53 63 68 65 6d 61 21 3d 70 54 61  Db].pSchema!=pTa
16a00 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  b->pSchema ){.  
16a10 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
16a20 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
16a30 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
16a40 63 72 65 61 74 65 20 61 20 54 45 4d 50 20 69 6e  create a TEMP in
16a50 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20  dex on non-TEMP 
16a60 74 61 62 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20  table \"%s\"",. 
16a70 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
16a80 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
16a90 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
16aa0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
16ab0 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
16ac0 61 62 29 20 29 20 70 50 6b 20 3d 20 73 71 6c 69  ab) ) pPk = sqli
16ad0 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  te3PrimaryKeyInd
16ae0 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73  ex(pTab);.  }els
16af0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
16b00 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Name==0 );.    a
16b10 73 73 65 72 74 28 20 70 53 74 61 72 74 3d 3d 30  ssert( pStart==0
16b20 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70   );.    pTab = p
16b30 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
16b40 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20  ;.    if( !pTab 
16b50 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
16b60 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44  te_index;.    iD
16b70 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
16b80 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
16b90 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  b->pSchema);.  }
16ba0 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
16bb0 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72  b[iDb];..  asser
16bc0 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20  t( pTab!=0 );.  
16bd0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
16be0 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28  nErr==0 );.  if(
16bf0 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
16c00 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
16c10 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a  qlite_", 7)==0 .
16c20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
16c30 33 53 74 72 4e 49 43 6d 70 28 26 70 54 61 62 2d  3StrNICmp(&pTab-
16c40 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72  >zName[7],"alter
16c50 74 61 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20  tab_",9)!=0 ){. 
16c60 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
16c70 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
16c80 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
16c90 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e  indexed", pTab->
16ca0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    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 23 69 66 6e 64 65 66 20  ex;.  }.#ifndef 
16cd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
16ce0 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
16cf0 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
16d00 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
16d10 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e  se, "views may n
16d20 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
16d30 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
16d40 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
16d50 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
16d60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
16d70 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
16d80 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
16d90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
16da0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
16db0 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61  irtual tables ma
16dc0 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
16dd0 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ");.    goto exi
16de0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
16df0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
16e00 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  ** Find the n
16e10 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
16e20 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
16e30 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  re is not alread
16e40 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69  y another.  ** i
16e50 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69  ndex or table wi
16e60 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
16e70 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  .  .  **.  ** Ex
16e80 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20  ception:  If we 
16e90 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
16ea0 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65  names of permane
16eb0 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20  nt indices from 
16ec0 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  the.  ** sqlite_
16ed0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65  master table (be
16ee0 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72  cause some other
16ef0 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64   process changed
16f00 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64   the schema) and
16f10 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  .  ** one of the
16f20 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c   index names col
16f30 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e  lides with the n
16f40 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61  ame of a tempora
16f50 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a  ry table or.  **
16f60 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20   index, then we 
16f70 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
16f80 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e   process this in
16f90 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  dex..  **.  ** I
16fa0 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  f pName==0 it me
16fb0 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a  ans that we are.
16fc0 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74    ** dealing wit
16fd0 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  h a primary key 
16fe0 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
16ff0 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74  aint.  We have t
17000 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a  o invent our.  *
17010 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f  * own name..  */
17020 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
17030 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
17040 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
17050 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  (db, pName);.   
17060 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
17070 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
17080 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65  _index;.    asse
17090 72 74 28 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20  rt( pName->z!=0 
170a0 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
170b0 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
170c0 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
170d0 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  rse, zName) ){. 
170e0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
170f0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
17100 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e   }.    if( !db->
17110 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
17120 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
17130 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d  ndTable(db, zNam
17140 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  e, 0)!=0 ){.    
17150 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
17160 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
17170 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
17180 74 61 62 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c  table named %s",
17190 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
171a0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
171b0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
171c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
171d0 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
171e0 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e  db, zName, pDb->
171f0 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20  zName)!=0 ){.   
17200 20 20 20 69 66 28 20 21 69 66 4e 6f 74 45 78 69     if( !ifNotExi
17210 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  st ){.        sq
17220 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
17230 61 72 73 65 2c 20 22 69 6e 64 65 78 20 25 73 20  arse, "index %s 
17240 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22 2c  already exists",
17250 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d   zName);.      }
17260 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
17270 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
17280 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20  busy );.        
17290 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
172a0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
172b0 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iDb);.      }.  
172c0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
172d0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
172e0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  }.  }else{.    i
172f0 6e 74 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20  nt n;.    Index 
17300 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28  *pLoop;.    for(
17310 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64  pLoop=pTab->pInd
17320 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20  ex, n=1; pLoop; 
17330 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65  pLoop=pLoop->pNe
17340 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a  xt, n++){}.    z
17350 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50  Name = sqlite3MP
17360 72 69 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74  rintf(db, "sqlit
17370 65 5f 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25  e_autoindex_%s_%
17380 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  d", pTab->zName,
17390 20 6e 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61   n);.    if( zNa
173a0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  me==0 ){.      g
173b0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
173c0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
173d0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
173e0 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   authorization t
173f0 6f 20 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65  o create an inde
17400 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  x..  */.#ifndef 
17410 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
17420 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
17430 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
17440 62 20 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a  b = pDb->zName;.
17450 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41      if( sqlite3A
17460 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
17470 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20   SQLITE_INSERT, 
17480 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
17490 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  ), 0, zDb) ){.  
174a0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
174b0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
174c0 7d 0a 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45  }.    i = SQLITE
174d0 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20  _CREATE_INDEX;. 
174e0 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
174f0 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20  PDB && iDb==1 ) 
17500 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
17510 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20  E_TEMP_INDEX;.  
17520 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
17530 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69  hCheck(pParse, i
17540 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  , zName, pTab->z
17550 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
17560 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
17570 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
17580 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
17590 2f 2a 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20  /* If pList==0, 
175a0 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f  it means this ro
175b0 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64  utine was called
175c0 20 74 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61   to make a prima
175d0 72 79 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20  ry.  ** key out 
175e0 6f 66 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  of the last colu
175f0 6d 6e 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  mn added to the 
17600 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
17610 74 72 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53  truction..  ** S
17620 6f 20 63 72 65 61 74 65 20 61 20 66 61 6b 65 20  o create a fake 
17630 6c 69 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65  list to simulate
17640 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66   this..  */.  if
17650 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
17660 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
17670 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
17680 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20  pParse, 0, 0);. 
17690 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
176a0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
176b0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 4c  te_index;.    pL
176c0 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 20  ist->a[0].zName 
176d0 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
176e0 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  p(pParse->db,.  
176f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17710 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c        pTab->aCol
17720 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d 2e 7a  [pTab->nCol-1].z
17730 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74  Name);.    pList
17740 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
17750 20 3d 20 28 75 38 29 73 6f 72 74 4f 72 64 65 72   = (u8)sortOrder
17760 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75  ;.  }..  /* Figu
17770 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
17780 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
17790 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73  re required to s
177a0 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a  tore explicitly.
177b0 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63    ** specified c
177c0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
177d0 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20  e names..  */.  
177e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
177f0 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
17800 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
17810 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
17820 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  pr;.    if( pExp
17830 72 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  r ){.      asser
17840 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
17850 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20  _COLLATE );.    
17860 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b    nExtra += (1 +
17870 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
17880 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  (pExpr->u.zToken
17890 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ));.    }.  }.. 
178a0 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61   /* .  ** Alloca
178b0 74 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72  te the index str
178c0 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20  ucture. .  */.  
178d0 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
178e0 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
178f0 20 20 6e 45 78 74 72 61 43 6f 6c 20 3d 20 70 50    nExtraCol = pP
17900 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c  k ? pPk->nKeyCol
17910 20 3a 20 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d   : 1;.  pIndex =
17920 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65   sqlite3Allocate
17930 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20  IndexObject(db, 
17940 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e  pList->nExpr + n
17950 45 78 74 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20  ExtraCol,.      
17960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17980 6e 4e 61 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b  nName + nExtra +
17990 20 31 2c 20 26 7a 45 78 74 72 61 29 3b 0a 20 20   1, &zExtra);.  
179a0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
179b0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
179c0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
179d0 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ex;.  }.  assert
179e0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
179f0 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61  GNMENT(pIndex->a
17a00 69 52 6f 77 45 73 74 29 20 29 3b 0a 20 20 61 73  iRowEst) );.  as
17a10 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
17a20 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65  _ALIGNMENT(pInde
17a30 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20  x->azColl) );.  
17a40 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20  pIndex->zName = 
17a50 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
17a60 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20   += nName + 1;. 
17a70 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e   memcpy(pIndex->
17a80 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  zName, zName, nN
17a90 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78  ame+1);.  pIndex
17aa0 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b  ->pTable = pTab;
17ab0 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  .  pIndex->onErr
17ac0 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  or = (u8)onError
17ad0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71  ;.  pIndex->uniq
17ae0 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f  NotNull = onErro
17af0 72 3d 3d 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70  r==OE_Abort;.  p
17b00 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78  Index->autoIndex
17b10 20 3d 20 28 75 38 29 28 70 4e 61 6d 65 3d 3d 30   = (u8)(pName==0
17b20 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63  );.  pIndex->pSc
17b30 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
17b40 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 69  Db].pSchema;.  i
17b50 66 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20  f( pPIWhere ){. 
17b60 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
17b70 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
17b80 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f  Parse, pTab, NC_
17b90 50 61 72 74 49 64 78 2c 20 70 50 49 57 68 65 72  PartIdx, pPIWher
17ba0 65 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65  e, 0);.    pInde
17bb0 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
17bc0 20 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20   = pPIWhere;.   
17bd0 20 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20   pPIWhere = 0;. 
17be0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
17bf0 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
17c00 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
17c10 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
17c20 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75  o see if we shou
17c30 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65  ld honor DESC re
17c40 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20  quests on index 
17c50 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
17c60 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
17c70 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
17c80 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  ){.    sortOrder
17c90 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20  Mask = -1;   /* 
17ca0 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20  Honor DESC */.  
17cb0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f  }else{.    sortO
17cc0 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20  rderMask = 0;   
17cd0 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20   /* Ignore DESC 
17ce0 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61  */.  }..  /* Sca
17cf0 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  n the names of t
17d00 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
17d10 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e  e table to be in
17d20 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c  dexed and.  ** l
17d30 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  oad the column i
17d40 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20  ndices into the 
17d50 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e  Index structure.
17d60 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
17d70 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f  r.  ** if any co
17d80 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e  lumn is not foun
17d90 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  d..  **.  ** TOD
17da0 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74 20 74  O:  Add a test t
17db0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
17dc0 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e   the same column
17dd0 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20   is not named.  
17de0 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  ** more than onc
17df0 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  e within the sam
17e00 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74  e index.  Only t
17e10 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63  he first instanc
17e20 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  e of.  ** the co
17e30 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20 62  lumn will ever b
17e40 65 20 75 73 65 64 20 62 79 20 74 68 65 20 6f 70  e used by the op
17e50 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74  timizer.  Note t
17e60 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  hat using the.  
17e70 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d  ** same column m
17e80 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 63 61  ore than once ca
17e90 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72 72 6f 72  nnot be an error
17ea0 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
17eb0 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65 61 6b 20  uld .  ** break 
17ec0 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
17ed0 69 62 69 6c 69 74 79 20 2d 20 69 74 20 6e 65 65  ibility - it nee
17ee0 64 73 20 74 6f 20 62 65 20 61 20 77 61 72 6e 69  ds to be a warni
17ef0 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ng..  */.  for(i
17f00 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c  =0, pListItem=pL
17f10 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
17f20 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69  >nExpr; i++, pLi
17f30 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63  stItem++){.    c
17f40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e  onst char *zColN
17f50 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  ame = pListItem-
17f60 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20  >zName;.    int 
17f70 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
17f80 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43  er;.    char *zC
17f90 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  oll;            
17fa0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
17fb0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
17fc0 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d  e */..    for(j=
17fd0 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d  0, pTabCol=pTab-
17fe0 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e  >aCol; j<pTab->n
17ff0 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f  Col; j++, pTabCo
18000 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l++){.      if( 
18010 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
18020 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c  ColName, pTabCol
18030 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ->zName)==0 ) br
18040 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
18050 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c  f( j>=pTab->nCol
18060 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18070 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
18080 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20  , "table %s has 
18090 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20  no column named 
180a0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
180b0 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61  b->zName, zColNa
180c0 6d 65 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  me);.      pPars
180d0 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
180e0 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   1;.      goto e
180f0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18100 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
18110 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 3d  rt( pTab->nCol<=
18120 30 78 37 66 66 66 20 26 26 20 6a 3c 3d 30 78 37  0x7fff && j<=0x7
18130 66 66 66 20 29 3b 0a 20 20 20 20 70 49 6e 64 65  fff );.    pInde
18140 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
18150 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 69 66 28   (i16)j;.    if(
18160 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
18170 72 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  r ){.      int n
18180 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 61 73 73 65  Coll;.      asse
18190 72 74 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  rt( pListItem->p
181a0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
181b0 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 7a 43  LATE );.      zC
181c0 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d  oll = pListItem-
181d0 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pExpr->u.zToken
181e0 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c 20 3d 20  ;.      nColl = 
181f0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
18200 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20 20 20 20  zColl) + 1;.    
18210 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61    assert( nExtra
18220 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20  >=nColl );.     
18230 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
18240 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29 3b 0a 20  zColl, nColl);. 
18250 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78       zColl = zEx
18260 74 72 61 3b 0a 20 20 20 20 20 20 7a 45 78 74 72  tra;.      zExtr
18270 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20  a += nColl;.    
18280 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e 43 6f 6c    nExtra -= nCol
18290 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
182a0 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62      zColl = pTab
182b0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[j].zColl;
182c0 0a 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6c  .      if( !zCol
182d0 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42 49 4e  l ) zColl = "BIN
182e0 41 52 59 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ARY";.    }.    
182f0 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
18300 73 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c 6f  sy && !sqlite3Lo
18310 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
18320 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  se, zColl) ){.  
18330 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
18340 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
18350 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a  }.    pIndex->az
18360 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b  Coll[i] = zColl;
18370 0a 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f  .    requestedSo
18380 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49  rtOrder = pListI
18390 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26  tem->sortOrder &
183a0 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a   sortOrderMask;.
183b0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72      pIndex->aSor
183c0 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29  tOrder[i] = (u8)
183d0 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
183e0 65 72 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  er;.    if( pTab
183f0 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c  ->aCol[j].notNul
18400 6c 3d 3d 30 20 29 20 70 49 6e 64 65 78 2d 3e 75  l==0 ) pIndex->u
18410 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a  niqNotNull = 0;.
18420 20 20 7d 0a 20 20 69 66 28 20 70 50 6b 20 29 7b    }.  if( pPk ){
18430 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
18440 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b  pPk->nKeyCol; j+
18450 2b 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  +, i++){.      p
18460 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
18470 69 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75  i] = pPk->aiColu
18480 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 70 49 6e  mn[j];.      pIn
18490 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
184a0 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b   pPk->azColl[j];
184b0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  .      pIndex->a
184c0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
184d0 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  Pk->aSortOrder[j
184e0 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  ];.    }.  }else
184f0 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69  {.    pIndex->ai
18500 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 2d 31 3b 0a  Column[i] = -1;.
18510 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
18520 6c 6c 5b 69 5d 20 3d 20 22 42 49 4e 41 52 59 22  ll[i] = "BINARY"
18530 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
18540 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e  efaultRowEst(pIn
18550 64 65 78 29 3b 0a 20 20 69 66 28 20 70 50 61 72  dex);.  if( pPar
18560 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30  se->pNewTable==0
18570 20 29 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78   ) estimateIndex
18580 57 69 64 74 68 28 70 49 6e 64 65 78 29 3b 0a 0a  Width(pIndex);..
18590 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
185a0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
185b0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75  .    /* This rou
185c0 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61  tine has been ca
185d0 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
185e0 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
185f0 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65  x as a.    ** re
18600 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52  sult of a PRIMAR
18610 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
18620 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75  clause on a colu
18630 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f  mn definition, o
18640 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41  r.    ** a PRIMA
18650 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
18660 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e   clause followin
18670 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66  g the column def
18680 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  initions..    **
18690 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20   i.e. one of:.  
186a0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41    **.    ** CREA
186b0 54 45 20 54 41 42 4c 45 20 74 28 78 20 50 52 49  TE TABLE t(x PRI
186c0 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20  MARY KEY, y);.  
186d0 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
186e0 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45  E t(x, y, UNIQUE
186f0 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a  (x, y));.    **.
18700 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61      ** Either wa
18710 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  y, check to see 
18720 69 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72  if the table alr
18730 65 61 64 79 20 68 61 73 20 73 75 63 68 20 61 6e  eady has such an
18740 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a   index. If.    *
18750 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68  * so, don't both
18760 65 72 20 63 72 65 61 74 69 6e 67 20 74 68 69 73  er creating this
18770 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20   one. This only 
18780 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a  applies to.    *
18790 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
187a0 63 72 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e  created indices.
187b0 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73   Users can do as
187c0 20 74 68 65 79 20 77 69 73 68 20 77 69 74 68 0a   they wish with.
187d0 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20      ** explicit 
187e0 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2a 0a  indices..    **.
187f0 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49 51 55      ** Two UNIQU
18800 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59  E or PRIMARY KEY
18810 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
18820 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 69   considered equi
18830 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20 28 61  valent.    ** (a
18840 6e 64 20 74 68 75 73 20 73 75 70 70 72 65 73 73  nd thus suppress
18850 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  ing the second o
18860 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68 65 79  ne) even if they
18870 20 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a   have different.
18880 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72 64 65      ** sort orde
18890 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rs..    **.    *
188a0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
188b0 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61 74 69  ifferent collati
188c0 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20  ng sequences or 
188d0 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  if the columns o
188e0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6e  f.    ** the con
188f0 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20 69 6e  straint occur in
18900 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
18910 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73  s, then the cons
18920 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20 20 20  traints are.    
18930 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 64 69  ** considered di
18940 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74 68 20  stinct and both 
18950 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61 72 61  result in separa
18960 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20  te indices..    
18970 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  */.    Index *pI
18980 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78  dx;.    for(pIdx
18990 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
189a0 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
189b0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
189c0 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t k;.      asser
189d0 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  t( pIdx->onError
189e0 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20  !=OE_None );.   
189f0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
18a00 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20  >autoIndex );.  
18a10 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
18a20 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
18a30 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69  None );..      i
18a40 66 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  f( pIdx->nKeyCol
18a50 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  !=pIndex->nKeyCo
18a60 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
18a70 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
18a80 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6b 2b  Idx->nKeyCol; k+
18a90 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
18aa0 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20 20 20  t char *z1;.    
18ab0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
18ac0 7a 32 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z2;.        if( 
18ad0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
18ae0 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  ]!=pIndex->aiCol
18af0 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a  umn[k] ) break;.
18b00 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64          z1 = pId
18b10 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
18b20 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65        z2 = pInde
18b30 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
18b40 20 20 20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32        if( z1!=z2
18b50 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
18b60 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65  mp(z1, z2) ) bre
18b70 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
18b80 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e    if( k==pIdx->n
18b90 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
18ba0 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
18bb0 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45  ror!=pIndex->onE
18bc0 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
18bd0 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72    /* This constr
18be0 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65  aint creates the
18bf0 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61   same index as a
18c00 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
18c10 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
18c20 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  t specified some
18c30 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45  where in the CRE
18c40 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
18c50 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
18c60 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e  * However the ON
18c70 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
18c80 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  s are different.
18c90 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20   If both this . 
18ca0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
18cb0 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70  traint and the p
18cc0 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65  revious equivale
18cd0 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  nt constraint ha
18ce0 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20  ve explicit.    
18cf0 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46        ** ON CONF
18d00 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69  LICT clauses thi
18d10 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f  s is an error. O
18d20 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
18d30 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  e.          ** e
18d40 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
18d50 69 65 64 20 62 65 68 61 76 69 6f 72 20 66 6f 72  ied behavior for
18d60 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
18d70 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
18d80 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f     if( !(pIdx->o
18d90 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
18da0 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e  lt || pIndex->on
18db0 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
18dc0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
18dd0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
18de0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
18df0 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66             "conf
18e00 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c  licting ON CONFL
18e10 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63  ICT clauses spec
18e20 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  ified", 0);.    
18e30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18e40 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
18e50 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
18e60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
18e70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70  Idx->onError = p
18e80 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a  Index->onError;.
18e90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
18ea0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f      }.        go
18eb0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18ec0 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
18ed0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69    }.  }..  /* Li
18ee0 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78  nk the new Index
18ef0 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
18f00 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74  s table and to t
18f10 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e  he other.  ** in
18f20 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
18f30 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20   structures. .  
18f40 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
18f50 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e  t.busy ){.    In
18f60 64 65 78 20 2a 70 3b 0a 20 20 20 20 61 73 73 65  dex *p;.    asse
18f70 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
18f80 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
18f90 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
18fa0 61 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71  a) );.    p = sq
18fb0 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
18fc0 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61  &pIndex->pSchema
18fd0 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20  ->idxHash, .    
18fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ff0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
19000 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ame, sqlite3Strl
19010 65 6e 33 30 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  en30(pIndex->zNa
19020 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me),.           
19030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19040 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
19050 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
19060 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20  t( p==pIndex ); 
19070 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
19080 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
19090 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
190a0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
190b0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
190c0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
190d0 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
190e0 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
190f0 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54  nges;.    if( pT
19100 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
19110 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
19120 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
19130 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  um;.    }.  }.. 
19140 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
19150 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68  nit.busy is 0 th
19160 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e  en create the in
19170 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68  dex on disk.  Th
19180 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73  is.  ** involves
19190 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64   writing the ind
191a0 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74  ex into the mast
191b0 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c  er table and fil
191c0 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a  ling in the.  **
191d0 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20   index with the 
191e0 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f  current table co
191f0 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a  ntents..  **.  *
19200 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  * The db->init.b
19210 75 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68  usy is 0 when th
19220 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74  e user first ent
19230 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44  ers a CREATE IND
19240 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  EX .  ** command
19250 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  .  db->init.busy
19260 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74   is 1 when a dat
19270 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20  abase is opened 
19280 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45  and .  ** CREATE
19290 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
192a0 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f  s are read out o
192b0 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  f the master tab
192c0 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65  le.  In.  ** the
192d0 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65   latter case the
192e0 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
192f0 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77  xists on disk, w
19300 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a  hich is why.  **
19310 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
19320 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20  o recreate it.. 
19330 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c   **.  ** If pTbl
19340 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
19350 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
19360 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72  enerated as a pr
19370 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f  imary key.  ** o
19380 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
19390 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20  int of a CREATE 
193a0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
193b0 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
193c0 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20  e.  ** has just 
193d0 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
193e0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
193f0 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
19400 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
19410 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
19420 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
19430 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d  else if( pParse-
19440 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20  >nErr==0 ){.    
19450 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61  Vdbe *v;.    cha
19460 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e  r *zStmt;.    in
19470 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73  t iMem = ++pPars
19480 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20  e->nMem;..    v 
19490 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
194a0 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66  (pParse);.    if
194b0 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ( v==0 ) goto ex
194c0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
194d0 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ...    /* Create
194e0 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f   the rootpage fo
194f0 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  r the index.    
19500 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  */.    sqlite3Be
19510 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
19520 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
19530 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
19540 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
19550 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c  reateIndex, iDb,
19560 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20   iMem);..    /* 
19570 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c  Gather the compl
19580 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20  ete text of the 
19590 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
195a0 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20  tement into.    
195b0 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72  ** the zStmt var
195c0 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20  iable.    */.   
195d0 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
195e0 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e       int n = (in
195f0 74 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74  t)(pParse->sLast
19600 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d  Token.z - pName-
19610 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c  >z) + pParse->sL
19620 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20  astToken.n;.    
19630 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e    if( pName->z[n
19640 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a  -1]==';' ) n--;.
19650 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64        /* A named
19660 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65   index with an e
19670 78 70 6c 69 63 69 74 20 43 52 45 41 54 45 20 49  xplicit CREATE I
19680 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a  NDEX statement *
19690 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  /.      zStmt = 
196a0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
196b0 62 2c 20 22 43 52 45 41 54 45 25 73 20 49 4e 44  b, "CREATE%s IND
196c0 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20  EX %.*s",.      
196d0 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f    onError==OE_No
196e0 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51  ne ? "" : " UNIQ
196f0 55 45 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a  UE", n, pName->z
19700 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
19710 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61      /* An automa
19720 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65  tic index create
19730 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b  d by a PRIMARY K
19740 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  EY or UNIQUE con
19750 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
19760 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69   /* zStmt = sqli
19770 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20  te3MPrintf(""); 
19780 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  */.      zStmt =
19790 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
197a0 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69  * Add an entry i
197b0 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  n sqlite_master 
197c0 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20  for this index. 
197d0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
197e0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
197f0 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49  rse, .        "I
19800 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73  NSERT INTO %Q.%s
19810 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c   VALUES('index',
19820 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c  %Q,%Q,#%d,%Q);",
19830 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  .        db->aDb
19840 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
19850 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
19860 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
19870 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70  zName,.        p
19880 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
19890 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20      iMem,.      
198a0 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20    zStmt.    );. 
198b0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
198c0 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20  (db, zStmt);..  
198d0 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e    /* Fill the in
198e0 64 65 78 20 77 69 74 68 20 64 61 74 61 20 61 6e  dex with data an
198f0 64 20 72 65 70 61 72 73 65 20 74 68 65 20 73 63  d reparse the sc
19900 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50  hema. Code an OP
19910 5f 45 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74  _Expire.    ** t
19920 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  o invalidate all
19930 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74   pre-compiled st
19940 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f  atements..    */
19950 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  .    if( pTblNam
19960 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
19970 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50  e3RefillIndex(pP
19980 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d  arse, pIndex, iM
19990 65 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  em);.      sqlit
199a0 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
199b0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
199c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
199d0 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76  dParseSchemaOp(v
199e0 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20  , iDb,.         
199f0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
19a00 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e  b, "name='%q' AN
19a10 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c  D type='index'",
19a20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29   pIndex->zName))
19a30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
19a40 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
19a50 45 78 70 69 72 65 2c 20 30 29 3b 0a 20 20 20 20  Expire, 0);.    
19a60 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  }.  }..  /* When
19a70 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78   adding an index
19a80 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
19a90 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61  indices for a ta
19aa0 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  ble, make.  ** s
19ab0 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ure all indices 
19ac0 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61  labeled OE_Repla
19ad0 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c  ce come after al
19ae0 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a  l those labeled.
19af0 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20    ** OE_Ignore. 
19b00 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
19b10 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ry for the corre
19b20 63 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68  ct constraint ch
19b30 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  eck.  ** process
19b40 69 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47  ing (in sqlite3G
19b50 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e  enerateConstrain
19b60 74 43 68 65 63 6b 73 28 29 29 20 61 73 20 70 61  tChecks()) as pa
19b70 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54  rt of.  ** UPDAT
19b80 45 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61  E and INSERT sta
19b90 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a  tements.  .  */.
19ba0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
19bb0 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d  usy || pTblName=
19bc0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e  =0 ){.    if( on
19bd0 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
19be0 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
19bf0 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  x==0.         ||
19c00 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
19c10 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
19c20 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  ce){.      pInde
19c30 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
19c40 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70  >pIndex;.      p
19c50 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
19c60 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ndex;.    }else{
19c70 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  .      Index *pO
19c80 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
19c90 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  dex;.      while
19ca0 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20  ( pOther->pNext 
19cb0 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  && pOther->pNext
19cc0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ->onError!=OE_Re
19cd0 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  place ){.       
19ce0 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
19cf0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
19d00 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
19d10 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
19d20 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68  Next;.      pOth
19d30 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
19d40 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52  ex;.    }.    pR
19d50 65 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  et = pIndex;.   
19d60 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d   pIndex = 0;.  }
19d70 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
19d80 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
19d90 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  /.exit_create_in
19da0 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65  dex:.  if( pInde
19db0 78 20 29 20 66 72 65 65 49 6e 64 65 78 28 64 62  x ) freeIndex(db
19dc0 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c  , pIndex);.  sql
19dd0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
19de0 62 2c 20 70 50 49 57 68 65 72 65 29 3b 0a 20 20  b, pPIWhere);.  
19df0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
19e00 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
19e10 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  ;.  sqlite3SrcLi
19e20 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62  stDelete(db, pTb
19e30 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  lName);.  sqlite
19e40 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
19e50 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  e);.  return pRe
19e60 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c  t;.}../*.** Fill
19e70 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77   the Index.aiRow
19e80 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68  Est[] array with
19e90 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61   default informa
19ea0 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69  tion - informati
19eb0 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64  on.** to be used
19ec0 20 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f   when we have no
19ed0 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a  t run the ANALYZ
19ee0 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  E command..**.**
19ef0 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20   aiRowEst[0] is 
19f00 73 75 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61  suppose to conta
19f10 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
19f20 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
19f30 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65   index..** Since
19f40 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c   we do not know,
19f50 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e   guess 1 million
19f60 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69  .  aiRowEst[1] i
19f70 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
19f80 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
19f90 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
19fa0 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20 61  ble that match a
19fb0 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 76 61  ny particular va
19fc0 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  lue of the.** fi
19fd0 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  rst column of th
19fe0 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45  e index.  aiRowE
19ff0 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69  st[2] is an esti
1a000 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62  mate of the numb
1a010 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68  er.** of rows th
1a020 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72  at match any par
1a030 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61  ticular combinia
1a040 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73  tion of the firs
1a050 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f  t 2 columns.** o
1a060 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e  f the index.  An
1a070 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20  d so forth.  It 
1a080 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20 74  must always be t
1a090 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a  he case that.*.*
1a0a0 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f  *           aiRo
1a0b0 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73  wEst[N]<=aiRowEs
1a0c0 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20  t[N-1].**       
1a0d0 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e      aiRowEst[N]>
1a0e0 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66  =1.**.** Apart f
1a0f0 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76  rom that, we hav
1a100 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f  e little to go o
1a110 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75 69 74  n besides intuit
1a120 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77  ion as to.** how
1a130 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75   aiRowEst[] shou
1a140 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ld be initialize
1a150 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20  d.  The numbers 
1a160 67 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a  generated here.*
1a170 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74  * are based on t
1a180 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f  ypical values fo
1a190 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e  und in actual in
1a1a0 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dices..*/.void s
1a1b0 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
1a1c0 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29  Est(Index *pIdx)
1a1d0 7b 0a 20 20 74 52 6f 77 63 6e 74 20 2a 61 20 3d  {.  tRowcnt *a =
1a1e0 20 70 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b   pIdx->aiRowEst;
1a1f0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 74 52 6f 77  .  int i;.  tRow
1a200 63 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28  cnt n;.  assert(
1a210 20 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20   a!=0 );.  a[0] 
1a220 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1a230 6e 52 6f 77 45 73 74 3b 0a 20 20 69 66 28 20 61  nRowEst;.  if( a
1a240 5b 30 5d 3c 31 30 20 29 20 61 5b 30 5d 20 3d 20  [0]<10 ) a[0] = 
1a250 31 30 3b 0a 20 20 6e 20 3d 20 31 30 3b 0a 20 20  10;.  n = 10;.  
1a260 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 49 64 78  for(i=1; i<=pIdx
1a270 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b  ->nKeyCol; i++){
1a280 0a 20 20 20 20 61 5b 69 5d 20 3d 20 6e 3b 0a 20  .    a[i] = n;. 
1a290 20 20 20 69 66 28 20 6e 3e 35 20 29 20 6e 2d 2d     if( n>5 ) n--
1a2a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78  ;.  }.  if( pIdx
1a2b0 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
1a2c0 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70 49 64 78  ne ){.    a[pIdx
1a2d0 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20 31 3b 0a  ->nKeyCol] = 1;.
1a2e0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
1a2f0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
1a300 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
1a310 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
1a320 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
1a330 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
1a340 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
1a350 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1a360 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  e3DropIndex(Pars
1a370 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
1a380 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
1a390 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65  fExists){.  Inde
1a3a0 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62  x *pIndex;.  Vdb
1a3b0 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
1a3c0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1a3d0 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
1a3e0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1a3f0 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  nErr==0 );   /* 
1a400 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  Never called wit
1a410 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a  h prior errors *
1a420 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
1a430 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
1a440 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1a450 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
1a460 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
1a470 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  =1 );.  if( SQLI
1a480 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
1a490 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
1a4a0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
1a4b0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1a4c0 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
1a4d0 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
1a4e0 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
1a4f0 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
1a500 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
1a510 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
1a520 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74      if( !ifExist
1a530 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
1a540 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1a550 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
1a560 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30  x: %S", pName, 0
1a570 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1a580 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
1a590 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61  erifyNamedSchema
1a5a0 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e  (pParse, pName->
1a5b0 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
1a5c0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
1a5d0 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
1a5e0 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   1;.    goto exi
1a5f0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1a600 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  }.  if( pIndex->
1a610 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20  autoIndex ){.   
1a620 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
1a630 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
1a640 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1a650 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22  UNIQUE ".      "
1a660 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
1a670 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
1a680 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29   be dropped", 0)
1a690 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
1a6a0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
1a6b0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
1a6c0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
1a6d0 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
1a6e0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1a6f0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
1a700 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
1a710 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
1a720 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
1a730 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
1a740 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
1a750 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1a760 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1a770 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
1a780 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
1a790 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b  HEMA_TABLE(iDb);
1a7a0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1a7b0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1a7c0 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
1a7d0 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
1a7e0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
1a7f0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1a800 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49    }.    if( !OMI
1a810 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 20  T_TEMPDB && iDb 
1a820 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  ) code = SQLITE_
1a830 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  DROP_TEMP_INDEX;
1a840 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1a850 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1a860 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e  , code, pIndex->
1a870 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
1a880 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
1a890 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
1a8a0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
1a8b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
1a8c0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1a8d0 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
1a8e0 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61   and from the ma
1a8f0 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
1a900 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1a910 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1a920 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1a930 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
1a940 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
1a950 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
1a960 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
1a970 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45  arse,.       "DE
1a980 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
1a990 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e  WHERE name=%Q AN
1a9a0 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c  D type='index'",
1a9b0 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  .       db->aDb[
1a9c0 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
1a9d0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70  MA_TABLE(iDb), p
1a9e0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20  Index->zName.   
1a9f0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   );.    sqlite3C
1aa00 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
1aa10 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78  Parse, iDb, "idx
1aa20 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
1aa30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
1aa40 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
1aa50 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73  e, iDb);.    des
1aa60 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61  troyRootPage(pPa
1aa70 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75  rse, pIndex->tnu
1aa80 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  m, iDb);.    sql
1aa90 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1aaa0 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20  , OP_DropIndex, 
1aab0 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65  iDb, 0, 0, pInde
1aac0 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  x->zName, 0);.  
1aad0 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  }..exit_drop_ind
1aae0 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63  ex:.  sqlite3Src
1aaf0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1ab00 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Name);.}../*.** 
1ab10 70 41 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e  pArray is a poin
1ab20 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20  ter to an array 
1ab30 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68  of objects. Each
1ab40 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a   object in the.*
1ab50 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74  * array is szEnt
1ab60 72 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ry bytes in size
1ab70 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  . This routine u
1ab80 73 65 73 20 73 71 6c 69 74 65 33 44 62 52 65 61  ses sqlite3DbRea
1ab90 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74  lloc().** to ext
1aba0 65 6e 64 20 74 68 65 20 61 72 72 61 79 20 73 6f  end the array so
1abb0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73   that there is s
1abc0 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f  pace for a new o
1abd0 62 6a 65 63 74 20 61 74 20 74 68 65 20 65 6e 64  bject at the end
1abe0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
1abf0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1ac00 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63  lled, *pnEntry c
1ac10 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75 72 72  ontains the curr
1ac20 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  ent size of.** t
1ac30 68 65 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74  he array (in ent
1ac40 72 69 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c  ries - so the al
1ac50 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70  location is ((*p
1ac60 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72  nEntry) * szEntr
1ac70 79 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74  y) bytes.** in t
1ac80 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  otal)..**.** If 
1ac90 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73  the realloc() is
1aca0 20 73 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65   successful (i.e
1acb0 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64  . if no OOM cond
1acc0 69 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74  ition occurs), t
1acd0 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f  he.** space allo
1ace0 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65  cated for the ne
1acf0 77 20 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f  w object is zero
1ad00 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64  ed, *pnEntry upd
1ad10 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65  ated to.** refle
1ad20 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20  ct the new size 
1ad30 6f 66 20 74 68 65 20 61 72 72 61 79 20 61 6e 64  of the array and
1ad40 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1ad50 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e  e new allocation
1ad60 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70  .** returned. *p
1ad70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  Idx is set to th
1ad80 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
1ad90 65 77 20 61 72 72 61 79 20 65 6e 74 72 79 20 69  ew array entry i
1ada0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
1adb0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
1adc0 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66   the realloc() f
1add0 61 69 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73  ails, *pIdx is s
1ade0 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74  et to -1, *pnEnt
1adf0 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e  ry remains.** un
1ae00 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f  changed and a co
1ae10 70 79 20 6f 66 20 70 41 72 72 61 79 20 72 65 74  py of pArray ret
1ae20 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  urned..*/.void *
1ae30 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
1ae40 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20  cate(.  sqlite3 
1ae50 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e  *db,      /* Con
1ae60 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
1ae70 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y of malloc fail
1ae80 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ures */.  void *
1ae90 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41  pArray,     /* A
1aea0 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e  rray of objects.
1aeb0 20 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c    Might be reall
1aec0 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ocated */.  int 
1aed0 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a  szEntry,      /*
1aee0 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62   Size of each ob
1aef0 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61  ject in the arra
1af00 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e  y */.  int *pnEn
1af10 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62  try,     /* Numb
1af20 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75  er of objects cu
1af30 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a  rrently in use *
1af40 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20  /.  int *pIdx   
1af50 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1af60 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65  he index of a ne
1af70 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29  w slot here */.)
1af80 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  {.  char *z;.  i
1af90 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b  nt n = *pnEntry;
1afa0 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31  .  if( (n & (n-1
1afb0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))==0 ){.    int
1afc0 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31   sz = (n==0) ? 1
1afd0 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64   : 2*n;.    void
1afe0 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
1aff0 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41  DbRealloc(db, pA
1b000 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79  rray, sz*szEntry
1b010 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
1b020 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64  =0 ){.      *pId
1b030 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  x = -1;.      re
1b040 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20  turn pArray;.   
1b050 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20   }.    pArray = 
1b060 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  pNew;.  }.  z = 
1b070 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20  (char*)pArray;. 
1b080 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73   memset(&z[n * s
1b090 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
1b0a0 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  try);.  *pIdx = 
1b0b0 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b  n;.  ++*pnEntry;
1b0c0 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79  .  return pArray
1b0d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1b0e0 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
1b0f0 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c  to the given IdL
1b100 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
1b110 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20  ew IdList if.** 
1b120 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41  need be..**.** A
1b130 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72   new IdList is r
1b140 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
1b150 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69   if malloc() fai
1b160 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73  ls..*/.IdList *s
1b170 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
1b180 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nd(sqlite3 *db, 
1b190 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  IdList *pList, T
1b1a0 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
1b1b0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c   int i;.  if( pL
1b1c0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
1b1d0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
1b1e0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
1b1f0 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a  zeof(IdList) );.
1b200 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
1b210 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
1b220 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71  .  pList->a = sq
1b230 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
1b240 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20  te(.      db,.  
1b250 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20      pList->a,.  
1b260 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74      sizeof(pList
1b270 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26  ->a[0]),.      &
1b280 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20  pList->nId,.    
1b290 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20    &i.  );.  if( 
1b2a0 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  i<0 ){.    sqlit
1b2b0 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1b2c0 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  b, pList);.    r
1b2d0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1b2e0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1b2f0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1b300 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b  omToken(db, pTok
1b310 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  en);.  return pL
1b320 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ist;.}../*.** De
1b330 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a  lete an IdList..
1b340 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49  */.void sqlite3I
1b350 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69  dListDelete(sqli
1b360 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
1b370 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1b380 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
1b390 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
1b3a0 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
1b3b0 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  Id; i++){.    sq
1b3c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1b3d0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1b3e0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
1b3f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1b400 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  t->a);.  sqlite3
1b410 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
1b420 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
1b430 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  rn the index in 
1b440 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64 65  pList of the ide
1b450 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49  ntifier named zI
1b460 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a  d.  Return -1.**
1b470 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
1b480 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c  /.int sqlite3IdL
1b490 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20  istIndex(IdList 
1b4a0 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68  *pList, const ch
1b4b0 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
1b4c0 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
1b4d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
1b4e0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
1b4f0 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  ist->nId; i++){.
1b500 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1b510 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
1b520 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29  i].zName, zName)
1b530 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
1b540 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
1b550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64  .}../*.** Expand
1b560 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63   the space alloc
1b570 61 74 65 64 20 66 6f 72 20 74 68 65 20 67 69 76  ated for the giv
1b580 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63  en SrcList objec
1b590 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67  t by.** creating
1b5a0 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74   nExtra new slot
1b5b0 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69  s beginning at i
1b5c0 53 74 61 72 74 2e 20 20 69 53 74 61 72 74 20 69  Start.  iStart i
1b5d0 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a  s zero based..**
1b5e0 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a   New slots are z
1b5f0 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  eroed..**.** For
1b600 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73   example, suppos
1b610 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74  e a SrcList init
1b620 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74  ially contains t
1b630 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e  wo entries: A,B.
1b640 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20  .** To append 3 
1b650 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f  new entries onto
1b660 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69   the end, do thi
1b670 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69  s:.**.**    sqli
1b680 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1b690 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20  e(db, pSrclist, 
1b6a0 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74  3, 2);.**.** Aft
1b6b0 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  er the call abov
1b6c0 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61  e it would conta
1b6d0 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20  in:  A, B, nil, 
1b6e0 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20  nil, nil..** If 
1b6f0 74 68 65 20 69 53 74 61 72 74 20 61 72 67 75 6d  the iStart argum
1b700 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20 69  ent had been 1 i
1b710 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65  nstead of 2, the
1b720 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  n the result.** 
1b730 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a  would have been:
1b740 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e    A, nil, nil, n
1b750 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65  il, B.  To prepe
1b760 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73  nd the new slots
1b770 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20  ,.** the iStart 
1b780 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30  value would be 0
1b790 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74 68  .  The result th
1b7a0 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20  en would.** be: 
1b7b0 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41  nil, nil, nil, A
1b7c0 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  , B..**.** If a 
1b7d0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1b7e0 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72 63 4c  n fails the SrcL
1b7f0 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ist is unchanged
1b800 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61  .  The.** db->ma
1b810 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
1b820 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74  will be set to t
1b830 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  rue..*/.SrcList 
1b840 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45  *sqlite3SrcListE
1b850 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74 65  nlarge(.  sqlite
1b860 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20  3 *db,       /* 
1b870 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
1b880 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66  ion to notify of
1b890 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20   OOM errors */. 
1b8a0 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
1b8b0 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69      /* The SrcLi
1b8c0 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65  st to be enlarge
1b8d0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  d */.  int nExtr
1b8e0 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  a,        /* Num
1b8f0 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73  ber of new slots
1b900 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d   to add to pSrc-
1b910 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53  >a[] */.  int iS
1b920 74 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20  tart         /* 
1b930 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61  Index in pSrc->a
1b940 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20  [] of first new 
1b950 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  slot */.){.  int
1b960 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79   i;..  /* Sanity
1b970 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c   checking on cal
1b980 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  ling parameters 
1b990 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  */.  assert( iSt
1b9a0 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  art>=0 );.  asse
1b9b0 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b  rt( nExtra>=1 );
1b9c0 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 21  .  assert( pSrc!
1b9d0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1b9e0 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53  iStart<=pSrc->nS
1b9f0 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  rc );..  /* Allo
1ba00 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  cate additional 
1ba10 73 70 61 63 65 20 69 66 20 6e 65 65 64 65 64 20  space if needed 
1ba20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e  */.  if( pSrc->n
1ba30 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d  Src+nExtra>pSrc-
1ba40 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53  >nAlloc ){.    S
1ba50 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
1ba60 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70    int nAlloc = p
1ba70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61  Src->nSrc+nExtra
1ba80 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a  ;.    int nGot;.
1ba90 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
1baa0 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
1bab0 70 53 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  pSrc,.          
1bac0 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72       sizeof(*pSr
1bad0 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a  c) + (nAlloc-1)*
1bae0 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1baf0 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  ]) );.    if( pN
1bb00 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ew==0 ){.      a
1bb10 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
1bb20 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
1bb30 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20   return pSrc;.  
1bb40 20 20 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70    }.    pSrc = p
1bb50 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20  New;.    nGot = 
1bb60 28 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  (sqlite3DbMalloc
1bb70 53 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d  Size(db, pNew) -
1bb80 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f   sizeof(*pSrc))/
1bb90 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1bba0 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e  ])+1;.    pSrc->
1bbb0 6e 41 6c 6c 6f 63 20 3d 20 28 75 38 29 6e 47 6f  nAlloc = (u8)nGo
1bbc0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76  t;.  }..  /* Mov
1bbd0 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73  e existing slots
1bbe0 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72   that come after
1bbf0 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72   the newly inser
1bc00 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f  ted slots.  ** o
1bc10 75 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f  ut of the way */
1bc20 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e  .  for(i=pSrc->n
1bc30 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74  Src-1; i>=iStart
1bc40 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63  ; i--){.    pSrc
1bc50 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20  ->a[i+nExtra] = 
1bc60 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a  pSrc->a[i];.  }.
1bc70 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20    pSrc->nSrc += 
1bc80 28 69 38 29 6e 45 78 74 72 61 3b 0a 0a 20 20 2f  (i8)nExtra;..  /
1bc90 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79  * Zero the newly
1bca0 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73   allocated slots
1bcb0 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53   */.  memset(&pS
1bcc0 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30  rc->a[iStart], 0
1bcd0 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61  , sizeof(pSrc->a
1bce0 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20  [0])*nExtra);.  
1bcf0 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c  for(i=iStart; i<
1bd00 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69  iStart+nExtra; i
1bd10 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61  ++){.    pSrc->a
1bd20 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [i].iCursor = -1
1bd30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75  ;.  }..  /* Retu
1bd40 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1bd50 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63  the enlarged Src
1bd60 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e  List */.  return
1bd70 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   pSrc;.}.../*.**
1bd80 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61   Append a new ta
1bd90 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20  ble name to the 
1bda0 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20  given SrcList.  
1bdb0 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63  Create a new Src
1bdc0 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
1bdd0 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  be.  A new entry
1bde0 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74   is created in t
1bdf0 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20  he SrcList even 
1be00 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c  if pTable is NUL
1be10 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69  L..**.** A SrcLi
1be20 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
1be30 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  or NULL if there
1be40 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   is an OOM error
1be50 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a  .  The returned.
1be60 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  ** SrcList might
1be70 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
1be80 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
1be90 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74   was input or it
1bea0 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e   might be.** a n
1beb0 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f  ew one.  If an O
1bec0 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  OM error does oc
1bed0 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70  curs, then the p
1bee0 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c  rior value of pL
1bef0 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69  ist.** that is i
1bf00 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
1bf10 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69  tine is automati
1bf20 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a  cally freed..**.
1bf30 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20  ** If pDatabase 
1bf40 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20  is not null, it 
1bf50 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74  means that the t
1bf60 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69  able has an opti
1bf70 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  onal.** database
1bf80 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c   name prefix.  L
1bf90 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61  ike this:  "data
1bfa0 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68  base.table".  Th
1bfb0 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70  e pDatabase.** p
1bfc0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62  oints to the tab
1bfd0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
1bfe0 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  pTable points to
1bff0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1c000 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  me..** The SrcLi
1c010 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65  st.a[].zName fie
1c020 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ld is filled wit
1c030 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
1c040 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20   which might.** 
1c050 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  come from pTable
1c060 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69   (if pDatabase i
1c070 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20  s NULL) or from 
1c080 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20  pDatabase.  .** 
1c090 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74  SrcList.a[].zDat
1c0a0 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20  abase is filled 
1c0b0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
1c0c0 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62  e name from pTab
1c0d0 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e  le,.** or with N
1c0e0 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61  ULL if no databa
1c0f0 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e  se is specified.
1c100 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
1c110 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c  words, if call l
1c120 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1c130 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1c140 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
1c150 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,0);.**.** The
1c160 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e  n B is a table n
1c170 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
1c180 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73  base name is uns
1c190 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61  pecified.  If ca
1c1a0 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69  lled.** like thi
1c1b0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1c1c0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
1c1d0 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a  ppend(D,A,B,C);.
1c1e0 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20  **.** Then C is 
1c1f0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
1c200 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61  nd B is the data
1c210 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43  base name.  If C
1c220 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74   is defined.** t
1c230 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e  hen so is B.  In
1c240 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65   other words, we
1c250 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 63 61   never have a ca
1c260 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20  se where:.**.** 
1c270 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1c280 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
1c290 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74  ,0,C);.**.** Bot
1c2a0 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61  h pTable and pDa
1c2b0 74 61 62 61 73 65 20 61 72 65 20 61 73 73 75 6d  tabase are assum
1c2c0 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e  ed to be quoted.
1c2d0 20 20 54 68 65 79 20 61 72 65 20 64 65 71 75 6f    They are dequo
1c2e0 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65  ted.** before be
1c2f0 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65  ing added to the
1c300 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63   SrcList..*/.Src
1c310 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
1c320 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71  ListAppend(.  sq
1c330 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1c340 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1c350 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c  to notify of mal
1c360 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a  loc failures */.
1c370 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74    SrcList *pList
1c380 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ,     /* Append 
1c390 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e  to this SrcList.
1c3a0 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20   NULL creates a 
1c3b0 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20  new SrcList */. 
1c3c0 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
1c3d0 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
1c3e0 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b   append */.  Tok
1c3f0 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20  en *pDatabase   
1c400 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20   /* Database of 
1c410 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  the table */.){.
1c420 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1c430 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1c440 61 73 73 65 72 74 28 20 70 44 61 74 61 62 61 73  assert( pDatabas
1c450 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d  e==0 || pTable!=
1c460 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20  0 );  /* Cannot 
1c470 68 61 76 65 20 43 20 77 69 74 68 6f 75 74 20 42  have C without B
1c480 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
1c490 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
1c4a0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
1c4b0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
1c4c0 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20  (SrcList) );.   
1c4d0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1c4e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c  return 0;.    pL
1c4f0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b  ist->nAlloc = 1;
1c500 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73  .  }.  pList = s
1c510 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
1c520 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20  arge(db, pList, 
1c530 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b  1, pList->nSrc);
1c540 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1c550 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
1c560 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1c570 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
1c580 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1c590 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69  }.  pItem = &pLi
1c5a0 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
1c5b0 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74  c-1];.  if( pDat
1c5c0 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61  abase && pDataba
1c5d0 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  se->z==0 ){.    
1c5e0 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  pDatabase = 0;. 
1c5f0 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
1c600 73 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20  se ){.    Token 
1c610 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61  *pTemp = pDataba
1c620 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73  se;.    pDatabas
1c630 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20  e = pTable;.    
1c640 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a  pTable = pTemp;.
1c650 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61    }.  pItem->zNa
1c660 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
1c670 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
1c680 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e  able);.  pItem->
1c690 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
1c6a0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1c6b0 28 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b  (db, pDatabase);
1c6c0 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
1c6d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
1c6e0 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65   VdbeCursor inde
1c6f0 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c  x numbers to all
1c700 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63   tables in a Src
1c710 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  List.*/.void sql
1c720 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
1c730 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a  nCursors(Parse *
1c740 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
1c750 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
1c760 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1c770 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1c780 20 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c    assert(pList |
1c790 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
1c7a0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
1c7b0 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
1c7c0 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
1c7d0 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73  pList->a; i<pLis
1c7e0 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
1c7f0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  tem++){.      if
1c800 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  ( pItem->iCursor
1c810 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  >=0 ) break;.   
1c820 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f     pItem->iCurso
1c830 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
1c840 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ++;.      if( pI
1c850 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  tem->pSelect ){.
1c860 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
1c870 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
1c880 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65  ors(pParse, pIte
1c890 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63  m->pSelect->pSrc
1c8a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1c8b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
1c8c0 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53  lete an entire S
1c8d0 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67  rcList including
1c8e0 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75   all its substru
1c8f0 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cture..*/.void s
1c900 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1c910 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
1c920 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29   SrcList *pList)
1c930 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
1c940 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1c950 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
1c960 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1c970 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
1c980 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70  ist->a, i=0; i<p
1c990 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
1c9a0 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
1c9b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1c9c0 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
1c9d0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
1c9e0 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
1c9f0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  >zName);.    sql
1ca00 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1ca10 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20  Item->zAlias);. 
1ca20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1ca30 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64  (db, pItem->zInd
1ca40 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ex);.    sqlite3
1ca50 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
1ca60 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
1ca70 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1ca80 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
1ca90 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
1caa0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1cab0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29  (db, pItem->pOn)
1cac0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
1cad0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  istDelete(db, pI
1cae0 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
1caf0 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
1cb00 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
1cb10 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1cb20 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
1cb30 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61   the parser to a
1cb40 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  dd a new term to
1cb50 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61   the.** end of a
1cb60 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c   growing FROM cl
1cb70 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70  ause.  The "p" p
1cb80 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
1cb90 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46  part of.** the F
1cba0 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20  ROM clause that 
1cbb0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1cbc0 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22   constructed.  "
1cbd0 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66  p" is NULL.** if
1cbe0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1cbf0 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  st term of the F
1cc00 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61  ROM clause.  pTa
1cc10 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
1cc20 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d  e.** are the nam
1cc30 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  e of the table a
1cc40 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  nd database name
1cc50 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
1cc60 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44  ause term..** pD
1cc70 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20  atabase is NULL 
1cc80 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1cc90 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69  name qualifier i
1cca0 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a  s missing - the.
1ccb0 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20  ** usual case.  
1ccc0 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20  If the term has 
1ccd0 61 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41  a alias, then pA
1cce0 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74  lias points to t
1ccf0 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65  he.** alias toke
1cd00 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  n.  If the term 
1cd10 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74  is a subquery, t
1cd20 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69 73  hen pSubquery is
1cd30 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73   the.** SELECT s
1cd40 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68  tatement that th
1cd50 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64  e subquery encod
1cd60 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20  es.  The pTable 
1cd70 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  and.** pDatabase
1cd80 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
1cd90 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72  NULL for subquer
1cda0 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e  ies.  The pOn an
1cdb0 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61  d pUsing.** para
1cdc0 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20 63  meters are the c
1cdd0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e  ontent of the ON
1cde0 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1cdf0 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  es..**.** Return
1ce00 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77   a new SrcList w
1ce10 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20  hich encodes is 
1ce20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68  the FROM with th
1ce30 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64  e new.** term ad
1ce40 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ded..*/.SrcList 
1ce50 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
1ce60 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20  ppendFromTerm(. 
1ce70 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1ce80 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1ce90 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1cea0 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20   SrcList *p,    
1ceb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1cec0 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68 65  left part of the
1ced0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72   FROM clause alr
1cee0 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54  eady seen */.  T
1cef0 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
1cf00 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1cf10 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61  f the table to a
1cf20 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63  dd to the FROM c
1cf30 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  lause */.  Token
1cf40 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20 20   *pDatabase,    
1cf50 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1cf60 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
1cf70 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a  ining pTable */.
1cf80 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c    Token *pAlias,
1cf90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1cfa0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
1cfb0 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65 78   of the AS subex
1cfc0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65  pression */.  Se
1cfd0 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c  lect *pSubquery,
1cfe0 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75        /* A subqu
1cff0 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63  ery used in plac
1d000 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d  e of a table nam
1d010 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e  e */.  Expr *pOn
1d020 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1d030 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  * The ON clause 
1d040 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49  of a join */.  I
1d050 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20  dList *pUsing   
1d060 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53         /* The US
1d070 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
1d080 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  join */.){.  str
1d090 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1d0a0 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
1d0b0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1d0c0 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26  >db;.  if( !p &&
1d0d0 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29   (pOn || pUsing)
1d0e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1d0f0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1d100 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69  "a JOIN clause i
1d110 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  s required befor
1d120 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70  e %s", .      (p
1d130 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49  On ? "ON" : "USI
1d140 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  NG").    );.    
1d150 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
1d160 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20  _error;.  }.  p 
1d170 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1d180 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54  Append(db, p, pT
1d190 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29  able, pDatabase)
1d1a0 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
1d1b0 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30  NEVER(p->nSrc==0
1d1c0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70  ) ){.    goto ap
1d1d0 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b  pend_from_error;
1d1e0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
1d1f0 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
1d200 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c 69 61  .  assert( pAlia
1d210 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41  s!=0 );.  if( pA
1d220 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70  lias->n ){.    p
1d230 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
1d240 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1d250 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b  ken(db, pAlias);
1d260 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53  .  }.  pItem->pS
1d270 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72  elect = pSubquer
1d280 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20  y;.  pItem->pOn 
1d290 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e  = pOn;.  pItem->
1d2a0 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b  pUsing = pUsing;
1d2b0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61  .  return p;.. a
1d2c0 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1d2d0 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  :.  assert( p==0
1d2e0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
1d2f0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29  rDelete(db, pOn)
1d300 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
1d310 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69  tDelete(db, pUsi
1d320 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ng);.  sqlite3Se
1d330 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1d340 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74  Subquery);.  ret
1d350 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1d360 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42  Add an INDEXED B
1d370 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44  Y or NOT INDEXED
1d380 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d   clause to the m
1d390 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
1d3a0 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f  ed .** element o
1d3b0 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
1d3c0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1d3d0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
1d3e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1d3f0 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79  SrcListIndexedBy
1d400 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1d410 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65  SrcList *p, Toke
1d420 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a  n *pIndexedBy){.
1d430 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
1d440 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28  edBy!=0 );.  if(
1d450 20 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e   p && ALWAYS(p->
1d460 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73  nSrc>0) ){.    s
1d470 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1d480 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
1d490 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
1d4a0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1d4b0 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 26  >notIndexed==0 &
1d4c0 26 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d  & pItem->zIndex=
1d4d0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  =0 );.    if( pI
1d4e0 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26  ndexedBy->n==1 &
1d4f0 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a  & !pIndexedBy->z
1d500 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22   ){.      /* A "
1d510 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61  NOT INDEXED" cla
1d520 75 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64  use was supplied
1d530 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20  . See parse.y . 
1d540 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63       ** construc
1d550 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20  t "indexed_opt" 
1d560 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a  for details. */.
1d570 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74        pItem->not
1d580 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20  Indexed = 1;.   
1d590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
1d5a0 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71  tem->zIndex = sq
1d5b0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1d5c0 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
1d5d0 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20  IndexedBy);.    
1d5e0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  }.  }.}../*.** W
1d5f0 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20  hen building up 
1d600 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  a FROM clause in
1d610 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65   the parser, the
1d620 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a   join operator.*
1d630 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61  * is initially a
1d640 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c  ttached to the l
1d650 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75  eft operand.  Bu
1d660 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  t the code gener
1d670 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20  ator.** expects 
1d680 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
1d690 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72  r to be on the r
1d6a0 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54  ight operand.  T
1d6b0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53  his routine.** S
1d6c0 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f  hifts all join o
1d6d0 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65  perators from le
1d6e0 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20  ft to right for 
1d6f0 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a  an entire FROM.*
1d700 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  * clause..**.** 
1d710 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65  Example: Suppose
1d720 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b   the join is lik
1d730 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
1d740 20 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61          A natura
1d750 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a  l cross join B.*
1d760 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f  *.** The operato
1d770 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72  r is "natural cr
1d780 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20  oss join".  The 
1d790 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73  A and B operands
1d7a0 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69   are stored.** i
1d7b0 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d  n p->a[0] and p-
1d7c0 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76  >a[1], respectiv
1d7d0 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72  ely.  The parser
1d7e0 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65   initially store
1d7f0 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f  s the.** operato
1d800 72 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20  r with A.  This 
1d810 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74  routine shifts t
1d820 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65  hat operator ove
1d830 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20  r to B..*/.void 
1d840 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68  sqlite3SrcListSh
1d850 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c  iftJoinType(SrcL
1d860 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  ist *p){.  if( p
1d870 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1d880 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 20     assert( p->a 
1d890 7c 7c 20 70 2d 3e 6e 53 72 63 3d 3d 30 20 29 3b  || p->nSrc==0 );
1d8a0 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53  .    for(i=p->nS
1d8b0 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b  rc-1; i>0; i--){
1d8c0 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a  .      p->a[i].j
1d8d0 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69  ointype = p->a[i
1d8e0 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  -1].jointype;.  
1d8f0 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e    }.    p->a[0].
1d900 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20  jointype = 0;.  
1d910 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e  }.}../*.** Begin
1d920 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1d930 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
1d940 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  ginTransaction(P
1d950 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1d960 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74  t type){.  sqlit
1d970 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
1d980 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  v;.  int i;..  a
1d990 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
1d9a0 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   );.  db = pPars
1d9b0 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  e->db;.  assert(
1d9c0 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66   db!=0 );./*  if
1d9d0 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  ( db->aDb[0].pBt
1d9e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f  ==0 ) return; */
1d9f0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
1da00 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1da10 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
1da20 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20  ON, "BEGIN", 0, 
1da30 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1da40 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
1da50 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1da60 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72  e);.  if( !v ) r
1da70 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70  eturn;.  if( typ
1da80 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29  e!=TK_DEFERRED )
1da90 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
1daa0 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
1dab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1dac0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72  eAddOp2(v, OP_Tr
1dad0 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74  ansaction, i, (t
1dae0 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56  ype==TK_EXCLUSIV
1daf0 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  E)+1);.      sql
1db00 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
1db10 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  e(v, i);.    }. 
1db20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
1db30 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
1db40 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a  oCommit, 0, 0);.
1db50 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
1db60 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
1db70 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
1db80 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50  mitTransaction(P
1db90 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1dba0 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73   Vdbe *v;..  ass
1dbb0 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
1dbc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1dbd0 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69  se->db!=0 );.  i
1dbe0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1dbf0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1dc00 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
1dc10 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
1dc20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1dc30 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
1dc40 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1dc50 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1dc60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1dc70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
1dc80 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d  it, 1, 0);.  }.}
1dc90 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
1dca0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1dcb0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
1dcc0 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f  llbackTransactio
1dcd0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
1dce0 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  {.  Vdbe *v;..  
1dcf0 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d  assert( pParse!=
1dd00 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1dd10 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a  Parse->db!=0 );.
1dd20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
1dd30 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
1dd40 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
1dd50 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30  N, "ROLLBACK", 0
1dd60 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
1dd70 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
1dd80 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1dd90 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
1dda0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ddb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
1ddc0 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a  oCommit, 1, 1);.
1ddd0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
1dde0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1ddf0 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
1de00 65 72 20 77 68 65 6e 20 69 74 20 70 61 72 73 65  er when it parse
1de10 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63  s a command to c
1de20 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73  reate,.** releas
1de30 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  e or rollback an
1de40 20 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20   SQL savepoint. 
1de50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1de60 53 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20  Savepoint(Parse 
1de70 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c  *pParse, int op,
1de80 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
1de90 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
1dea0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1deb0 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
1dec0 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
1ded0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  Name ){.    Vdbe
1dee0 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
1def0 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69  Vdbe(pParse);.#i
1df00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1df10 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
1df20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1df30 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a   char * const az
1df40 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20  [] = { "BEGIN", 
1df50 22 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c  "RELEASE", "ROLL
1df60 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73  BACK" };.    ass
1df70 65 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f  ert( !SAVEPOINT_
1df80 42 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49  BEGIN && SAVEPOI
1df90 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26  NT_RELEASE==1 &&
1dfa0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
1dfb0 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66  ACK==2 );.#endif
1dfc0 0a 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73  .    if( !v || s
1dfd0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1dfe0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53  pParse, SQLITE_S
1dff0 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d  AVEPOINT, az[op]
1e000 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20  , zName, 0) ){. 
1e010 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
1e020 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  ee(pParse->db, z
1e030 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
1e040 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  urn;.    }.    s
1e050 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1e060 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74  (v, OP_Savepoint
1e070 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d  , op, 0, 0, zNam
1e080 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  e, P4_DYNAMIC);.
1e090 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b    }.}../*.** Mak
1e0a0 65 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20  e sure the TEMP 
1e0b0 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
1e0c0 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66   and available f
1e0d0 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a  or use.  Return.
1e0e0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
1e0f0 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20   errors.  Leave 
1e100 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67  any error messag
1e110 65 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  es in the pParse
1e120 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69   structure..*/.i
1e130 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65  nt sqlite3OpenTe
1e140 6d 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65  mpDatabase(Parse
1e150 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
1e160 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
1e170 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d  e->db;.  if( db-
1e180 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26  >aDb[1].pBt==0 &
1e190 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  & !pParse->expla
1e1a0 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  in ){.    int rc
1e1b0 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  ;.    Btree *pBt
1e1c0 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
1e1d0 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a  st int flags = .
1e1e0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1e1f0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
1e200 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
1e210 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
1e220 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
1e230 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
1e240 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
1e250 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
1e260 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20  NCLOSE |.       
1e270 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
1e280 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20  EMP_DB;..    rc 
1e290 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  = sqlite3BtreeOp
1e2a0 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20  en(db->pVfs, 0, 
1e2b0 64 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61  db, &pBt, 0, fla
1e2c0 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  gs);.    if( rc!
1e2d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e2e0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1e2f0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61  Msg(pParse, "una
1e300 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  ble to open a te
1e310 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
1e320 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65   ".        "file
1e330 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d   for storing tem
1e340 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b  porary tables");
1e350 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72  .      pParse->r
1e360 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  c = rc;.      re
1e370 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1e380 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74    db->aDb[1].pBt
1e390 20 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65   = pBt;.    asse
1e3a0 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  rt( db->aDb[1].p
1e3b0 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66  Schema );.    if
1e3c0 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d  ( SQLITE_NOMEM==
1e3d0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
1e3e0 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d  ageSize(pBt, db-
1e3f0 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d  >nextPagesize, -
1e400 31 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 64  1, 0) ){.      d
1e410 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1e420 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 1;.      retur
1e430 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1e440 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1e450 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
1e460 45 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  E code that will
1e470 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
1e480 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74  ma cookie and st
1e490 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72  art.** a read-tr
1e4a0 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c  ansaction for al
1e4b0 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  l named database
1e4c0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74   files..**.** It
1e4d0 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   is important th
1e4e0 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f  at all schema co
1e4f0 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66 69 65  okies be verifie
1e500 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61  d and all.** rea
1e510 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62  d transactions b
1e520 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
1e530 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68   anything else h
1e540 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65  appens in.** the
1e550 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20   VDBE program.  
1e560 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  But this routine
1e570 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61   can be called a
1e580 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a  fter much other.
1e590 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e  ** code has been
1e5a0 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20   generated.  So 
1e5b0 68 65 72 65 20 69 73 20 77 68 61 74 20 77 65 20  here is what we 
1e5c0 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  do:.**.** The fi
1e5d0 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
1e5e0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
1e5f0 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47   we code an OP_G
1e600 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c  oto that.** will
1e610 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f   jump to a subro
1e620 75 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64  utine at the end
1e630 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   of the program.
1e640 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63    Then we.** rec
1e650 6f 72 64 20 65 76 65 72 79 20 64 61 74 61 62 61  ord every databa
1e660 73 65 20 74 68 61 74 20 6e 65 65 64 73 20 69 74  se that needs it
1e670 73 20 73 63 68 65 6d 61 20 76 65 72 69 66 69 65  s schema verifie
1e680 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72  d in the.** pPar
1e690 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66  se->cookieMask f
1e6a0 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66  ield.  Later, af
1e6b0 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f  ter all other co
1e6c0 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67  de has been.** g
1e6d0 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73 75  enerated, the su
1e6e0 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f  broutine that do
1e6f0 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65  es the cookie ve
1e700 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a  rifications and.
1e710 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20 74 72  ** starts the tr
1e720 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20  ansactions will 
1e730 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65  be coded and the
1e740 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75   OP_Goto P2 valu
1e750 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64  e.** will be mad
1e760 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  e to point to th
1e770 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20  at subroutine.  
1e780 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f  The generation o
1e790 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20  f the.** cookie 
1e7a0 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62  verification sub
1e7b0 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70  routine code hap
1e7c0 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46  pens in sqlite3F
1e7d0 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a  inishCoding()..*
1e7e0 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74 68  *.** If iDb<0 th
1e7f0 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47  en code the OP_G
1e800 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74  oto only - don't
1e810 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65 72   set flag to ver
1e820 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d  ify the.** schem
1e830 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61 73  a on any databas
1e840 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65  es.  This can be
1e850 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f   used to positio
1e860 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a  n the OP_Goto.**
1e870 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63 6f   early in the co
1e880 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b 6e  de, before we kn
1e890 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61 62 61  ow if any databa
1e8a0 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62  se tables will b
1e8b0 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  e used..*/.void 
1e8c0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
1e8d0 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70  ySchema(Parse *p
1e8e0 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b  Parse, int iDb){
1e8f0 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
1e900 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
1e910 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
1e920 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  e);..#ifndef SQL
1e930 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
1e940 0a 20 20 69 66 28 20 70 54 6f 70 6c 65 76 65 6c  .  if( pToplevel
1e950 21 3d 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20  !=pParse ){.    
1e960 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
1e970 73 20 74 61 6b 65 6e 20 69 66 20 61 20 74 72 69  s taken if a tri
1e980 67 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c  gger is currentl
1e990 79 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 49  y being coded. I
1e9a0 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 61  n this.    ** ca
1e9b0 73 65 2c 20 73 65 74 20 63 6f 6f 6b 69 65 47 6f  se, set cookieGo
1e9c0 74 6f 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  to to a non-zero
1e9d0 20 76 61 6c 75 65 20 74 6f 20 73 68 6f 77 20 74   value to show t
1e9e0 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
1e9f0 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65  n.    ** has bee
1ea00 6e 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 20 69  n called. This i
1ea10 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 71  s used by the sq
1ea20 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e  lite3ExprCodeCon
1ea30 73 74 61 6e 74 73 28 29 0a 20 20 20 20 2a 2a 20  stants().    ** 
1ea40 66 75 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  function. */.   
1ea50 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1ea60 6f 74 6f 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65  oto = -1;.  }.#e
1ea70 6e 64 69 66 0a 20 20 69 66 28 20 70 54 6f 70 6c  ndif.  if( pTopl
1ea80 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  evel->cookieGoto
1ea90 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ==0 ){.    Vdbe 
1eaa0 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
1eab0 64 62 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a  dbe(pToplevel);.
1eac0 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
1ead0 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20  eturn;  /* This 
1eae0 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20  only happens if 
1eaf0 74 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f  there was a prio
1eb00 72 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 70  r error */.    p
1eb10 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
1eb20 47 6f 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64  Goto = sqlite3Vd
1eb30 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
1eb40 6f 74 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20  oto, 0, 0)+1;.  
1eb50 7d 0a 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29  }.  if( iDb>=0 )
1eb60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
1eb70 62 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 64  b = pToplevel->d
1eb80 62 3b 0a 20 20 20 20 79 44 62 4d 61 73 6b 20 6d  b;.    yDbMask m
1eb90 61 73 6b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  ask;..    assert
1eba0 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  ( iDb<db->nDb );
1ebb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
1ebc0 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
1ebd0 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20   || iDb==1 );.  
1ebe0 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 53 51    assert( iDb<SQ
1ebf0 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
1ec00 44 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  D+2 );.    asser
1ec10 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
1ec20 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
1ec30 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 61 73  b, 0) );.    mas
1ec40 6b 20 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29  k = ((yDbMask)1)
1ec50 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66 28 20 28  <<iDb;.    if( (
1ec60 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69  pToplevel->cooki
1ec70 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  eMask & mask)==0
1ec80 20 29 7b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65   ){.      pTople
1ec90 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  vel->cookieMask 
1eca0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  |= mask;.      p
1ecb0 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65  Toplevel->cookie
1ecc0 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d  Value[iDb] = db-
1ecd0 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
1ece0 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65  a->schema_cookie
1ecf0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  ;.      if( !OMI
1ed00 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
1ed10 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =1 ){.        sq
1ed20 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
1ed30 61 62 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29  abase(pToplevel)
1ed40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ed50 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
1ed60 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20  argument zDb is 
1ed70 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20  NULL, then call 
1ed80 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
1ed90 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61  ySchema() for ea
1eda0 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20  ch .** attached 
1edb0 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77  database. Otherw
1edc0 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66  ise, invoke it f
1edd0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
1ede0 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a  named zDb only..
1edf0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
1ee00 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
1ee10 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72  hema(Parse *pPar
1ee20 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
1ee30 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  zDb){.  sqlite3 
1ee40 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1ee50 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
1ee60 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
1ee70 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
1ee80 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
1ee90 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
1eea0 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30  Bt && (!zDb || 0
1eeb0 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
1eec0 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65  (zDb, pDb->zName
1eed0 29 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  )) ){.      sqli
1eee0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
1eef0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a  ema(pParse, i);.
1ef00 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1ef10 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45  ** Generate VDBE
1ef20 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61   code that prepa
1ef30 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e  res for doing an
1ef40 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a   operation that.
1ef50 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ** might change 
1ef60 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
1ef70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1ef80 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72   starts a new tr
1ef90 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20  ansaction if we 
1efa0 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  are not already 
1efb0 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e  within.** a tran
1efc0 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20  saction.  If we 
1efd0 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68  are already with
1efe0 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
1eff0 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f  , then a checkpo
1f000 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66  int.** is set if
1f010 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e   the setStatemen
1f020 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
1f030 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69  rue.  A checkpoi
1f040 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nt should.** be 
1f050 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f  set for operatio
1f060 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61  ns that might fa
1f070 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e  il (due to a con
1f080 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66  straint) part of
1f090 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f  .** the way thro
1f0a0 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69  ugh and which wi
1f0b0 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20  ll need to undo 
1f0c0 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68  some writes with
1f0d0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a  out having to.**
1f0e0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68   rollback the wh
1f0f0 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ole transaction.
1f100 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73    For operations
1f110 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74   where all const
1f120 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65  raints.** can be
1f130 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20   checked before 
1f140 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20  any changes are 
1f150 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
1f160 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65  base, it is neve
1f170 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74  r.** necessary t
1f180 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61  o undo a write a
1f190 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
1f1a0 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  t should not be 
1f1b0 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  set..*/.void sql
1f1c0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1f1d0 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  eration(Parse *p
1f1e0 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74  Parse, int setSt
1f1f0 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62  atement, int iDb
1f200 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
1f210 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
1f220 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
1f230 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  rse);.  sqlite3C
1f240 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
1f250 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
1f260 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65  pToplevel->write
1f270 4d 61 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73  Mask |= ((yDbMas
1f280 6b 29 31 29 3c 3c 69 44 62 3b 0a 20 20 70 54 6f  k)1)<<iDb;.  pTo
1f290 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57  plevel->isMultiW
1f2a0 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65  rite |= setState
1f2b0 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ment;.}../*.** I
1f2c0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
1f2d0 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65   statement curre
1f2e0 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
1f2f0 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72  ruction might wr
1f300 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  ite.** more than
1f310 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d   one entry (exam
1f320 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e  ple: deleting on
1f330 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72  e row then inser
1f340 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a  ting another,.**
1f350 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69   inserting multi
1f360 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61  ple rows in a ta
1f370 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e  ble, or insertin
1f380 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65  g a row and inde
1f390 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49  x entries.).** I
1f3a0 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72  f an abort occur
1f3b0 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20  s after some of 
1f3c0 74 68 65 73 65 20 77 72 69 74 65 73 20 68 61 76  these writes hav
1f3d0 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65  e completed, the
1f3e0 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  n it will.** be 
1f3f0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
1f400 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20  o the completed 
1f410 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  writes..*/.void 
1f420 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74  sqlite3MultiWrit
1f430 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  e(Parse *pParse)
1f440 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
1f450 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
1f460 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
1f470 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  se);.  pToplevel
1f480 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d  ->isMultiWrite =
1f490 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68   1;.}../* .** Th
1f4a0 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72  e code generator
1f4b0 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
1f4c0 69 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f 76  ine if is discov
1f4d0 65 72 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a  ers that it is.*
1f4e0 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62  * possible to ab
1f4f0 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  ort a statement 
1f500 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74  prior to complet
1f510 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74  ion.  In order t
1f520 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68  o .** perform th
1f530 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74  is abort without
1f540 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20   corrupting the 
1f550 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65  database, we nee
1f560 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72  d to make.** sur
1f570 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
1f580 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65  ment is protecte
1f590 64 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74  d by a statement
1f5a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1f5b0 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c  .** Technically,
1f5c0 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f   we only need to
1f5d0 20 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72   set the mayAbor
1f5e0 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a  t flag if the.**
1f5f0 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c   isMultiWrite fl
1f600 61 67 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ag was previousl
1f610 79 20 73 65 74 2e 20 20 54 68 65 72 65 20 69 73  y set.  There is
1f620 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e   a time dependen
1f630 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20  cy.** such that 
1f640 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f  the abort must o
1f650 63 63 75 72 20 61 66 74 65 72 20 74 68 65 20 6d  ccur after the m
1f660 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69 73  ultiwrite.  This
1f670 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73   makes.** some s
1f680 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76  tatements involv
1f690 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45 20  ing the REPLACE 
1f6a0 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  conflict resolut
1f6b0 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a  ion algorithm.**
1f6c0 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73   go a little fas
1f6d0 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67  ter.  But taking
1f6e0 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
1f6f0 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e  is time dependen
1f700 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d  cy.** makes it m
1f710 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f  ore difficult to
1f720 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20   prove that the 
1f730 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74 20  code is correct 
1f740 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c  (in .** particul
1f750 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20  ar, it prevents 
1f760 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20  us from writing 
1f770 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20  an effective.** 
1f780 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1f790 66 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d  f sqlite3AssertM
1f7a0 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73  ayAbort()) and s
1f7b0 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e  o we have chosen
1f7c0 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20  .** to take the 
1f7d0 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73  safe route and s
1f7e0 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61  kip the optimiza
1f7f0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
1f800 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61  lite3MayAbort(Pa
1f810 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
1f820 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1f830 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1f840 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1f850 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61  .  pToplevel->ma
1f860 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f  yAbort = 1;.}../
1f870 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
1f880 48 61 6c 74 20 74 68 61 74 20 63 61 75 73 65 73  Halt that causes
1f890 20 74 68 65 20 76 64 62 65 20 74 6f 20 72 65 74   the vdbe to ret
1f8a0 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
1f8b0 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f  NSTRAINT.** erro
1f8c0 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70  r. The onError p
1f8d0 61 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69  arameter determi
1f8e0 6e 65 73 20 77 68 69 63 68 20 28 69 66 20 61 6e  nes which (if an
1f8f0 79 29 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  y) of the statem
1f900 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75  ent.** and/or cu
1f910 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
1f920 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
1f930 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1f940 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
1f950 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1f960 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
1f970 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
1f980 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f   errCode,      /
1f990 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72  * extended error
1f9a0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   code */.  int o
1f9b0 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
1f9c0 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20  Constraint type 
1f9d0 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20  */.  char *p4,  
1f9e0 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
1f9f0 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 6e 74  message */.  int
1fa00 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20 2f   p4type        /
1fa10 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50  * P4_STATIC or P
1fa20 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 29  4_TRANSIENT */.)
1fa30 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71  {.  Vdbe *v = sq
1fa40 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1fa50 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
1fa60 28 65 72 72 43 6f 64 65 26 30 78 66 66 29 3d 3d  (errCode&0xff)==
1fa70 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
1fa80 54 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72  T );.  if( onErr
1fa90 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a  or==OE_Abort ){.
1faa0 20 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62      sqlite3MayAb
1fab0 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d  ort(pParse);.  }
1fac0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1fad0 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  dOp4(v, OP_Halt,
1fae0 20 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f   errCode, onErro
1faf0 72 2c 20 30 2c 20 70 34 2c 20 70 34 74 79 70 65  r, 0, p4, p4type
1fb00 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  );.}../*.** Chec
1fb10 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64  k to see if pInd
1fb20 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ex uses the coll
1fb30 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
1fb40 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  Coll.  Return.**
1fb50 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
1fb60 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74   and false if it
1fb70 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69   does not..*/.#i
1fb80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1fb90 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
1fba0 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61   int collationMa
1fbb0 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tch(const char *
1fbc0 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49  zColl, Index *pI
1fbd0 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  ndex){.  int i;.
1fbe0 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21    assert( zColl!
1fbf0 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  =0 );.  for(i=0;
1fc00 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   i<pIndex->nColu
1fc10 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  mn; i++){.    co
1fc20 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49  nst char *z = pI
1fc30 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  ndex->azColl[i];
1fc40 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d  .    assert( z!=
1fc50 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 69 43  0 || pIndex->aiC
1fc60 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20  olumn[i]<0 );.  
1fc70 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69    if( pIndex->ai
1fc80 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20  Column[i]>=0 && 
1fc90 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
1fca0 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  p(z, zColl) ){. 
1fcb0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1fcc0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1fcd0 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 0;.}.#endif../
1fce0 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61  *.** Recompute a
1fcf0 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
1fd00 61 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ab that use the 
1fd10 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1fd20 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20  ce pColl..** If 
1fd30 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
1fd40 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
1fd50 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a  ces of pTab..*/.
1fd60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1fd70 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
1fd80 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54  ic void reindexT
1fd90 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
1fda0 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  se, Table *pTab,
1fdb0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
1fdc0 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ll){.  Index *pI
1fdd0 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
1fde0 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
1fdf0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1fe00 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49  Tab */..  for(pI
1fe10 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  ndex=pTab->pInde
1fe20 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
1fe30 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29  x=pIndex->pNext)
1fe40 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d  {.    if( zColl=
1fe50 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d  =0 || collationM
1fe60 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64  atch(zColl, pInd
1fe70 65 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ex) ){.      int
1fe80 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
1fe90 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
1fea0 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
1feb0 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71  chema);.      sq
1fec0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1fed0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
1fee0 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20   0, iDb);.      
1fef0 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
1ff00 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
1ff10 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  x, -1);.    }.  
1ff20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
1ff30 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
1ff40 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74  indices of all t
1ff50 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  ables in all dat
1ff60 61 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65  abases where the
1ff70 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20  .** indices use 
1ff80 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
1ff90 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49  quence pColl.  I
1ffa0 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
1ffb0 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c  recompute.** all
1ffc0 20 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68   indices everywh
1ffd0 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ere..*/.#ifndef 
1ffe0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
1fff0 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
20000 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
20010 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
20020 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
20030 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  l){.  Db *pDb;  
20040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20050 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61    /* A single da
20060 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
20070 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
20080 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
20090 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
200a0 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
200b0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
200c0 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
200d0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
200e0 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   */.  HashElem *
200f0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
20100 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
20110 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20   over tables in 
20120 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  pDb */.  Table *
20130 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
20140 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
20150 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
20160 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
20170 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
20180 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
20190 20 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20    /* Needed for 
201a0 73 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f  schema access */
201b0 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44  .  for(iDb=0, pD
201c0 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64  b=db->aDb; iDb<d
201d0 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70  b->nDb; iDb++, p
201e0 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72  Db++){.    asser
201f0 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20  t( pDb!=0 );.   
20200 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73   for(k=sqliteHas
20210 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63  hFirst(&pDb->pSc
20220 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
20230 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68   k; k=sqliteHash
20240 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20  Next(k)){.      
20250 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73  pTab = (Table*)s
20260 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29  qliteHashData(k)
20270 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54  ;.      reindexT
20280 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
20290 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  b, zColl);.    }
202a0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
202b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
202c0 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44  de for the REIND
202d0 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
202e0 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
202f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20300 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31              -- 1
20310 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
20320 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20  EX  <collation> 
20330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
20340 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   2.**        REI
20350 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
20360 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20  >.?<tablename>  
20370 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 3.**        R
20380 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
20390 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e  se>.?<indexname>
203a0 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72    -- 4.**.** For
203b0 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69  m 1 causes all i
203c0 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74  ndices in all at
203d0 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
203e0 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a   to be rebuilt..
203f0 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c  ** Form 2 rebuil
20400 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  ds all indices i
20410 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
20420 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d  that use the nam
20430 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20  ed.** collating 
20440 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73  function.  Forms
20450 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64   3 and 4 rebuild
20460 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
20470 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63   or all.** indic
20480 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
20490 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  th the named tab
204a0 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  le..*/.#ifndef S
204b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
204c0 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  EX.void sqlite3R
204d0 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  eindex(Parse *pP
204e0 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
204f0 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  me1, Token *pNam
20500 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e2){.  CollSeq *
20510 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
20520 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
20530 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72  sequence to be r
20540 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c  eindexed, or NUL
20550 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  L */.  char *z; 
20560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20570 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20     /* Name of a 
20580 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a  table or index *
20590 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
205a0 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
205b0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
205c0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62  atabase */.  Tab
205d0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
205e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
205f0 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
20600 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ase */.  Index *
20610 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
20620 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
20630 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
20640 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
20650 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
20660 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
20670 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
20680 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
20690 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
206a0 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
206b0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
206c0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a  */.  Token *pObj
206d0 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
206e0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
206f0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
20700 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a  o be reindexed *
20710 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  /..  /* Read the
20720 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
20730 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
20740 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
20750 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
20760 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
20770 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
20780 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
20790 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
207a0 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
207b0 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
207c0 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  n;.  }..  if( pN
207d0 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ame1==0 ){.    r
207e0 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
207f0 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20  pParse, 0);.    
20800 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
20810 69 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32  if( NEVER(pName2
20820 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e  ==0) || pName2->
20830 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  z==0 ){.    char
20840 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73   *zColl;.    ass
20850 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29  ert( pName1->z )
20860 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71  ;.    zColl = sq
20870 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
20880 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
20890 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20  Name1);.    if( 
208a0 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b  !zColl ) return;
208b0 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
208c0 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
208d0 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
208e0 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ll, 0);.    if( 
208f0 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
20900 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
20910 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a  pParse, zColl);.
20920 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
20930 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
20940 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
20950 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
20960 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
20970 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
20980 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
20990 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
209a0 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61   pName2, &pObjNa
209b0 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
209c0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d   ) return;.  z =
209d0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
209e0 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61  Token(db, pObjNa
209f0 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  me);.  if( z==0 
20a00 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20  ) return;.  zDb 
20a10 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
20a20 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73  Name;.  pTab = s
20a30 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
20a40 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69  db, z, zDb);.  i
20a50 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72  f( pTab ){.    r
20a60 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
20a70 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20  se, pTab, 0);.  
20a80 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
20a90 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75  db, z);.    retu
20aa0 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  rn;.  }.  pIndex
20ab0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
20ac0 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  dex(db, z, zDb);
20ad0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
20ae0 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70  (db, z);.  if( p
20af0 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
20b00 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
20b10 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
20b20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
20b30 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
20b40 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
20b50 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
20b60 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
20b70 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
20b80 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69  unable to identi
20b90 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f  fy the object to
20ba0 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b   be reindexed");
20bb0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
20bc0 20 52 65 74 75 72 6e 20 61 20 64 79 6e 61 6d 69   Return a dynami
20bd0 63 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b 65  cly allocated Ke
20be0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
20bf0 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
20c00 0a 2a 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e  .** with OP_Open
20c10 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57  Read or OP_OpenW
20c20 72 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 64  rite to access d
20c30 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 70 49  atabase index pI
20c40 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  dx..**.** If suc
20c50 63 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74  cessful, a point
20c60 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74  er to the new st
20c70 72 75 63 74 75 72 65 20 69 73 20 72 65 74 75 72  ructure is retur
20c80 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ned. In this cas
20c90 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  e.** the caller 
20ca0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
20cb0 6f 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  or calling sqlit
20cc0 65 33 44 62 46 72 65 65 28 64 62 2c 20 29 20 6f  e3DbFree(db, ) o
20cd0 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 0a  n the returned .
20ce0 2a 2a 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 61  ** pointer. If a
20cf0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28  n error occurs (
20d00 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72  out of memory or
20d10 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69   missing collati
20d20 6f 6e 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29  on .** sequence)
20d30 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
20d40 65 64 20 61 6e 64 20 74 68 65 20 73 74 61 74 65  ed and the state
20d50 20 6f 66 20 70 50 61 72 73 65 20 75 70 64 61 74   of pParse updat
20d60 65 64 20 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a  ed to reflect.**
20d70 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b   the error..*/.K
20d80 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49  eyInfo *sqlite3I
20d90 6e 64 65 78 4b 65 79 69 6e 66 6f 28 50 61 72 73  ndexKeyinfo(Pars
20da0 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78  e *pParse, Index
20db0 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69   *pIdx){.  int i
20dc0 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70  ;.  int nCol = p
20dd0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
20de0 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d  int nKey = pIdx-
20df0 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49  >nKeyCol;.  KeyI
20e00 6e 66 6f 20 2a 70 4b 65 79 3b 0a 0a 20 20 70 4b  nfo *pKey;..  pK
20e10 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  ey = sqlite3KeyI
20e20 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  nfoAlloc(pParse-
20e30 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d  >db, nKey, nCol-
20e40 6e 4b 65 79 29 3b 0a 20 20 69 66 28 20 70 4b 65  nKey);.  if( pKe
20e50 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  y ){.    for(i=0
20e60 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
20e70 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
20e80 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
20e90 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [i];.      if( z
20ea0 43 6f 6c 6c 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20  Coll==0 ) zColl 
20eb0 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20  = "BINARY";.    
20ec0 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d    pKey->aColl[i]
20ed0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
20ee0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
20ef0 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b  zColl);.      pK
20f00 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ey->aSortOrder[i
20f10 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ] = pIdx->aSortO
20f20 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  rder[i];.    }. 
20f30 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65   }..  if( pParse
20f40 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ->nErr ){.    sq
20f50 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
20f60 73 65 2d 3e 64 62 2c 20 70 4b 65 79 29 3b 0a 20  se->db, pKey);. 
20f70 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 7d     pKey = 0;.  }
20f80 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a  .  return pKey;.
20f90 7d 0a                                            }.