/ Hex Artifact Content
Login

Artifact 07054d45319953e54a89d726e589a423e9c1c590:


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 2c 20 69 2c 20 61     int iDb, i, a
1250: 64 64 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ddr;.      sqlit
1260: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
1270: 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  , pParse->cookie
1280: 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20 20 20 66  Goto-1);.      f
1290: 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73 6b 3d 31  or(iDb=0, mask=1
12a0: 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 6d  ; iDb<db->nDb; m
12b0: 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b 2b 29 7b  ask<<=1, iDb++){
12c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 61  .        if( (ma
12d0: 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 63 6f 6f  sk & pParse->coo
12e0: 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29 20 63 6f  kieMask)==0 ) co
12f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1300: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
1310: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
1320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1330: 65 41 64 64 4f 70 32 28 76 2c 4f 50 5f 54 72 61  eAddOp2(v,OP_Tra
1340: 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62 2c 20 28  nsaction, iDb, (
1350: 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e 77  mask & pParse->w
1360: 72 69 74 65 4d 61 73 6b 29 21 3d 30 29 3b 0a 20  riteMask)!=0);. 
1370: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 69         if( db->i
1380: 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20  nit.busy==0 ){. 
1390: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
13a0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
13b0: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
13c0: 20 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20   0) );.         
13d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13e0: 70 33 28 76 2c 20 4f 50 5f 56 65 72 69 66 79 43  p3(v, OP_VerifyC
13f0: 6f 6f 6b 69 65 2c 0a 20 20 20 20 20 20 20 20 20  ookie,.         
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 20 20 69 44 62 2c 20 70 50 61 72 73 65 2d 3e     iDb, pParse->
1420: 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d  cookieValue[iDb]
1430: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62                db
1450: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
1460: 6d 61 2d 3e 69 47 65 6e 65 72 61 74 69 6f 6e 29  ma->iGeneration)
1470: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1480: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1490: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
14a0: 41 42 4c 45 0a 20 20 20 20 20 20 66 6f 72 28 69  ABLE.      for(i
14b0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56  =0; i<pParse->nV
14c0: 74 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20  tabLock; i++){. 
14d0: 20 20 20 20 20 20 20 63 68 61 72 20 2a 76 74 61         char *vta
14e0: 62 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  b = (char *)sqli
14f0: 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
1500: 20 70 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c   pParse->apVtabL
1510: 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ock[i]);.       
1520: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1530: 70 34 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c  p4(v, OP_VBegin,
1540: 20 30 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20   0, 0, 0, vtab, 
1550: 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20  P4_VTAB);.      
1560: 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  }.      pParse->
1570: 6e 56 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23  nVtabLock = 0;.#
1580: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
1590: 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f  Once all the coo
15a0: 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e 20 76  kies have been v
15b0: 65 72 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e  erified and tran
15c0: 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c  sactions opened,
15d0: 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69   .      ** obtai
15e0: 6e 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  n the required t
15f0: 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73  able-locks. This
1600: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
1610: 73 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ss the .      **
1620: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65   shared-cache fe
1630: 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64  ature is enabled
1640: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1650: 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28   codeTableLocks(
1660: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1670: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  /* Initialize an
1680: 79 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  y AUTOINCREMENT 
1690: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
16a0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20  required..      
16b0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
16c0: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67  AutoincrementBeg
16d0: 69 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20  in(pParse);..   
16e0: 20 20 20 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74     /* Code const
16f0: 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ant expressions 
1700: 74 68 61 74 20 77 68 65 72 65 20 66 61 63 74 6f  that where facto
1710: 72 65 64 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72  red out of inner
1720: 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20   loops */.      
1730: 61 64 64 72 20 3d 20 70 50 61 72 73 65 2d 3e 63  addr = pParse->c
1740: 6f 6f 6b 69 65 47 6f 74 6f 3b 0a 20 20 20 20 20  ookieGoto;.     
1750: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 43 6f   if( pParse->pCo
1760: 6e 73 74 45 78 70 72 20 29 7b 0a 20 20 20 20 20  nstExpr ){.     
1770: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c     ExprList *pEL
1780: 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73   = pParse->pCons
1790: 74 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70  tExpr;.        p
17a0: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
17b0: 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66  o = 0;.        f
17c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e  or(i=0; i<pEL->n
17d0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
17e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17f0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
1800: 4c 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  L->a[i].pExpr, p
1810: 45 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73  EL->a[i].u.iCons
1820: 74 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20  tExprReg);.     
1830: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
1840: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20      /* Finally, 
1850: 6a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65  jump back to the
1860: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
1870: 65 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64  e executable cod
1880: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  e. */.      sqli
1890: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
18a0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
18b0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  r);.    }.  }...
18c0: 20 20 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42    /* Get the VDB
18d0: 45 20 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20  E program ready 
18e0: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20  for execution.  
18f0: 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20 41 4c  */.  if( v && AL
1900: 57 41 59 53 28 70 50 61 72 73 65 2d 3e 6e 45 72  WAYS(pParse->nEr
1910: 72 3d 3d 30 29 20 26 26 20 21 64 62 2d 3e 6d 61  r==0) && !db->ma
1920: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
1930: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1940: 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 30  ->iCacheLevel==0
1950: 20 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 73   );  /* Disables
1960: 20 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73 20   and re-enables 
1970: 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 2f 2a 20  match */.    /* 
1980: 41 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 6f 6e 65  A minimum of one
1990: 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 69   cursor is requi
19a0: 72 65 64 20 69 66 20 61 75 74 6f 69 6e 63 72 65  red if autoincre
19b0: 6d 65 6e 74 20 69 73 20 75 73 65 64 0a 20 20 20  ment is used.   
19c0: 20 2a 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b   *  See ticket [
19d0: 61 36 39 36 33 37 39 63 31 66 30 38 38 36 36 5d  a696379c1f08866]
19e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72   */.    if( pPar
19f0: 73 65 2d 3e 70 41 69 6e 63 21 3d 30 20 26 26 20  se->pAinc!=0 && 
1a00: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 30 20  pParse->nTab==0 
1a10: 29 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d  ) pParse->nTab =
1a20: 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   1;.    sqlite3V
1a30: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20  dbeMakeReady(v, 
1a40: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 50 61  pParse);.    pPa
1a50: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
1a60: 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73  _DONE;.    pPars
1a70: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
1a80: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1a90: 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51   pParse->rc = SQ
1aa0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
1ab0: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
1ac0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d   0;.  pParse->nM
1ad0: 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  em = 0;.  pParse
1ae0: 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50  ->nSet = 0;.  pP
1af0: 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a  arse->nVar = 0;.
1b00: 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
1b10: 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72  Mask = 0;.  pPar
1b20: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d  se->cookieGoto =
1b30: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e   0;.}../*.** Run
1b40: 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64 20   the parser and 
1b50: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 72  code generator r
1b60: 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f 72  ecursively in or
1b70: 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a  der to generate.
1b80: 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ** code for the 
1b90: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67 69  SQL statement gi
1ba0: 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ven onto the end
1bb0: 20 6f 66 20 74 68 65 20 70 50 61 72 73 65 20 63   of the pParse c
1bc0: 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e  ontext.** curren
1bd0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
1be0: 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68  uction.  When th
1bf0: 65 20 70 61 72 73 65 72 20 69 73 20 72 75 6e 20  e parser is run 
1c00: 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74  recursively.** t
1c10: 68 69 73 20 77 61 79 2c 20 74 68 65 20 66 69 6e  his way, the fin
1c20: 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f  al OP_Halt is no
1c30: 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20 6f  t appended and o
1c40: 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61 74  ther initializat
1c50: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c  ion.** and final
1c60: 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61 72  ization steps ar
1c70: 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75 73  e omitted becaus
1c80: 65 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e 64  e those are hand
1c90: 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f  ling by the.** o
1ca0: 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72 2e  utermost parser.
1cb0: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79  .**.** Not every
1cc0: 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62 6c  thing is nestabl
1cd0: 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69 74  e.  This facilit
1ce0: 79 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  y is designed to
1cf0: 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52   permit.** INSER
1d00: 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44  T, UPDATE, and D
1d10: 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
1d20: 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45 5f   against SQLITE_
1d30: 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20  MASTER.  Use.** 
1d40: 63 61 72 65 20 69 66 20 79 6f 75 20 64 65 63 69  care if you deci
1d50: 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73 65  de to try to use
1d60: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 6f   this routine fo
1d70: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72  r some other pur
1d80: 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  poses..*/.void s
1d90: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
1da0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
1db0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
1dc0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
1dd0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
1de0: 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a   *zSql;.  char *
1df0: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73  zErrMsg = 0;.  s
1e00: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1e10: 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65 66 69 6e  rse->db;.# defin
1e20: 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69 7a 65  e SAVE_SZ  (size
1e30: 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66 66 73  of(Parse) - offs
1e40: 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61 72 29  etof(Parse,nVar)
1e50: 29 0a 20 20 63 68 61 72 20 73 61 76 65 42 75 66  ).  char saveBuf
1e60: 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66  [SAVE_SZ];..  if
1e70: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
1e80: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
1e90: 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  t( pParse->neste
1ea0: 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74  d<10 );  /* Nest
1eb0: 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ing should only 
1ec0: 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20 64 65  be of limited de
1ed0: 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72  pth */.  va_star
1ee0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
1ef0: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
1f00: 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 46 6f  VMPrintf(db, zFo
1f10: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
1f20: 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a  end(ap);.  if( z
1f30: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Sql==0 ){.    re
1f40: 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c  turn;   /* A mal
1f50: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
1f60: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50  iled */.  }.  pP
1f70: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a  arse->nested++;.
1f80: 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66    memcpy(saveBuf
1f90: 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  , &pParse->nVar,
1fa0: 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d   SAVE_SZ);.  mem
1fb0: 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  set(&pParse->nVa
1fc0: 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  r, 0, SAVE_SZ);.
1fd0: 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73    sqlite3RunPars
1fe0: 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c  er(pParse, zSql,
1ff0: 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71   &zErrMsg);.  sq
2000: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2010: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69  zErrMsg);.  sqli
2020: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
2030: 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70  ql);.  memcpy(&p
2040: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76  Parse->nVar, sav
2050: 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  eBuf, SAVE_SZ);.
2060: 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64    pParse->nested
2070: 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  --;.}../*.** Loc
2080: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
2090: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
20a0: 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72   describes a par
20b0: 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
20c0: 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20  .** table given 
20d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
20e0: 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69   table and (opti
20f0: 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65  onally) the name
2100: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
2110: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
2120: 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
2130: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
2140: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44  und..**.** If zD
2150: 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c  atabase is 0, al
2160: 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  l databases are 
2170: 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65  searched for the
2180: 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a   table and the.*
2190: 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  * first matching
21a0: 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e   table is return
21b0: 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e  ed.  (No checkin
21c0: 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20  g for duplicate 
21d0: 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69  table.** names i
21e0: 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65  s done.)  The se
21f0: 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54 45  arch order is TE
2200: 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d  MP first, then M
2210: 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a  AIN, then any.**
2220: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
2230: 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e 67  ases added using
2240: 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d   the ATTACH comm
2250: 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  and..**.** See a
2260: 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  lso sqlite3Locat
2270: 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62  eTable()..*/.Tab
2280: 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 54  le *sqlite3FindT
2290: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
22a0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
22b0: 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
22c0: 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20 54  *zDatabase){.  T
22d0: 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69  able *p = 0;.  i
22e0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  nt i;.  int nNam
22f0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e 61  e;.  assert( zNa
2300: 6d 65 21 3d 30 20 29 3b 0a 20 20 6e 4e 61 6d 65  me!=0 );.  nName
2310: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
2320: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 2f 2a 20  30(zName);.  /* 
2330: 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20  All mutexes are 
2340: 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 63 68  required for sch
2350: 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b  ema access.  Mak
2360: 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74  e sure we hold t
2370: 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  hem. */.  assert
2380: 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c  ( zDatabase!=0 |
2390: 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  | sqlite3BtreeHo
23a0: 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
23b0: 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49  ) );.  for(i=OMI
23c0: 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e  T_TEMPDB; i<db->
23d0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
23e0: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
23f0: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
2400: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2410: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
2420: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20  zDatabase!=0 && 
2430: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
2440: 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44  Database, db->aD
2450: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
2460: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
2470: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
2480: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a  aMutexHeld(db, j
2490: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  , 0) );.    p = 
24a0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
24b0: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68  &db->aDb[j].pSch
24c0: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  ema->tblHash, zN
24d0: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
24e0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
24f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
2500: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
2510: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
2520: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
2530: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
2540: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
2550: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
2560: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
2570: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
2580: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
2590: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
25a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
25b0: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
25c0: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
25d0: 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a    Also leave an.
25e0: 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
25f0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
2600: 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  Msg..**.** The d
2610: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
2620: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
2630: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61  nd sqlite3FindTa
2640: 62 6c 65 28 29 20 69 73 20 74 68 61 74 20 74 68  ble() is that th
2650: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65  is.** routine le
2660: 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  aves an error me
2670: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
2680: 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a  >zErrMsg where.*
2690: 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  * sqlite3FindTab
26a0: 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  le() does not..*
26b0: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
26c0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20 20 50  LocateTable(.  P
26d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
26e0: 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 78 74        /* context
26f0: 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72 65 70   in which to rep
2700: 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ort errors */.  
2710: 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20  int isView,     
2720: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2730: 66 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20  f looking for a 
2740: 56 49 45 57 20 72 61 74 68 65 72 20 74 68 61 6e  VIEW rather than
2750: 20 61 20 54 41 42 4c 45 20 2a 2f 0a 20 20 63 6f   a TABLE */.  co
2760: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
2770: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2780: 74 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65  the table we are
2790: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a   looking for */.
27a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
27b0: 62 61 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65  base     /* Name
27c0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
27d0: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
27e0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
27f0: 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  p;..  /* Read th
2800: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
2810: 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  a. If an error o
2820: 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
2830: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20  error message.  
2840: 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70  ** and code in p
2850: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
2860: 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20   NULL. */.  if( 
2870: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
2880: 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
2890: 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  rse) ){.    retu
28a0: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d  rn 0;.  }..  p =
28b0: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
28c0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e  e(pParse->db, zN
28d0: 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20  ame, zDbase);.  
28e0: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
28f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67  const char *zMsg
2900: 20 3d 20 69 73 56 69 65 77 20 3f 20 22 6e 6f 20   = isView ? "no 
2910: 73 75 63 68 20 76 69 65 77 22 20 3a 20 22 6e 6f  such view" : "no
2920: 20 73 75 63 68 20 74 61 62 6c 65 22 3b 0a 20 20   such table";.  
2930: 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a    if( zDbase ){.
2940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2950: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
2960: 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73 67 2c  s: %s.%s", zMsg,
2970: 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b   zDbase, zName);
2980: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2990: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
29a0: 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25  g(pParse, "%s: %
29b0: 73 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65 29  s", zMsg, zName)
29c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
29d0: 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
29e0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
29f0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  n p;.}../*.** Lo
2a00: 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  cate the table i
2a10: 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a 70 2e  dentified by *p.
2a20: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
2a30: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
2a40: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
2a50: 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66 65 72  le(). The differ
2a60: 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ence between.** 
2a70: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
2a80: 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20 66 75  le() and this fu
2a90: 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74 20 74  nction is that t
2aa0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73  his function res
2ab0: 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20 73 65  tricts.** the se
2ac0: 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61 20 28  arch to schema (
2ad0: 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66 20 69  p->pSchema) if i
2ae0: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 70  t is not NULL. p
2af0: 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20 62 65  ->pSchema may be
2b00: 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20  .** non-NULL if 
2b10: 69 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  it is part of a 
2b20: 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20  view or trigger 
2b30: 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69 74 69  program definiti
2b40: 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c 69 74  on. See.** sqlit
2b50: 65 33 46 69 78 53 72 63 4c 69 73 74 28 29 20 66  e3FixSrcList() f
2b60: 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 54  or details..*/.T
2b70: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63  able *sqlite3Loc
2b80: 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a 20 20  ateTableItem(.  
2b90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
2ba0: 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 0a 20    int isView, . 
2bb0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2bc0: 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e  item *p.){.  con
2bd0: 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  st char *zDb;.  
2be0: 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65  assert( p->pSche
2bf0: 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74  ma==0 || p->zDat
2c00: 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66  abase==0 );.  if
2c10: 28 20 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  ( p->pSchema ){.
2c20: 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
2c30: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
2c40: 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
2c50: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
2c60: 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  zDb = pParse->db
2c70: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
2c80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
2c90: 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61 62 61 73  Db = p->zDatabas
2ca0: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
2cb0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
2cc0: 6c 65 28 70 50 61 72 73 65 2c 20 69 73 56 69 65  le(pParse, isVie
2cd0: 77 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  w, p->zName, zDb
2ce0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  );.}../*.** Loca
2cf0: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
2d00: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2d10: 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20  describes .** a 
2d20: 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
2d30: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
2d40: 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a  of that index.**
2d50: 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66   and the name of
2d60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
2d70: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
2d80: 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e  index..** Return
2d90: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
2da0: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
2db0: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
2dc0: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
2dd0: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a  earched for the.
2de0: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65  ** table and the
2df0: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
2e00: 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65  index is returne
2e10: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
2e20: 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74  .** for duplicat
2e30: 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73  e index names is
2e40: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
2e50: 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20  rch order is.** 
2e60: 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e  TEMP first, then
2e70: 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20   MAIN, then any 
2e80: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
2e90: 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69  ses added.** usi
2ea0: 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f  ng the ATTACH co
2eb0: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20  mmand..*/.Index 
2ec0: 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65  *sqlite3FindInde
2ed0: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  x(sqlite3 *db, c
2ee0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2ef0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
2f00: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  b){.  Index *p =
2f10: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   0;.  int i;.  i
2f20: 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  nt nName = sqlit
2f30: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
2f40: 29 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  );.  /* All mute
2f50: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
2f60: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2f70: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2f80: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2f90: 20 20 61 73 73 65 72 74 28 20 7a 44 62 21 3d 30    assert( zDb!=0
2fa0: 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65   || sqlite3Btree
2fb0: 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28  HoldsAllMutexes(
2fc0: 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f  db) );.  for(i=O
2fd0: 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62  MIT_TEMPDB; i<db
2fe0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
2ff0: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
3000: 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65   i^1 : i;  /* Se
3010: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
3020: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68   MAIN */.    Sch
3030: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64  ema *pSchema = d
3040: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d  b->aDb[j].pSchem
3050: 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  a;.    assert( p
3060: 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66  Schema );.    if
3070: 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33  ( zDb && sqlite3
3080: 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d  StrICmp(zDb, db-
3090: 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29  >aDb[j].zName) )
30a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
30b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
30c0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
30d0: 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  , j, 0) );.    p
30e0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
30f0: 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  nd(&pSchema->idx
3100: 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Hash, zName, nNa
3110: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29  me);.    if( p )
3120: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
3130: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
3140: 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d   Reclaim the mem
3150: 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20 69  ory used by an i
3160: 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ndex.*/.static v
3170: 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28 73 71  oid freeIndex(sq
3180: 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78  lite3 *db, Index
3190: 20 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51   *p){.#ifndef SQ
31a0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a  LITE_OMIT_ANALYZ
31b0: 45 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74  E.  sqlite3Delet
31c0: 65 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 64 62  eIndexSamples(db
31d0: 2c 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  , p);.#endif.  i
31e0: 66 28 20 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e  f( db==0 || db->
31f0: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
3200: 29 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ) sqlite3KeyInfo
3210: 55 6e 72 65 66 28 70 2d 3e 70 4b 65 79 49 6e 66  Unref(p->pKeyInf
3220: 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  o);.  sqlite3Exp
3230: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70  rDelete(db, p->p
3240: 50 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a 20  PartIdxWhere);. 
3250: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3260: 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  b, p->zColAff);.
3270: 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 69 7a    if( p->isResiz
3280: 65 64 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  ed ) sqlite3DbFr
3290: 65 65 28 64 62 2c 20 70 2d 3e 61 7a 43 6f 6c 6c  ee(db, p->azColl
32a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
32b0: 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
32c0: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65  .** For the inde
32d0: 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d  x called zIdxNam
32e0: 65 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64  e which is found
32f0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
3300: 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20   iDb,.** unlike 
3310: 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20  that index from 
3320: 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72  its Table then r
3330: 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
3340: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65  from.** the inde
3350: 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  x hash table and
3360: 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   free all memory
3370: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
3380: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
3390: 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  he index..*/.voi
33a0: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
33b0: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  ndDeleteIndex(sq
33c0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
33d0: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
33e0: 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  zIdxName){.  Ind
33f0: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ex *pIndex;.  in
3400: 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70  t len;.  Hash *p
3410: 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28  Hash;..  assert(
3420: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3430: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3440: 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d   0) );.  pHash =
3450: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70   &db->aDb[iDb].p
3460: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b  Schema->idxHash;
3470: 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33  .  len = sqlite3
3480: 53 74 72 6c 65 6e 33 30 28 7a 49 64 78 4e 61 6d  Strlen30(zIdxNam
3490: 65 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  e);.  pIndex = s
34a0: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
34b0: 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65  (pHash, zIdxName
34c0: 2c 20 6c 65 6e 2c 20 30 29 3b 0a 20 20 69 66 28  , len, 0);.  if(
34d0: 20 41 4c 57 41 59 53 28 70 49 6e 64 65 78 29 20   ALWAYS(pIndex) 
34e0: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  ){.    if( pInde
34f0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
3500: 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  x==pIndex ){.   
3510: 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c     pIndex->pTabl
3520: 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  e->pIndex = pInd
3530: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ex->pNext;.    }
3540: 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65  else{.      Inde
3550: 78 20 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a  x *p;.      /* J
3560: 75 73 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20  ustification of 
3570: 41 4c 57 41 59 53 28 29 3b 20 20 54 68 65 20 69  ALWAYS();  The i
3580: 6e 64 65 78 20 6d 75 73 74 20 62 65 20 6f 6e 20  ndex must be on 
3590: 74 68 65 20 6c 69 73 74 20 6f 66 0a 20 20 20 20  the list of.    
35a0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f    ** indices. */
35b0: 0a 20 20 20 20 20 20 70 20 3d 20 70 49 6e 64 65  .      p = pInde
35c0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65  x->pTable->pInde
35d0: 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
35e0: 41 4c 57 41 59 53 28 70 29 20 26 26 20 70 2d 3e  ALWAYS(p) && p->
35f0: 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 20 29 7b  pNext!=pIndex ){
3600: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d   p = p->pNext; }
3610: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
3620: 53 28 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d  S(p && p->pNext=
3630: 3d 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20  =pIndex) ){.    
3640: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
3650: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
3660: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
3670: 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49  freeIndex(db, pI
3680: 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d  ndex);.  }.  db-
3690: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
36a0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
36b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68  }../*.** Look th
36c0: 72 6f 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f  rough the list o
36d0: 66 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  f open database 
36e0: 66 69 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44 62  files in db->aDb
36f0: 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79  [] and if.** any
3700: 20 68 61 76 65 20 62 65 65 6e 20 63 6c 6f 73 65   have been close
3710: 64 2c 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66  d, remove them f
3720: 72 6f 6d 20 74 68 65 20 6c 69 73 74 2e 20 20 52  rom the list.  R
3730: 65 61 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a  eallocate the.**
3740: 20 64 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63   db->aDb[] struc
3750: 74 75 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65  ture to a smalle
3760: 72 20 73 69 7a 65 2c 20 69 66 20 70 6f 73 73 69  r size, if possi
3770: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79  ble..**.** Entry
3780: 20 30 20 28 74 68 65 20 22 6d 61 69 6e 22 20 64   0 (the "main" d
3790: 61 74 61 62 61 73 65 29 20 61 6e 64 20 65 6e 74  atabase) and ent
37a0: 72 79 20 31 20 28 74 68 65 20 22 74 65 6d 70 22  ry 1 (the "temp"
37b0: 20 64 61 74 61 62 61 73 65 29 0a 2a 2a 20 61 72   database).** ar
37c0: 65 20 6e 65 76 65 72 20 63 61 6e 64 69 64 61 74  e never candidat
37d0: 65 73 20 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c  es for being col
37e0: 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  lapsed..*/.void 
37f0: 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44  sqlite3CollapseD
3800: 61 74 61 62 61 73 65 41 72 72 61 79 28 73 71 6c  atabaseArray(sql
3810: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
3820: 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a   i, j;.  for(i=j
3830: 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =2; i<db->nDb; i
3840: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
3850: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
3860: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
3870: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
3880: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
3890: 65 28 64 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65  e(db, pDb->zName
38a0: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  );.      pDb->zN
38b0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ame = 0;.      c
38c0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
38d0: 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20     if( j<i ){.  
38e0: 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d      db->aDb[j] =
38f0: 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20   db->aDb[i];.   
3900: 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a   }.    j++;.  }.
3910: 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44    memset(&db->aD
3920: 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44  b[j], 0, (db->nD
3930: 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b-j)*sizeof(db->
3940: 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e  aDb[j]));.  db->
3950: 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64  nDb = j;.  if( d
3960: 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d  b->nDb<=2 && db-
3970: 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb!=db->aDbSta
3980: 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  tic ){.    memcp
3990: 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c  y(db->aDbStatic,
39a0: 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65   db->aDb, 2*size
39b0: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b  of(db->aDb[0]));
39c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
39d0: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b  ee(db, db->aDb);
39e0: 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  .    db->aDb = d
39f0: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20  b->aDbStatic;.  
3a00: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74  }.}../*.** Reset
3a10: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20   the schema for 
3a20: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
3a30: 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f  index iDb.  Also
3a40: 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45   reset the.** TE
3a50: 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 76 6f  MP schema..*/.vo
3a60: 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f  id sqlite3ResetO
3a70: 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  neSchema(sqlite3
3a80: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
3a90: 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 61 73 73    Db *pDb;.  ass
3aa0: 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62  ert( iDb<db->nDb
3ab0: 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 73 65 20 31   );..  /* Case 1
3ac0: 3a 20 20 52 65 73 65 74 20 74 68 65 20 73 69 6e  :  Reset the sin
3ad0: 67 6c 65 20 73 63 68 65 6d 61 20 69 64 65 6e 74  gle schema ident
3ae0: 69 66 69 65 64 20 62 79 20 69 44 62 20 2a 2f 0a  ified by iDb */.
3af0: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
3b00: 5b 69 44 62 5d 3b 0a 20 20 61 73 73 65 72 74 28  [iDb];.  assert(
3b10: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
3b20: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
3b30: 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28   0) );.  assert(
3b40: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30   pDb->pSchema!=0
3b50: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 68   );.  sqlite3Sch
3b60: 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53  emaClear(pDb->pS
3b70: 63 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a 20 49 66  chema);..  /* If
3b80: 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 6f 74   any database ot
3b90: 68 65 72 20 74 68 61 6e 20 54 45 4d 50 20 69 73  her than TEMP is
3ba0: 20 72 65 73 65 74 2c 20 74 68 65 6e 20 61 6c 73   reset, then als
3bb0: 6f 20 72 65 73 65 74 20 54 45 4d 50 0a 20 20 2a  o reset TEMP.  *
3bc0: 2a 20 73 69 6e 63 65 20 54 45 4d 50 20 6d 69 67  * since TEMP mig
3bd0: 68 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 74 72  ht be holding tr
3be0: 69 67 67 65 72 73 20 74 68 61 74 20 72 65 66 65  iggers that refe
3bf0: 72 65 6e 63 65 20 74 61 62 6c 65 73 20 69 6e 20  rence tables in 
3c00: 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 64  the.  ** other d
3c10: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
3c20: 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20  if( iDb!=1 ){.  
3c30: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
3c40: 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [1];.    assert(
3c50: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30   pDb->pSchema!=0
3c60: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   );.    sqlite3S
3c70: 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e  chemaClear(pDb->
3c80: 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
3c90: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
3ca0: 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d   Erase all schem
3cb0: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  a information fr
3cc0: 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  om all attached 
3cd0: 64 61 74 61 62 61 73 65 73 20 28 69 6e 63 6c 75  databases (inclu
3ce0: 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61  ding.** "main" a
3cf0: 6e 64 20 22 74 65 6d 70 22 29 20 66 6f 72 20 61  nd "temp") for a
3d00: 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
3d10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
3d20: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65  void sqlite3Rese
3d30: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
3d40: 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  nection(sqlite3 
3d50: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
3d60: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
3d70: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72  erAll(db);.  for
3d80: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
3d90: 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70   i++){.    Db *p
3da0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
3db0: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
3dc0: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
3dd0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65  sqlite3SchemaCle
3de0: 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29  ar(pDb->pSchema)
3df0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62  ;.    }.  }.  db
3e00: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
3e10: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
3e20: 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55  ;.  sqlite3VtabU
3e30: 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20  nlockList(db);. 
3e40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
3e50: 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c  veAll(db);.  sql
3e60: 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61  ite3CollapseData
3e70: 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 7d  baseArray(db);.}
3e80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3e90: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
3ea0: 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63  hen a commit occ
3eb0: 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  urs..*/.void sql
3ec0: 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
3ed0: 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  alChanges(sqlite
3ee0: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c  3 *db){.  db->fl
3ef0: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
3f00: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
3f10: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d 65  ./*.** Delete me
3f20: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 66  mory allocated f
3f30: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
3f40: 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  mes of a table o
3f50: 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a 20 54  r view (the.** T
3f60: 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72 61  able.aCol[] arra
3f70: 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  y)..*/.static vo
3f80: 69 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 43  id sqliteDeleteC
3f90: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74  olumnNames(sqlit
3fa0: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70  e3 *db, Table *p
3fb0: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
3fc0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
3fd0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c  .  assert( pTabl
3fe0: 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70  e!=0 );.  if( (p
3ff0: 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43  Col = pTable->aC
4000: 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f  ol)!=0 ){.    fo
4010: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d  r(i=0; i<pTable-
4020: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
4030: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
4040: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
4050: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
4060: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4070: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
4080: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
4090: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f  e3DbFree(db, pCo
40a0: 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->zDflt);.     
40b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
40c0: 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b  b, pCol->zType);
40d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
40e0: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a  Free(db, pCol->z
40f0: 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Coll);.    }.   
4100: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4110: 62 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29  b, pTable->aCol)
4120: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
4130: 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79  emove the memory
4140: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
4150: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4160: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61   the given.** Ta
4170: 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73  ble.  No changes
4180: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73   are made to dis
4190: 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  k by this routin
41a0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
41b0: 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74  utine just delet
41c0: 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75  es the data stru
41d0: 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20  cture.  It does 
41e0: 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68  not unlink.** th
41f0: 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72  e table data str
4200: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
4210: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74  hash table.  But
4220: 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79   it does destroy
4230: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  .** memory struc
4240: 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64  tures of the ind
4250: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
4260: 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64   keys associated
4270: 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61   with .** the ta
4280: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ble..**.** The d
4290: 62 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f  b parameter is o
42a0: 70 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73 20  ptional.  It is 
42b0: 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 54 61  needed if the Ta
42c0: 62 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63  ble object .** c
42d0: 6f 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69 64  ontains lookasid
42e0: 65 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62 6c  e memory.  (Tabl
42f0: 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65  e objects in the
4300: 20 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20 75   schema do not u
4310: 73 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20  se.** lookaside 
4320: 6d 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d 65  memory, but some
4330: 20 65 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65   ephemeral Table
4340: 20 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20 20 4f   objects do.)  O
4350: 72 20 74 68 65 0a 2a 2a 20 64 62 20 70 61 72 61  r the.** db para
4360: 6d 65 74 65 72 20 63 61 6e 20 62 65 20 75 73 65  meter can be use
4370: 64 20 77 69 74 68 20 64 62 2d 3e 70 6e 42 79 74  d with db->pnByt
4380: 65 73 46 72 65 65 64 20 74 6f 20 6d 65 61 73 75  esFreed to measu
4390: 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a  re the memory.**
43a0: 20 75 73 65 64 20 62 79 20 74 68 65 20 54 61 62   used by the Tab
43b0: 6c 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f  le object..*/.vo
43c0: 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  id sqlite3Delete
43d0: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
43e0: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
43f0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  ){.  Index *pInd
4400: 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 54 45  ex, *pNext;.  TE
4410: 53 54 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c 6f 6f  STONLY( int nLoo
4420: 6b 61 73 69 64 65 3b 20 29 20 2f 2a 20 55 73 65  kaside; ) /* Use
4430: 64 20 74 6f 20 76 65 72 69 66 79 20 6c 6f 6f 6b  d to verify look
4440: 61 73 69 64 65 20 6e 6f 74 20 75 73 65 64 20 66  aside not used f
4450: 6f 72 20 73 63 68 65 6d 61 20 2a 2f 0a 0a 20 20  or schema */..  
4460: 61 73 73 65 72 74 28 20 21 70 54 61 62 6c 65 20  assert( !pTable 
4470: 7c 7c 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e  || pTable->nRef>
4480: 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  0 );..  /* Do no
4490: 74 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62  t delete the tab
44a0: 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66  le until the ref
44b0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61  erence count rea
44c0: 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20  ches zero. */.  
44d0: 69 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65  if( !pTable ) re
44e0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64  turn;.  if( ((!d
44f0: 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73  b || db->pnBytes
4500: 46 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d  Freed==0) && (--
4510: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 29 3e 30 29  pTable->nRef)>0)
4520: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a   ) return;..  /*
4530: 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   Record the numb
4540: 65 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  er of outstandin
4550: 67 20 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f  g lookaside allo
4560: 63 61 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d  cations in schem
4570: 61 20 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72  a Tables.  ** pr
4580: 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79  ior to doing any
4590: 20 66 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f   free() operatio
45a0: 6e 73 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d  ns.  Since schem
45b0: 61 20 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20  a Tables do not 
45c0: 75 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69  use.  ** lookasi
45d0: 64 65 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20  de, this number 
45e0: 73 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67  should not chang
45f0: 65 2e 20 2a 2f 0a 20 20 54 45 53 54 4f 4e 4c 59  e. */.  TESTONLY
4600: 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 28  ( nLookaside = (
4610: 64 62 20 26 26 20 28 70 54 61 62 6c 65 2d 3e 74  db && (pTable->t
4620: 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
4630: 65 6d 65 72 61 6c 29 3d 3d 30 29 20 3f 0a 20 20  emeral)==0) ?.  
4640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4650: 20 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61         db->looka
4660: 73 69 64 65 2e 6e 4f 75 74 20 3a 20 30 20 29 3b  side.nOut : 0 );
4670: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c  ..  /* Delete al
4680: 6c 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  l indices associ
4690: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74  ated with this t
46a0: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
46b0: 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e  Index = pTable->
46c0: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
46d0: 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20  pIndex=pNext){. 
46e0: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
46f0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73  x->pNext;.    as
4700: 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53  sert( pIndex->pS
4710: 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70  chema==pTable->p
4720: 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66  Schema );.    if
4730: 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42  ( !db || db->pnB
4740: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a  ytesFreed==0 ){.
4750: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
4760: 65 20 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  e = pIndex->zNam
4770: 65 3b 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e  e; .      TESTON
4780: 4c 59 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64  LY ( Index *pOld
4790: 20 3d 20 29 20 73 71 6c 69 74 65 33 48 61 73 68   = ) sqlite3Hash
47a0: 49 6e 73 65 72 74 28 0a 20 20 20 20 20 20 20 20  Insert(.        
47b0: 20 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d   &pIndex->pSchem
47c0: 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  a->idxHash, zNam
47d0: 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
47e0: 33 30 28 7a 4e 61 6d 65 29 2c 20 30 0a 20 20 20  30(zName), 0.   
47f0: 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
4800: 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c  rt( db==0 || sql
4810: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
4820: 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65  eld(db, 0, pInde
4830: 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  x->pSchema) );. 
4840: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
4850: 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c  d==pIndex || pOl
4860: 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  d==0 );.    }.  
4870: 20 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20    freeIndex(db, 
4880: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20  pIndex);.  }..  
4890: 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66 6f  /* Delete any fo
48a0: 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61 63  reign keys attac
48b0: 68 65 64 20 74 6f 20 74 68 69 73 20 74 61 62 6c  hed to this tabl
48c0: 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46  e. */.  sqlite3F
48d0: 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  kDelete(db, pTab
48e0: 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  le);..  /* Delet
48f0: 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
4900: 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20  cture itself..  
4910: 2a 2f 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74  */.  sqliteDelet
4920: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c  eColumnNames(db,
4930: 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69   pTable);.  sqli
4940: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
4950: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
4960: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4970: 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66  , pTable->zColAf
4980: 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  f);.  sqlite3Sel
4990: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  ectDelete(db, pT
49a0: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  able->pSelect);.
49b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
49c0: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c 69  MIT_CHECK.  sqli
49d0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
49e0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43  e(db, pTable->pC
49f0: 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 23 69  heck);.#endif.#i
4a00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4a10: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
4a20: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61   sqlite3VtabClea
4a30: 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 23  r(db, pTable);.#
4a40: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44  endif.  sqlite3D
4a50: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
4a60: 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
4a70: 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64  that no lookasid
4a80: 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73 65  e memory was use
4a90: 64 20 62 79 20 73 63 68 65 6d 61 20 74 61 62 6c  d by schema tabl
4aa0: 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
4ab0: 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c 7c  nLookaside==0 ||
4ac0: 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64 62 2d   nLookaside==db-
4ad0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
4ae0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  );.}../*.** Unli
4af0: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  nk the given tab
4b00: 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  le from the hash
4b10: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20   tables and the 
4b20: 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61  delete the.** ta
4b30: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69  ble structure wi
4b40: 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63  th all its indic
4b50: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
4b60: 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  eys..*/.void sql
4b70: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
4b80: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
4b90: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
4ba0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e  onst char *zTabN
4bb0: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
4bc0: 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  ;.  Db *pDb;..  
4bd0: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
4be0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
4bf0: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
4c00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54   );.  assert( zT
4c10: 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65  abName );.  asse
4c20: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
4c30: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
4c40: 44 62 2c 20 30 29 20 29 3b 0a 20 20 74 65 73 74  Db, 0) );.  test
4c50: 63 61 73 65 28 20 7a 54 61 62 4e 61 6d 65 5b 30  case( zTabName[0
4c60: 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65 72 6f  ]==0 );  /* Zero
4c70: 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65 20 6e 61  -length table na
4c80: 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  mes are allowed 
4c90: 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  */.  pDb = &db->
4ca0: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20  aDb[iDb];.  p = 
4cb0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
4cc0: 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
4cd0: 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61  >tblHash, zTabNa
4ce0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
4d00: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 61 62  te3Strlen30(zTab
4d10: 4e 61 6d 65 29 2c 30 29 3b 0a 20 20 73 71 6c 69  Name),0);.  sqli
4d20: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64  te3DeleteTable(d
4d30: 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61  b, p);.  db->fla
4d40: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
4d50: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
4d60: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b  *.** Given a tok
4d70: 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72  en, return a str
4d80: 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74  ing that consist
4d90: 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66  s of the text of
4da0: 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20   that.** token. 
4db0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
4dc0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
4dd0: 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  ng.** is obtaine
4de0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
4df0: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
4e00: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
4e10: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
4e20: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75  on..**.** Any qu
4e30: 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65  otation marks (e
4e40: 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d  x:  "name", 'nam
4e50: 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60  e', [name], or `
4e60: 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73  name`) that.** s
4e70: 75 72 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79  urround the body
4e80: 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72   of the token ar
4e90: 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a  e removed..**.**
4ea0: 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65   Tokens are ofte
4eb0: 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20  n just pointers 
4ec0: 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
4ed0: 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73  l SQL text and s
4ee0: 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30  o.** are not \00
4ef0: 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64  0 terminated and
4f00: 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74   are not persist
4f10: 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ent.  The return
4f20: 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  ed string.** is 
4f30: 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20  \000 terminated 
4f40: 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65 6e  and is persisten
4f50: 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  t..*/.char *sqli
4f60: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
4f70: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
4f80: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63  ken *pName){.  c
4f90: 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66  har *zName;.  if
4fa0: 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a  ( pName ){.    z
4fb0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
4fc0: 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61  StrNDup(db, (cha
4fd0: 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61  r*)pName->z, pNa
4fe0: 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69  me->n);.    sqli
4ff0: 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
5000: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
5010: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zName = 0;.  }. 
5020: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
5030: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
5040: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
5050: 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64  able stored in d
5060: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69  atabase number i
5070: 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  Db for.** writin
5080: 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  g. The table is 
5090: 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72  opened using cur
50a0: 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sor 0..*/.void s
50b0: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
50c0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20  Table(Parse *p, 
50d0: 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
50e0: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
50f0: 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  Vdbe(p);.  sqlit
5100: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  e3TableLock(p, i
5110: 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  Db, MASTER_ROOT,
5120: 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45   1, SCHEMA_TABLE
5130: 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65  (iDb));.  sqlite
5140: 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
5150: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
5160: 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  0, MASTER_ROOT, 
5170: 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70  iDb, 5);.  if( p
5180: 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ->nTab==0 ){.   
5190: 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20   p->nTab = 1;.  
51a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  }.}../*.** Param
51b0: 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74  eter zName point
51c0: 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69  s to a nul-termi
51d0: 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e  nated buffer con
51e0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
51f0: 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73  .** of a databas
5200: 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70  e ("main", "temp
5210: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
5220: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
5230: 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
5240: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69  on returns the i
5250: 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65  ndex of the name
5260: 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62  d database in db
5270: 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d  ->aDb[], or.** -
5280: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
5290: 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  b cannot be foun
52a0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
52b0: 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69  3FindDbName(sqli
52c0: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
52d0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
52e0: 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20  nt i = -1;      
52f0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5300: 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a  umber */.  if( z
5310: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a  Name ){.    Db *
5320: 70 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  pDb;.    int n =
5330: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
5340: 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72  (zName);.    for
5350: 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20  (i=(db->nDb-1), 
5360: 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  pDb=&db->aDb[i];
5370: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d   i>=0; i--, pDb-
5380: 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 21  -){.      if( (!
5390: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69  OMIT_TEMPDB || i
53a0: 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73 71 6c 69  !=1 ) && n==sqli
53b0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62 2d  te3Strlen30(pDb-
53c0: 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20  >zName) && .    
53d0: 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33        0==sqlite3
53e0: 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61  StrICmp(pDb->zNa
53f0: 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  me, zName) ){.  
5400: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5410: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
5420: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
5430: 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70  .** The token *p
5440: 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Name contains th
5450: 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61  e name of a data
5460: 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d 61  base (either "ma
5470: 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22  in" or.** "temp"
5480: 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   or the name of 
5490: 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e  an attached db).
54a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
54b0: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64  turns the.** ind
54c0: 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  ex of the named 
54d0: 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e  database in db->
54e0: 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20  aDb[], or -1 if 
54f0: 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a  the named db .**
5500: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
5510: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
5520: 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64  indDb(sqlite3 *d
5530: 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  b, Token *pName)
5540: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5560: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
5570: 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  base number */. 
5580: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55a0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65        /* Name we
55b0: 20 61 72 65 20 73 65 61 72 63 68 69 6e 67 20 66   are searching f
55c0: 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20  or */.  zName = 
55d0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
55e0: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
55f0: 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 46 69  .  i = sqlite3Fi
5600: 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e 61  ndDbName(db, zNa
5610: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
5620: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
5630: 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a  .  return i;.}..
5640: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20  /* The table or 
5650: 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20  view or trigger 
5660: 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64 20 74  name is passed t
5670: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76  o this routine v
5680: 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61  ia tokens.** pNa
5690: 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20  me1 and pName2. 
56a0: 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  If the table nam
56b0: 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c  e was fully qual
56c0: 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70  ified, for examp
56d0: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45  le:.**.** CREATE
56e0: 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28   TABLE xxx.yyy (
56f0: 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65  ...);.** .** The
5700: 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20  n pName1 is set 
5710: 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61  to "xxx" and pNa
5720: 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68  me2 "yyy". On th
5730: 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a  e other hand if.
5740: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  ** the table nam
5750: 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71  e is not fully q
5760: 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a  ualified, i.e.:.
5770: 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42  **.** CREATE TAB
5780: 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a  LE yyy(...);.**.
5790: 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69  ** Then pName1 i
57a0: 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61  s set to "yyy" a
57b0: 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e  nd pName2 is "".
57c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
57d0: 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70 70  ine sets the *pp
57e0: 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74  Unqual pointer t
57f0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74  o point at the t
5800: 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a  oken (pName1 or.
5810: 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20  ** pName2) that 
5820: 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61  stores the unqua
5830: 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d  lified table nam
5840: 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66  e.  The index of
5850: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
5860: 20 22 78 78 78 22 20 69 73 20 72 65 74 75 72 6e   "xxx" is return
5870: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
5880: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20  e3TwoPartName(. 
5890: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
58a0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
58b0: 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74  and code generat
58c0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
58d0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
58e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78       /* The "xxx
58f0: 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78  " in the name "x
5900: 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22  xx.yyy" or "xxx"
5910: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
5920: 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  me2,      /* The
5930: 20 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61   "yyy" in the na
5940: 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a  me "xxx.yyy" */.
5950: 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61    Token **pUnqua
5960: 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  l     /* Write t
5970: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f  he unqualified o
5980: 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20  bject name here 
5990: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b  */.){.  int iDb;
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59b0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
59c0: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65  holding the obje
59d0: 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ct */.  sqlite3 
59e0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
59f0: 3b 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  ;..  if( ALWAYS(
5a00: 70 4e 61 6d 65 32 21 3d 30 29 20 26 26 20 70 4e  pName2!=0) && pN
5a10: 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  ame2->n>0 ){.   
5a20: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
5a30: 73 79 20 29 20 7b 0a 20 20 20 20 20 20 73 71 6c  sy ) {.      sql
5a40: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5a50: 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20 64 61  rse, "corrupt da
5a60: 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20  tabase");.      
5a70: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
5a80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
5a90: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71  .    }.    *pUnq
5aa0: 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20  ual = pName2;.  
5ab0: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46    iDb = sqlite3F
5ac0: 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31  indDb(db, pName1
5ad0: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
5ae0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5af0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5b00: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62  , "unknown datab
5b10: 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29  ase %T", pName1)
5b20: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
5b30: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
5b40: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
5b50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
5b60: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  rt( db->init.iDb
5b70: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e  ==0 || db->init.
5b80: 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20  busy );.    iDb 
5b90: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
5ba0: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
5bb0: 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74  Name1;.  }.  ret
5bc0: 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn iDb;.}../*.*
5bd0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
5be0: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
5bf0: 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  if the UTF-8 str
5c00: 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c  ing zName is a l
5c10: 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66  egal.** unqualif
5c20: 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ied name for a n
5c30: 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  ew schema object
5c40: 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20   (table, index, 
5c50: 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67  view or.** trigg
5c60: 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61  er). All names a
5c70: 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20  re legal except 
5c80: 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e  those that begin
5c90: 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
5ca0: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69  .** "sqlite_" (i
5cb0: 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f  n upper, lower o
5cc0: 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54  r mixed case). T
5cd0: 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  his portion of t
5ce0: 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20  he namespace.** 
5cf0: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
5d00: 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f  internal use..*/
5d10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
5d20: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73  kObjectName(Pars
5d30: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
5d40: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
5d50: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
5d60: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
5d70: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
5d80: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
5d90: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
5da0: 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65  s & SQLITE_Write
5db0: 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20  Schema)==0.     
5dc0: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
5dd0: 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65  e3StrNICmp(zName
5de0: 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20  , "sqlite_", 7) 
5df0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
5e00: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
5e10: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65  object name rese
5e20: 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  rved for interna
5e30: 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d  l use: %s", zNam
5e40: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
5e50: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
5e60: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5e70: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
5e80: 74 75 72 6e 20 74 68 65 20 50 52 49 4d 41 52 59  turn the PRIMARY
5e90: 20 4b 45 59 20 69 6e 64 65 78 20 6f 66 20 61 20   KEY index of a 
5ea0: 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a  table.*/.Index *
5eb0: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
5ec0: 79 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54  yIndex(Table *pT
5ed0: 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b  ab){.  Index *p;
5ee0: 0a 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70  .  for(p=pTab->p
5ef0: 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d 3e 61  Index; p && p->a
5f00: 75 74 6f 49 6e 64 65 78 21 3d 32 3b 20 70 3d 70  utoIndex!=2; p=p
5f10: 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 72 65 74  ->pNext){}.  ret
5f20: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
5f30: 52 65 74 75 72 6e 20 74 68 65 20 63 6f 6c 75 6d  Return the colum
5f40: 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 20  n of index pIdx 
5f50: 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  that corresponds
5f60: 20 74 6f 20 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c   to table.** col
5f70: 75 6d 6e 20 69 43 6f 6c 2e 20 20 52 65 74 75 72  umn iCol.  Retur
5f80: 6e 20 2d 31 20 69 66 20 6e 6f 74 20 66 6f 75 6e  n -1 if not foun
5f90: 64 2e 0a 2a 2f 0a 69 31 36 20 73 71 6c 69 74 65  d..*/.i16 sqlite
5fa0: 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 49  3ColumnOfIndex(I
5fb0: 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 31 36 20  ndex *pIdx, i16 
5fc0: 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iCol){.  int i;.
5fd0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
5fe0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29  x->nColumn; i++)
5ff0: 7b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d  {.    if( iCol==
6000: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
6010: 5d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  ] ) return i;.  
6020: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
6030: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f  ../*.** Begin co
6040: 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77  nstructing a new
6050: 20 74 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74   table represent
6060: 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e  ation in memory.
6070: 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65    This is.** the
6080: 20 66 69 72 73 74 20 6f 66 20 73 65 76 65 72 61   first of severa
6090: 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  l action routine
60a0: 73 20 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65  s that get calle
60b0: 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a  d in response.**
60c0: 20 74 6f 20 61 20 43 52 45 41 54 45 20 54 41 42   to a CREATE TAB
60d0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49  LE statement.  I
60e0: 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68  n particular, th
60f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
6100: 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65  lled.** after se
6110: 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45  eing tokens "CRE
6120: 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22  ATE" and "TABLE"
6130: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e   and the table n
6140: 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d 70 0a  ame. The isTemp.
6150: 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 20  ** flag is true 
6160: 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f  if the table sho
6170: 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e  uld be stored in
6180: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64   the auxiliary d
6190: 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
61a0: 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68  instead of in th
61b0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
61c0: 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e  file.  This is n
61d0: 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65  ormally the case
61e0: 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45  .** when the "TE
61f0: 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52  MP" or "TEMPORAR
6200: 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72  Y" keyword occur
6210: 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20  s in between.** 
6220: 43 52 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45  CREATE and TABLE
6230: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20  ..**.** The new 
6240: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20  table record is 
6250: 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20  initialized and 
6260: 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70  put in pParse->p
6270: 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20  NewTable..** As 
6280: 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52 45 41  more of the CREA
6290: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
62a0: 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20 61 64  nt is parsed, ad
62b0: 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a  ditional action.
62c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c  ** routines will
62d0: 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64   be called to ad
62e0: 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69  d more informati
62f0: 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72  on to this recor
6300: 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  d..** At the end
6310: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
6320: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20  ABLE statement, 
6330: 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61  the sqlite3EndTa
6340: 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  ble() routine.**
6350: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f   is called to co
6360: 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74  mplete the const
6370: 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  ruction of the n
6380: 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e  ew table record.
6390: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
63a0: 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61  StartTable(.  Pa
63b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f  rse *pParse,   /
63c0: 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74  * Parser context
63d0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
63e0: 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20  me1,   /* First 
63f0: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
6400: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
6410: 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
6420: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53   *pName2,   /* S
6430: 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68  econd part of th
6440: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
6450: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
6460: 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20   int isTemp,    
6470: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
6480: 73 20 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c  s is a TEMP tabl
6490: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65  e */.  int isVie
64a0: 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  w,      /* True 
64b0: 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49 45  if this is a VIE
64c0: 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 72  W */.  int isVir
64d0: 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20  tual,   /* True 
64e0: 69 66 20 74 68 69 73 20 69 73 20 61 20 56 49 52  if this is a VIR
64f0: 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TUAL table */.  
6500: 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20  int noErr       
6510: 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69   /* Do nothing i
6520: 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  f table already 
6530: 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54  exists */.){.  T
6540: 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20  able *pTable;.  
6550: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b  char *zName = 0;
6560: 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20   /* The name of 
6570: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f  the new table */
6580: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
6590: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
65a0: 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44  dbe *v;.  int iD
65b0: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  b;         /* Da
65c0: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f  tabase number to
65d0: 20 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c   create the tabl
65e0: 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  e in */.  Token 
65f0: 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e  *pName;    /* Un
6600: 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f  qualified name o
6610: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63  f the table to c
6620: 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54  reate */..  /* T
6630: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
6640: 20 6e 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20   name to create 
6650: 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  is passed to thi
6660: 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f  s routine via to
6670: 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31  kens.  ** pName1
6680: 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20   and pName2. If 
6690: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
66a0: 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  as fully qualifi
66b0: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a  ed, for example:
66c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54  .  **.  ** CREAT
66d0: 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20  E TABLE xxx.yyy 
66e0: 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a  (...);.  ** .  *
66f0: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
6700: 20 73 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e   set to "xxx" an
6710: 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20  d pName2 "yyy". 
6720: 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
6730: 64 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61  d if.  ** the ta
6740: 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20  ble name is not 
6750: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
6760: 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   i.e.:.  **.  **
6770: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79   CREATE TABLE yy
6780: 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a  y(...);.  **.  *
6790: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
67a0: 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e   set to "yyy" an
67b0: 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a  d pName2 is ""..
67c0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61    **.  ** The ca
67d0: 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68  ll below sets th
67e0: 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20  e pName pointer 
67f0: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
6800: 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72  token (pName1 or
6810: 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  .  ** pName2) th
6820: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
6830: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
6840: 6e 61 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62  name. The variab
6850: 6c 65 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73  le iDb is.  ** s
6860: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
6870: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
6880: 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f  that the table o
6890: 72 20 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a  r view is to be.
68a0: 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e    ** created in.
68b0: 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71  .  */.  iDb = sq
68c0: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
68d0: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
68e0: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
68f0: 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20  ;.  if( iDb<0 ) 
6900: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f  return;.  if( !O
6910: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
6920: 54 65 6d 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e  Temp && pName2->
6930: 6e 3e 30 20 26 26 20 69 44 62 21 3d 31 20 29 7b  n>0 && iDb!=1 ){
6940: 0a 20 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74  .    /* If creat
6950: 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65  ing a temp table
6960: 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e  , the name may n
6970: 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65 64 2e  ot be qualified.
6980: 20 55 6e 6c 65 73 73 20 0a 20 20 20 20 2a 2a 20   Unless .    ** 
6990: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
69a0: 65 20 69 73 20 22 74 65 6d 70 22 20 61 6e 79 77  e is "temp" anyw
69b0: 61 79 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ay.  */.    sqli
69c0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
69d0: 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74  se, "temporary t
69e0: 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62  able name must b
69f0: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b  e unqualified");
6a00: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6a10: 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d  .  if( !OMIT_TEM
6a20: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 20  PDB && isTemp ) 
6a30: 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72  iDb = 1;..  pPar
6a40: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d  se->sNameToken =
6a50: 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65   *pName;.  zName
6a60: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
6a70: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
6a80: 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  e);.  if( zName=
6a90: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
6aa0: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
6ab0: 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
6ac0: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61  Name(pParse, zNa
6ad0: 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  me) ){.    goto 
6ae0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
6af0: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 2d  r;.  }.  if( db-
6b00: 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 69  >init.iDb==1 ) i
6b10: 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64  sTemp = 1;.#ifnd
6b20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
6b30: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61  UTHORIZATION.  a
6b40: 73 73 65 72 74 28 20 28 69 73 54 65 6d 70 20 26  ssert( (isTemp &
6b50: 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20   1)==isTemp );. 
6b60: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b   {.    int code;
6b70: 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  .    char *zDb =
6b80: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
6b90: 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ame;.    if( sql
6ba0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
6bb0: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53  arse, SQLITE_INS
6bc0: 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ERT, SCHEMA_TABL
6bd0: 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44  E(isTemp), 0, zD
6be0: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
6bf0: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
6c00: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
6c10: 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
6c20: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
6c30: 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a  DB && isTemp ){.
6c40: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
6c50: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
6c60: 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65  P_VIEW;.      }e
6c70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
6c80: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
6c90: 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a  E_VIEW;.      }.
6ca0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6cb0: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
6cc0: 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20  B && isTemp ){. 
6cd0: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
6ce0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
6cf0: 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65  _TABLE;.      }e
6d00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  lse{.        cod
6d10: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
6d20: 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  E_TABLE;.      }
6d30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
6d40: 69 73 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c  isVirtual && sql
6d50: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
6d60: 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d  arse, code, zNam
6d70: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
6d80: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6d90: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
6da0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
6db0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
6dc0: 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20   new table name 
6dd0: 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65  does not collide
6de0: 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e   with an existin
6df0: 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  g.  ** index or 
6e00: 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68  table name in th
6e10: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e  e same database.
6e20: 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72    Issue an error
6e30: 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a   message if.  **
6e40: 20 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78   it does. The ex
6e50: 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68  ception is if th
6e60: 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  e statement bein
6e70: 67 20 70 61 72 73 65 64 20 77 61 73 20 70 61 73  g parsed was pas
6e80: 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73  sed.  ** to an s
6e90: 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
6ea0: 74 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74  tab() call. In t
6eb0: 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68  hat case only th
6ec0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20  e column names. 
6ed0: 20 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69   ** and types wi
6ee0: 6c 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74  ll be used, so t
6ef0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
6f00: 74 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65  to test for name
6f10: 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69  space.  ** colli
6f20: 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  sions..  */.  if
6f30: 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  ( !IN_DECLARE_VT
6f40: 41 42 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  AB ){.    char *
6f50: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
6f60: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
6f70: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
6f80: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
6f90: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20  Parse) ){.      
6fa0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
6fb0: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
6fc0: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
6fd0: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
6fe0: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20  zName, zDb);.   
6ff0: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
7000: 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20       if( !noErr 
7010: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
7020: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7030: 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72  e, "table %T alr
7040: 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e  eady exists", pN
7050: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
7060: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
7070: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
7080: 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  y );.        sql
7090: 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
70a0: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
70b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
70c0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
70d0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
70e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
70f0: 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
7100: 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20  e, zDb)!=0 ){.  
7110: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7120: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 68 65  Msg(pParse, "the
7130: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
7140: 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22   index named %s"
7150: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
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 20 20 7d 0a 20 20  _error;.    }.  
7180: 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71  }..  pTable = sq
7190: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
71a0: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62  o(db, sizeof(Tab
71b0: 6c 65 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62  le));.  if( pTab
71c0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  le==0 ){.    db-
71d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
71e0: 31 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72  1;.    pParse->r
71f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
7200: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45  ;.    pParse->nE
7210: 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62  rr++;.    goto b
7220: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7230: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e  ;.  }.  pTable->
7240: 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
7250: 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d   pTable->iPKey =
7260: 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70   -1;.  pTable->p
7270: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
7280: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  [iDb].pSchema;. 
7290: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20   pTable->nRef = 
72a0: 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f  1;.  pTable->nRo
72b0: 77 45 73 74 20 3d 20 31 30 34 38 35 37 36 3b 0a  wEst = 1048576;.
72c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
72d0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29  ->pNewTable==0 )
72e0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ;.  pParse->pNew
72f0: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
7300: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
7310: 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74   the magic sqlit
7320: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
7330: 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63   used by autoinc
7340: 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65  rement,.  ** the
7350: 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  n record a point
7360: 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  er to this table
7370: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
7380: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a  abase structure.
7390: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53    ** so that INS
73a0: 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65  ERT can find the
73b0: 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20   table easily.. 
73c0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
73d0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
73e0: 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61  EMENT.  if( !pPa
73f0: 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73  rse->nested && s
7400: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  trcmp(zName, "sq
7410: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d  lite_sequence")=
7420: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
7430: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
7440: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
7450: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 54 61 62  , 0) );.    pTab
7460: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  le->pSchema->pSe
7470: 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20  qTab = pTable;. 
7480: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
7490: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
74a0: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
74b0: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
74c0: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
74d0: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
74e0: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
74f0: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
7500: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
7510: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
7520: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
7530: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
7540: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
7550: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
7560: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
7570: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
7580: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
7590: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
75a0: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
75b0: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
75c0: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
75d0: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
75e0: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
75f0: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
7600: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
7610: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
7620: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
7630: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
7640: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
7650: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
7660: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
7670: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
7680: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b  0 ){.    int j1;
7690: 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72  .    int fileFor
76a0: 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  mat;.    int reg
76b0: 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20  1, reg2, reg3;. 
76c0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
76d0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
76e0: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a  arse, 0, iDb);..
76f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7700: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
7710: 0a 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75  .    if( isVirtu
7720: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
7730: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
7740: 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20   OP_VBegin);.   
7750: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
7760: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * If the file fo
7770: 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e  rmat and encodin
7780: 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  g in the databas
7790: 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20  e have not been 
77a0: 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74  set, .    ** set
77b0: 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a   them now..    *
77c0: 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50 61  /.    reg1 = pPa
77d0: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20  rse->regRowid = 
77e0: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
77f0: 20 20 20 20 72 65 67 32 20 3d 20 70 50 61 72 73      reg2 = pPars
7800: 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70  e->regRoot = ++p
7810: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
7820: 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65   reg3 = ++pParse
7830: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
7840: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7850: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
7860: 69 44 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45  iDb, reg3, BTREE
7870: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20  _FILE_FORMAT);. 
7880: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
7890: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
78a0: 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65  .    j1 = sqlite
78b0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
78c0: 50 5f 49 66 2c 20 72 65 67 33 29 3b 0a 20 20 20  P_If, reg3);.   
78d0: 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64   fileFormat = (d
78e0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
78f0: 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29  E_LegacyFileFmt)
7900: 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20  !=0 ?.          
7910: 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49          1 : SQLI
7920: 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d  TE_MAX_FILE_FORM
7930: 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  AT;.    sqlite3V
7940: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
7950: 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46 6f 72  Integer, fileFor
7960: 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  mat, reg3);.    
7970: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7980: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
7990: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 46 49  e, iDb, BTREE_FI
79a0: 4c 45 5f 46 4f 52 4d 41 54 2c 20 72 65 67 33 29  LE_FORMAT, reg3)
79b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
79c0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
79d0: 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29 2c 20  teger, ENC(db), 
79e0: 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg3);.    sqlit
79f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
7a00: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
7a10: 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e  b, BTREE_TEXT_EN
7a20: 43 4f 44 49 4e 47 2c 20 72 65 67 33 29 3b 0a 20  CODING, reg3);. 
7a30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
7a40: 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a  mpHere(v, j1);..
7a50: 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74      /* This just
7a60: 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65   creates a place
7a70: 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69  -holder record i
7a80: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
7a90: 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ter table..    *
7aa0: 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65  * The record cre
7ab0: 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ated does not co
7ac0: 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79  ntain anything y
7ad0: 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  et.  It will be 
7ae0: 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20  replaced.    ** 
7af0: 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72  by the real entr
7b00: 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61  y in code genera
7b10: 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e  ted at sqlite3En
7b20: 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a  dTable()..    **
7b30: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
7b40: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e  d for the new en
7b50: 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72  try is left in r
7b60: 65 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e  egister pParse->
7b70: 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a  regRowid..    **
7b80: 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   The root page n
7b90: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
7ba0: 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69   table is left i
7bb0: 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65  n reg pParse->re
7bc0: 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68  gRoot..    ** Th
7bd0: 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74  e rowid and root
7be0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c   page number val
7bf0: 75 65 73 20 61 72 65 20 6e 65 65 64 65 64 20 62  ues are needed b
7c00: 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a  y the code that.
7c10: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e      ** sqlite3En
7c20: 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65  dTable will gene
7c30: 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  rate..    */.#if
7c40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7c50: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
7c60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7c70: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
7c80: 29 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  ).    if( isView
7c90: 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b   || isVirtual ){
7ca0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7cb0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7cc0: 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29  nteger, 0, reg2)
7cd0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
7ce0: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70  if.    {.      p
7cf0: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
7d00: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
7d10: 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74  dOp2(v, OP_Creat
7d20: 65 54 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67  eTable, iDb, reg
7d30: 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  2);.    }.    sq
7d40: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
7d50: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62  able(pParse, iDb
7d60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7d70: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
7d80: 65 77 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31  ewRowid, 0, reg1
7d90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7da0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
7db0: 75 6c 6c 2c 20 30 2c 20 72 65 67 33 29 3b 0a 20  ull, 0, reg3);. 
7dc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7dd0: 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
7de0: 74 2c 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31  t, 0, reg3, reg1
7df0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7e00: 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
7e10: 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20  FLAG_APPEND);.  
7e20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7e30: 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29  Op0(v, OP_Close)
7e40: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d  ;.  }..  /* Norm
7e50: 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72  al (non-error) r
7e60: 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75  eturn. */.  retu
7e70: 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  rn;..  /* If an 
7e80: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65  error occurs, we
7e90: 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65   jump here */.be
7ea0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a  gin_table_error:
7eb0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
7ec0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  (db, zName);.  r
7ed0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
7ee0: 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73  This macro is us
7ef0: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77  ed to compare tw
7f00: 6f 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63  o strings in a c
7f10: 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20  ase-insensitive 
7f20: 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73  manner..** It is
7f30: 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72   slightly faster
7f40: 20 74 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71   than calling sq
7f50: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 29 20 64  lite3StrICmp() d
7f60: 69 72 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20  irectly, but.** 
7f70: 70 72 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20  produces larger 
7f80: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e  code..**.** WARN
7f90: 49 4e 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20  ING: This macro 
7fa0: 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c  is not compatibl
7fb0: 65 20 77 69 74 68 20 74 68 65 20 73 74 72 63 6d  e with the strcm
7fc0: 70 28 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a  p() family. It.*
7fd0: 2a 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69  * returns true i
7fe0: 66 20 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67  f the two string
7ff0: 73 20 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68  s are equal, oth
8000: 65 72 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f  erwise false..*/
8010: 0a 23 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50  .#define STRICMP
8020: 28 78 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65  (x, y) (\.sqlite
8030: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28  3UpperToLower[*(
8040: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
8050: 28 78 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74  (x)]==   \.sqlit
8060: 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a  e3UpperToLower[*
8070: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
8080: 29 28 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73  )(y)]     \.&& s
8090: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 28 78  qlite3StrICmp((x
80a0: 29 2b 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a  )+1,(y)+1)==0 ).
80b0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
80c0: 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74   column to the t
80d0: 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62  able currently b
80e0: 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
80f0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  ..**.** The pars
8100: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
8110: 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65  utine once for e
8120: 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61  ach column decla
8130: 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43  ration.** in a C
8140: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
8150: 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53  ement.  sqlite3S
8160: 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 74 73  tartTable() gets
8170: 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74   called.** first
8180: 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67   to get things g
8190: 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73  oing.  Then this
81a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
81b0: 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63  ed for each.** c
81c0: 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  olumn..*/.void s
81d0: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28  qlite3AddColumn(
81e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
81f0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
8200: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
8210: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
8220: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
8230: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8240: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
8250: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  (p = pParse->pNe
8260: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74  wTable)==0 ) ret
8270: 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  urn;.#if SQLITE_
8280: 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28  MAX_COLUMN.  if(
8290: 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61   p->nCol+1>db->a
82a0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
82b0: 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
82c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
82d0: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
82e0: 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25  any columns on %
82f0: 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  s", p->zName);. 
8300: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
8310: 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69  endif.  z = sqli
8320: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
8330: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  (db, pName);.  i
8340: 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( z==0 ) return
8350: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
8360: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
8370: 20 20 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c    if( STRICMP(z,
8380: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d   p->aCol[i].zNam
8390: 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
83a0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
83b0: 73 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63  se, "duplicate c
83c0: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c  olumn name: %s",
83d0: 20 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   z);.      sqlit
83e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
83f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
8400: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28     }.  }.  if( (
8410: 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d  p->nCol & 0x7)==
8420: 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  0 ){.    Column 
8430: 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20  *aNew;.    aNew 
8440: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
8450: 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70  oc(db,p->aCol,(p
8460: 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66  ->nCol+8)*sizeof
8470: 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20  (p->aCol[0]));. 
8480: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
8490: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
84a0: 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
84b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
84c0: 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20  }.    p->aCol = 
84d0: 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c  aNew;.  }.  pCol
84e0: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
84f0: 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  Col];.  memset(p
8500: 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  Col, 0, sizeof(p
8510: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70  ->aCol[0]));.  p
8520: 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a  Col->zName = z;.
8530: 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20   .  /* If there 
8540: 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69  is no type speci
8550: 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61  fied, columns ha
8560: 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 61  ve the default a
8570: 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f  ffinity.  ** 'NO
8580: 4e 45 27 2e 20 49 66 20 74 68 65 72 65 20 69 73  NE'. If there is
8590: 20 61 20 74 79 70 65 20 73 70 65 63 69 66 69 65   a type specifie
85a0: 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41  d, then sqlite3A
85b0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77  ddColumnType() w
85c0: 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c  ill.  ** be call
85d0: 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70  ed next to set p
85e0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f  Col->affinity co
85f0: 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20  rrectly..  */.  
8600: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d  pCol->affinity =
8610: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
8620: 3b 0a 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20  ;.  pCol->szEst 
8630: 3d 20 31 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b  = 1;.  p->nCol++
8640: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8650: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8660: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
8670: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
8680: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
8690: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
86a0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22   statement.  A "
86b0: 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
86c0: 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e  aint has.** been
86d0: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
86e0: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
86f0: 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c   sets the notNul
8700: 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65  l flag on.** the
8710: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
8720: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
8730: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
8740: 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28  lite3AddNotNull(
8750: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
8760: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
8770: 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d 20 70  able *p;.  p = p
8780: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
8790: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
87a0: 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29  NEVER(p->nCol<1)
87b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e   ) return;.  p->
87c0: 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e  aCol[p->nCol-1].
87d0: 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e  notNull = (u8)on
87e0: 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Error;.}../*.** 
87f0: 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Scan the column 
8800: 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20  type name zType 
8810: 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61  (length nType) a
8820: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a  nd return the.**
8830: 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66 69   associated affi
8840: 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a  nity type..**.**
8850: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
8860: 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65  es a case-indepe
8870: 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20  ndent search of 
8880: 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a  zType for the .*
8890: 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20  * substrings in 
88a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  the following ta
88b0: 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74  ble. If one of t
88c0: 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 73  he substrings is
88d0: 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63  .** found, the c
88e0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66  orresponding aff
88f0: 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e 65  inity is returne
8900: 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74  d. If zType cont
8910: 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61  ains.** more tha
8920: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62  n one of the sub
8930: 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73  strings, entries
8940: 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20   toward the top 
8950: 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  of .** the table
8960: 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20   take priority. 
8970: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
8980: 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e  zType is 'BLOBIN
8990: 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  T', .** SQLITE_A
89a0: 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65  FF_INTEGER is re
89b0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75  turned..**.** Su
89c0: 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66  bstring     | Af
89d0: 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  finity.** ------
89e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
89f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49  ----------.** 'I
8a00: 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53 51  NT'         | SQ
8a10: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
8a20: 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20 20  .** 'CHAR'      
8a30: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
8a40: 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20  EXT.** 'CLOB'   
8a50: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
8a60: 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27  F_TEXT.** 'TEXT'
8a70: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8a80: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c  _AFF_TEXT.** 'BL
8a90: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
8aa0: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20  ITE_AFF_NONE.** 
8ab0: 27 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20  'REAL'        | 
8ac0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
8ad0: 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20  ** 'FLOA'       
8ae0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
8af0: 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20  AL.** 'DOUB'    
8b00: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8b10: 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  _REAL.**.** If n
8b20: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
8b30: 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f  rings in the abo
8b40: 76 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75  ve table are fou
8b50: 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  nd,.** SQLITE_AF
8b60: 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74  F_NUMERIC is ret
8b70: 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73  urned..*/.char s
8b80: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79  qlite3AffinityTy
8b90: 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pe(const char *z
8ba0: 49 6e 2c 20 75 38 20 2a 70 73 7a 45 73 74 29 7b  In, u8 *pszEst){
8bb0: 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20  .  u32 h = 0;.  
8bc0: 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54  char aff = SQLIT
8bd0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
8be0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68   const char *zCh
8bf0: 61 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 7a  ar = 0;..  if( z
8c00: 49 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  In==0 ) return a
8c10: 66 66 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e  ff;.  while( zIn
8c20: 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28  [0] ){.    h = (
8c30: 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55  h<<8) + sqlite3U
8c40: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49  pperToLower[(*zI
8c50: 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49  n)&0xff];.    zI
8c60: 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d  n++;.    if( h==
8c70: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c  (('c'<<24)+('h'<
8c80: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72  <16)+('a'<<8)+'r
8c90: 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  ') ){           
8ca0: 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20    /* CHAR */.   
8cb0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8cc0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  AFF_TEXT;.      
8cd0: 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20  zChar = zIn;.   
8ce0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
8cf0: 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31  'c'<<24)+('l'<<1
8d00: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29  6)+('o'<<8)+'b')
8d10: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f   ){       /* CLO
8d20: 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  B */.      aff =
8d30: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
8d40: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8d50: 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27  h==(('t'<<24)+('
8d60: 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29  e'<<16)+('x'<<8)
8d70: 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f  +'t') ){       /
8d80: 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20  * TEXT */.      
8d90: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
8da0: 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _TEXT;.    }else
8db0: 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32   if( h==(('b'<<2
8dc0: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
8dd0: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
8de0: 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20      /* BLOB */. 
8df0: 20 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d         && (aff==
8e00: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
8e10: 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  IC || aff==SQLIT
8e20: 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20  E_AFF_REAL) ){. 
8e30: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
8e40: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
8e50: 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28    if( zIn[0]=='(
8e60: 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b  ' ) zChar = zIn;
8e70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8e80: 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f  OMIT_FLOATING_PO
8e90: 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  INT.    }else if
8ea0: 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b  ( h==(('r'<<24)+
8eb0: 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c  ('e'<<16)+('a'<<
8ec0: 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20  8)+'l')         
8ed0: 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20   /* REAL */.    
8ee0: 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49      && aff==SQLI
8ef0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29  TE_AFF_NUMERIC )
8f00: 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  {.      aff = SQ
8f10: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20  LITE_AFF_REAL;. 
8f20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
8f30: 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('f'<<24)+('l'<
8f40: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61  <16)+('o'<<8)+'a
8f50: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ')          /* F
8f60: 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOA */.        &
8f70: 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  & aff==SQLITE_AF
8f80: 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20  F_NUMERIC ){.   
8f90: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8fa0: 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65  AFF_REAL;.    }e
8fb0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27  lse if( h==(('d'
8fc0: 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b  <<24)+('o'<<16)+
8fd0: 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20  ('u'<<8)+'b')   
8fe0: 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a         /* DOUB *
8ff0: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
9000: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
9010: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
9020: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
9030: 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EAL;.#endif.    
9040: 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30 78 30  }else if( (h&0x0
9050: 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c  0FFFFFF)==(('i'<
9060: 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74  <16)+('n'<<8)+'t
9070: 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20  ') ){    /* INT 
9080: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
9090: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
90a0: 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  R;.      break;.
90b0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
90c0: 49 66 20 70 73 7a 45 73 74 20 69 73 20 6e 6f 74  If pszEst is not
90d0: 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20   NULL, store an 
90e0: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
90f0: 66 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65  field size.  The
9100: 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69  .  ** estimate i
9110: 73 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74  s scaled so that
9120: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
9130: 69 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a  integer is 1.  *
9140: 2f 0a 20 20 69 66 28 20 70 73 7a 45 73 74 20 29  /.  if( pszEst )
9150: 7b 0a 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20  {.    *pszEst = 
9160: 31 3b 20 20 20 2f 2a 20 64 65 66 61 75 6c 74 20  1;   /* default 
9170: 73 69 7a 65 20 69 73 20 61 70 70 72 6f 78 20 34  size is approx 4
9180: 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 66   bytes */.    if
9190: 28 20 61 66 66 3c 3d 53 51 4c 49 54 45 5f 41 46  ( aff<=SQLITE_AF
91a0: 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  F_NONE ){.      
91b0: 69 66 28 20 7a 43 68 61 72 20 29 7b 0a 20 20 20  if( zChar ){.   
91c0: 20 20 20 20 20 77 68 69 6c 65 28 20 7a 43 68 61       while( zCha
91d0: 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[0] ){.        
91e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 64    if( sqlite3Isd
91f0: 69 67 69 74 28 7a 43 68 61 72 5b 30 5d 29 20 29  igit(zChar[0]) )
9200: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
9210: 74 20 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t v = 0;.       
9220: 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74 49       sqlite3GetI
9230: 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76 29 3b  nt32(zChar, &v);
9240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 20 3d  .            v =
9250: 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 20 20   v/4 + 1;.      
9260: 20 20 20 20 20 20 69 66 28 20 76 3e 32 35 35 20        if( v>255 
9270: 29 20 76 20 3d 20 32 35 35 3b 0a 20 20 20 20 20  ) v = 255;.     
9280: 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d         *pszEst =
9290: 20 76 3b 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20   v; /* BLOB(k), 
92a0: 56 41 52 43 48 41 52 28 6b 29 2c 20 43 48 41 52  VARCHAR(k), CHAR
92b0: 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29  (k) -> r=(k/4+1)
92c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
92d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
92e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43 68   }.          zCh
92f0: 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ar++;.        }.
9300: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9310: 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 35       *pszEst = 5
9320: 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58  ;   /* BLOB, TEX
9330: 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20  T, CLOB -> r=5  
9340: 28 61 70 70 72 6f 78 20 32 30 20 62 79 74 65 73  (approx 20 bytes
9350: 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )*/.      }.    
9360: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  }.  }.  return a
9370: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ff;.}../*.** Thi
9380: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
9390: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
93a0: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
93b0: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
93c0: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
93d0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  LE statement.  T
93e0: 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20  he pFirst token 
93f0: 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
9400: 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71  token in the seq
9410: 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20  uence of tokens 
9420: 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74 68  that describe th
9430: 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a  e type of the.**
9440: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
9450: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
9460: 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73  tion.   pLast is
9470: 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a   the last token.
9480: 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  ** in the sequen
9490: 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e  ce.  Use this in
94a0: 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  formation to con
94b0: 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a  struct a string.
94c0: 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ** that contains
94d0: 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66   the typename of
94e0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20   the column and 
94f0: 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e  store that strin
9500: 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a  g.** in zType..*
9510: 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  / .void sqlite3A
9520: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72  ddColumnType(Par
9530: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
9540: 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62  n *pType){.  Tab
9550: 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20  le *p;.  Column 
9560: 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70 50  *pCol;..  p = pP
9570: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
9580: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e  .  if( p==0 || N
9590: 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20  EVER(p->nCol<1) 
95a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c  ) return;.  pCol
95b0: 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e   = &p->aCol[p->n
95c0: 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74  Col-1];.  assert
95d0: 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30  ( pCol->zType==0
95e0: 20 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70   );.  pCol->zTyp
95f0: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
9600: 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
9610: 3e 64 62 2c 20 70 54 79 70 65 29 3b 0a 20 20 70  >db, pType);.  p
9620: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
9630: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
9640: 79 70 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 2c  ype(pCol->zType,
9650: 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a   &pCol->szEst);.
9660: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70  }../*.** The exp
9670: 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65 20 64  ression is the d
9680: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
9690: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
96a0: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a  ly added column.
96b0: 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
96c0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
96d0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a  construction..**
96e0: 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75  .** Default valu
96f0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75  e expressions mu
9700: 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20  st be constant. 
9710: 20 52 61 69 73 65 20 61 6e 20 65 78 63 65 70 74   Raise an except
9720: 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ion if this.** i
9730: 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2e 0a  s not the case..
9740: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
9750: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
9760: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
9770: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
9780: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
9790: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
97a0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
97b0: 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74  qlite3AddDefault
97c0: 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70 50 61  Value(Parse *pPa
97d0: 72 73 65 2c 20 45 78 70 72 53 70 61 6e 20 2a 70  rse, ExprSpan *p
97e0: 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Span){.  Table *
97f0: 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  p;.  Column *pCo
9800: 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  l;.  sqlite3 *db
9810: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
9820: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
9830: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 21  wTable;.  if( p!
9840: 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d  =0 ){.    pCol =
9850: 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43   &(p->aCol[p->nC
9860: 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28 20  ol-1]);.    if( 
9870: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
9880: 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e  nstantOrFunction
9890: 28 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 20 29  (pSpan->pExpr) )
98a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
98b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
98c0: 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f  "default value o
98d0: 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73  f column [%s] is
98e0: 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a   not constant",.
98f0: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e            pCol->
9900: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
9910: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f  e{.      /* A co
9920: 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20 75  py of pExpr is u
9930: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74  sed instead of t
9940: 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20  he original, as 
9950: 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20  pExpr contains. 
9960: 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74       ** tokens t
9970: 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c  hat point to vol
9980: 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68  atile memory. Th
9990: 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65 20  e 'span' of the 
99a0: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20  expression.     
99b0: 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20   ** is required 
99c0: 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65 5f  by pragma table_
99d0: 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  info..      */. 
99e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
99f0: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
9a00: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 70  >pDflt);.      p
9a10: 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c  Col->pDflt = sql
9a20: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
9a30: 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 45 58  pSpan->pExpr, EX
9a40: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
9a50: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
9a60: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66  ee(db, pCol->zDf
9a70: 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  lt);.      pCol-
9a80: 3e 7a 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >zDflt = sqlite3
9a90: 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63  DbStrNDup(db, (c
9aa0: 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61  har*)pSpan->zSta
9ab0: 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rt,.            
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ad0: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 70           (int)(p
9ae0: 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70  Span->zEnd - pSp
9af0: 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20  an->zStart));.  
9b00: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
9b10: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
9b20: 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d  pSpan->pExpr);.}
9b30: 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74  ../*.** Designat
9b40: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
9b50: 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  Y for the table.
9b60: 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73    pList is a lis
9b70: 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f  t of names .** o
9b80: 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66  f columns that f
9b90: 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20  orm the primary 
9ba0: 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69  key.  If pList i
9bb0: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  s NULL, then the
9bc0: 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  .** most recentl
9bd0: 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f  y added column o
9be0: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74  f the table is t
9bf0: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a  he primary key..
9c00: 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61  **.** A table ca
9c10: 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f  n have at most o
9c20: 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  ne primary key. 
9c30: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c   If the table al
9c40: 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70  ready has.** a p
9c50: 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20  rimary key (and 
9c60: 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63 6f  this is the seco
9c70: 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20  nd primary key) 
9c80: 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a  then create an.*
9c90: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  * error..**.** I
9ca0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
9cb0: 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  Y is on a single
9cc0: 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61   column whose da
9cd0: 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47 45  tatype is INTEGE
9ce0: 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69  R,.** then we wi
9cf0: 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  ll try to use th
9d00: 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  at column as the
9d10: 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65   rowid.  Set the
9d20: 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20   Table.iPKey.** 
9d30: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62  field of the tab
9d40: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
9d50: 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20  ction to be the 
9d60: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
9d70: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
9d80: 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62  KEY column.  Tab
9d90: 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20  le.iPKey is set 
9da0: 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20 69  to -1 if there i
9db0: 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20  s.** no INTEGER 
9dc0: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a  PRIMARY KEY..**.
9dd0: 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69 73  ** If the key is
9de0: 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20   not an INTEGER 
9df0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65  PRIMARY KEY, the
9e00: 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  n create a uniqu
9e10: 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74  e.** index for t
9e20: 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65  he key.  No inde
9e30: 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f 72  x is created for
9e40: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
9e50: 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   KEYs..*/.void s
9e60: 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
9e70: 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
9e80: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
9e90: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9ea0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9eb0: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69  ,  /* List of fi
9ec0: 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20  eld names to be 
9ed0: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
9ee0: 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
9ef0: 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
9f00: 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63  h a uniqueness c
9f10: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74  onflict */.  int
9f20: 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f   autoInc,      /
9f30: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41 55  * True if the AU
9f40: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77  TOINCREMENT keyw
9f50: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
9f60: 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65  /.  int sortOrde
9f70: 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  r     /* SQLITE_
9f80: 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45  SO_ASC or SQLITE
9f90: 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20  _SO_DESC */.){. 
9fa0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
9fb0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
9fc0: 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20  ;.  char *zType 
9fd0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20  = 0;.  int iCol 
9fe0: 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e  = -1, i;.  int n
9ff0: 54 65 72 6d 3b 0a 20 20 69 66 28 20 70 54 61 62  Term;.  if( pTab
a000: 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
a010: 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 70 72  E_VTAB ) goto pr
a020: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
a030: 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46    if( pTab->tabF
a040: 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69  lags & TF_HasPri
a050: 6d 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73  maryKey ){.    s
a060: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
a070: 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74  Parse, .      "t
a080: 61 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20  able \"%s\" has 
a090: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72  more than one pr
a0a0: 69 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62  imary key", pTab
a0b0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
a0c0: 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  to primary_key_e
a0d0: 78 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d  xit;.  }.  pTab-
a0e0: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f  >tabFlags |= TF_
a0f0: 48 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20  HasPrimaryKey;. 
a100: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
a110: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62  .    iCol = pTab
a120: 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20  ->nCol - 1;.    
a130: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
a140: 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c  .colFlags |= COL
a150: 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20  FLAG_PRIMKEY;.  
a160: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
a170: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
a180: 3b 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 31 3b  ;.    nTerm = 1;
a190: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 54  .  }else{.    nT
a1a0: 65 72 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  erm = pList->nEx
a1b0: 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  pr;.    for(i=0;
a1c0: 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a   i<nTerm; i++){.
a1d0: 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
a1e0: 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
a1f0: 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
a200: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
a210: 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
a220: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i].zName, pTab->
a230: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
a240: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
a250: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
a260: 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l].colFlags |= C
a270: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a  OLFLAG_PRIMKEY;.
a280: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
a290: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f  = pTab->aCol[iCo
a2a0: 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20 20 20  l].zType;.      
a2b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a2c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a2d0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 65   }.  }.  if( nTe
a2e0: 72 6d 3d 3d 31 0a 20 20 20 26 26 20 7a 54 79 70  rm==1.   && zTyp
a2f0: 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
a300: 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45  Cmp(zType, "INTE
a310: 47 45 52 22 29 3d 3d 30 0a 20 20 20 26 26 20 73  GER")==0.   && s
a320: 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45  ortOrder==SQLITE
a330: 5f 53 4f 5f 41 53 43 0a 20 20 29 7b 0a 20 20 20  _SO_ASC.  ){.   
a340: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69   pTab->iPKey = i
a350: 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b  Col;.    pTab->k
a360: 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45  eyConf = (u8)onE
a370: 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74  rror;.    assert
a380: 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20  ( autoInc==0 || 
a390: 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20  autoInc==1 );.  
a3a0: 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73    pTab->tabFlags
a3b0: 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41   |= autoInc*TF_A
a3c0: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20  utoincrement;.  
a3d0: 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 70 50    if( pList ) pP
a3e0: 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64  arse->iPkSortOrd
a3f0: 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  er = pList->a[0]
a400: 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 65  .sortOrder;.  }e
a410: 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20  lse if( autoInc 
a420: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
a430: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
a440: 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33  MENT.    sqlite3
a450: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a460: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
a470: 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20  is only allowed 
a480: 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22  on an ".       "
a490: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
a4a0: 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  KEY");.#endif.  
a4b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 56 64 62 65 20  }else{.    Vdbe 
a4c0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
a4d0: 62 65 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70  be;.    Index *p
a4e0: 3b 0a 20 20 20 20 69 66 28 20 76 20 29 20 70 50  ;.    if( v ) pP
a4f0: 61 72 73 65 2d 3e 61 64 64 72 53 6b 69 70 50 4b  arse->addrSkipPK
a500: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
a510: 64 4f 70 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29  dOp0(v, OP_Noop)
a520: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
a530: 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  3CreateIndex(pPa
a540: 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c  rse, 0, 0, 0, pL
a550: 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ist, onError, 0,
a560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a570: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73              0, s
a580: 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20  ortOrder, 0);.  
a590: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
a5a0: 20 70 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20   p->autoIndex = 
a5b0: 32 3b 0a 20 20 20 20 20 20 69 66 28 20 76 20 29  2;.      if( v )
a5c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
a5d0: 48 65 72 65 28 76 2c 20 70 50 61 72 73 65 2d 3e  Here(v, pParse->
a5e0: 61 64 64 72 53 6b 69 70 50 4b 29 3b 0a 20 20 20  addrSkipPK);.   
a5f0: 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30   }.    pList = 0
a600: 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b  ;.  }..primary_k
a610: 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ey_exit:.  sqlit
a620: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
a630: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69  (pParse->db, pLi
a640: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  st);.  return;.}
a650: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
a660: 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  w CHECK constrai
a670: 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  nt to the table 
a680: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
a690: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
a6a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
a6b0: 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28  CheckConstraint(
a6c0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a6d0: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
a6e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
a6f0: 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f  r *pCheckExpr  /
a700: 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70 72  * The check expr
a710: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66  ession */.){.#if
a720: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a730: 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a  _CHECK.  Table *
a740: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
a750: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
a760: 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c  pTab && !IN_DECL
a770: 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  ARE_VTAB ){.    
a780: 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73  pTab->pCheck = s
a790: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
a7a0: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 54 61  pend(pParse, pTa
a7b0: 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63  b->pCheck, pChec
a7c0: 6b 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  kExpr);.    if( 
a7d0: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
a7e0: 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20  ntName.n ){.    
a7f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
a800: 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
a810: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26   pTab->pCheck, &
a820: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
a830: 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20  ntName, 1);.    
a840: 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
a850: 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
a860: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
a870: 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45 78 70  e->db, pCheckExp
a880: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
a890: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
a8a0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
a8b0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
a8c0: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
a8d0: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
a8e0: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
a8f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
a900: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
a910: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
a920: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62   *pToken){.  Tab
a930: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
a940: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
a950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
a960: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
a970: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
a980: 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ce */.  sqlite3 
a990: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  *db;..  if( (p =
a9a0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
a9b0: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
a9c0: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
a9d0: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
a9e0: 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73  >db;.  zColl = s
a9f0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
aa00: 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
aa10: 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20  .  if( !zColl ) 
aa20: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73  return;..  if( s
aa30: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
aa40: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
aa50: 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l) ){.    Index 
aa60: 2a 70 49 64 78 3b 0a 20 20 20 20 73 71 6c 69 74  *pIdx;.    sqlit
aa70: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
aa80: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a  aCol[i].zColl);.
aa90: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a      p->aCol[i].z
aaa0: 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  Coll = zColl;.  
aab0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
aac0: 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65  olumn is declare
aad0: 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49  d as "<name> PRI
aae0: 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45  MARY KEY COLLATE
aaf0: 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a   <type>",.    **
ab00: 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d   then an index m
ab10: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ay have been cre
ab20: 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c  ated on this col
ab30: 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20  umn before the. 
ab40: 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20     ** collation 
ab50: 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20  type was added. 
ab60: 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20  Correct this if 
ab70: 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  it is the case..
ab80: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
ab90: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
aba0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
abb0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
abc0: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79  sert( pIdx->nKey
abd0: 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Col==1 );.      
abe0: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
abf0: 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20  mn[0]==i ){.    
ac00: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
ac10: 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d  [0] = p->aCol[i]
ac20: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  .zColl;.      }.
ac30: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
ac40: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
ac50: 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
ac60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
ac70: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
ac80: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
ac90: 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62  quence for datab
aca0: 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a  ase native text.
acb0: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e  ** encoding iden
acc0: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74  tified by the st
acd0: 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  ring zName, leng
ace0: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  th nName..**.** 
acf0: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
ad00: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
ad10: 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  nce is not avail
ad20: 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61  able, or not ava
ad30: 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65  ilable.** in the
ad40: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
ad50: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63   encoding, the c
ad60: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
ad70: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a   is invoked to.*
ad80: 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66  * request it. If
ad90: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
ada0: 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20  actory does not 
adb0: 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65  supply such a se
adc0: 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74  quence,.** and t
add0: 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  he sequence is a
ade0: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74  vailable in anot
adf0: 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  her text encodin
ae00: 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a  g, then that is.
ae10: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  ** returned inst
ae20: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ead..**.** If no
ae30: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
ae40: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
ae50: 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61  tions sequence a
ae60: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  re available, or
ae70: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f  .** another erro
ae80: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
ae90: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
aea0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
aeb0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
aec0: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pParse..**.** Th
aed0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
aee0: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
aef0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
af00: 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  q().  This routi
af10: 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68  ne.** invokes th
af20: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
af30: 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ory if the named
af40: 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f   collation canno
af50: 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e  t be found.** an
af60: 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65  d generates an e
af70: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  rror message..**
af80: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
af90: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
afa0: 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43 6f  (), sqlite3GetCo
afb0: 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53  llSeq().*/.CollS
afc0: 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  eq *sqlite3Locat
afd0: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
afe0: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
aff0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71  ar *zName){.  sq
b000: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
b010: 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63  se->db;.  u8 enc
b020: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38   = ENC(db);.  u8
b030: 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e   initbusy = db->
b040: 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c  init.busy;.  Col
b050: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
b060: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
b070: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65  indCollSeq(db, e
b080: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62  nc, zName, initb
b090: 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69  usy);.  if( !ini
b0a0: 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c  tbusy && (!pColl
b0b0: 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   || !pColl->xCmp
b0c0: 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  ) ){.    pColl =
b0d0: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
b0e0: 65 71 28 70 50 61 72 73 65 2c 20 65 6e 63 2c 20  eq(pParse, enc, 
b0f0: 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20  pColl, zName);. 
b100: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f   }..  return pCo
b110: 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  ll;.}.../*.** Ge
b120: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
b130: 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20   will increment 
b140: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
b150: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68  e..**.** The sch
b160: 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73  ema cookie is us
b170: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
b180: 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  when the schema 
b190: 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  for the.** datab
b1a0: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66  ase changes.  Af
b1b0: 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20  ter each schema 
b1c0: 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b  change, the cook
b1d0: 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e  ie value.** chan
b1e0: 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f  ges.  When a pro
b1f0: 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73  cess first reads
b200: 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72   the schema it r
b210: 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f  ecords the.** co
b220: 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65  okie.  Thereafte
b230: 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67  r, whenever it g
b240: 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  oes to access th
b250: 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69  e database,.** i
b260: 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f  t checks the coo
b270: 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  kie to make sure
b280: 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
b290: 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73  not changed.** s
b2a0: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
b2b0: 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
b2c0: 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f  s plan is not co
b2d0: 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d  mpletely bullet-
b2e0: 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f  proof.  It is po
b2f0: 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68  ssible for.** th
b300: 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e  e schema to chan
b310: 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ge multiple time
b320: 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f  s and for the co
b330: 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65  okie to be.** se
b340: 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20  t back to prior 
b350: 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65  value.  But sche
b360: 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69  ma changes are i
b370: 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64  nfrequent.** and
b380: 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
b390: 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20   of hitting the 
b3a0: 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75  same cookie valu
b3b0: 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63  e is only.** 1 c
b3c0: 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20  hance in 2^32.  
b3d0: 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e  So we're safe en
b3e0: 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ough..*/.void sq
b3f0: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
b400: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
b410: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74   int iDb){.  int
b420: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
b430: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
b440: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
b450: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
b460: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
b470: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
b480: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
b490: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
b4a0: 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  , 0) );.  sqlite
b4b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
b4c0: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61  P_Integer, db->a
b4d0: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
b4e0: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31  >schema_cookie+1
b4f0: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
b500: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
b510: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
b520: 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45   BTREE_SCHEMA_VE
b530: 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20 20 73 71  RSION, r1);.  sq
b540: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
b550: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
b560: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
b570: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
b580: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
b590: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
b5a0: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
b5b0: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
b5c0: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
b5d0: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
b5e0: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
b5f0: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
b600: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
b610: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
b620: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
b630: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
b640: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
b650: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
b660: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
b670: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
b680: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
b690: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
b6a0: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
b6b0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
b6c0: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
b6d0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
b6e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
b6f0: 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 69  irst parameter i
b700: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
b710: 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  n output buffer.
b720: 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   The second .** 
b730: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
b740: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74  ointer to an int
b750: 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69  eger that contai
b760: 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  ns the offset at
b770: 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72 69  .** which to wri
b780: 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  te into the outp
b790: 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73 20  ut buffer. This 
b7a0: 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73 20  function copies 
b7b0: 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  the.** nul-termi
b7c0: 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f 69  nated string poi
b7d0: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 74  nted to by the t
b7e0: 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c 20  hird parameter, 
b7f0: 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a  zSignedIdent,.**
b800: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
b810: 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  d offset in the 
b820: 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61 74  buffer and updat
b830: 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66 65  es *pIdx to refe
b840: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73  r.** to the firs
b850: 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65  t byte after the
b860: 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74 74   last byte writt
b870: 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  en before return
b880: 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ing..** .** If t
b890: 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e 65  he string zSigne
b8a0: 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73 20  dIdent consists 
b8b0: 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70 68  entirely of alph
b8c0: 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61  a-numeric.** cha
b8d0: 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f  racters, does no
b8e0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 64  t begin with a d
b8f0: 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74 20  igit and is not 
b900: 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a  an SQL keyword,.
b910: 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f  ** then it is co
b920: 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70  pied to the outp
b930: 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74 6c  ut buffer exactl
b940: 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68 65  y as it is. Othe
b950: 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20  rwise,.** it is 
b960: 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f 75  quoted using dou
b970: 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73  ble-quotes..*/.s
b980: 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74  tatic void ident
b990: 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  Put(char *z, int
b9a0: 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53   *pIdx, char *zS
b9b0: 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75  ignedIdent){.  u
b9c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
b9d0: 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  dent = (unsigned
b9e0: 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64   char*)zSignedId
b9f0: 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ent;.  int i, j,
ba00: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
ba10: 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28  = *pIdx;..  for(
ba20: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
ba30: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73  j++){.    if( !s
ba40: 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49  qlite3Isalnum(zI
ba50: 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65  dent[j]) && zIde
ba60: 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65  nt[j]!='_' ) bre
ba70: 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75  ak;.  }.  needQu
ba80: 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73 64  ote = sqlite3Isd
ba90: 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 20  igit(zIdent[0]) 
baa0: 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f 72  || sqlite3Keywor
bab0: 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29  dCode(zIdent, j)
bac0: 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20 21  !=TK_ID;.  if( !
bad0: 6e 65 65 64 51 75 6f 74 65 20 29 7b 0a 20 20 20  needQuote ){.   
bae0: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 7a 49 64   needQuote = zId
baf0: 65 6e 74 5b 6a 5d 3b 0a 20 20 7d 0a 0a 20 20 69  ent[j];.  }..  i
bb00: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
bb10: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66  [i++] = '"';.  f
bb20: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
bb30: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
bb40: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
bb50: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
bb60: 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d  j]=='"' ) z[i++]
bb70: 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66   = '"';.  }.  if
bb80: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
bb90: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b  i++] = '"';.  z[
bba0: 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20  i] = 0;.  *pIdx 
bbb0: 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = i;.}../*.** Ge
bbc0: 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20  nerate a CREATE 
bbd0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
bbe0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
bbf0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62  the given.** tab
bc00: 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68  le.  Memory to h
bc10: 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20  old the text of 
bc20: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
bc30: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
bc40: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
bc50: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
bc60: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
bc70: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
bc80: 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61  tatic char *crea
bc90: 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c 69  teTableStmt(sqli
bca0: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
bcb0: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20  p){.  int i, k, 
bcc0: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  n;.  char *zStmt
bcd0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20  ;.  char *zSep, 
bce0: 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20  *zSep2, *zEnd;. 
bcf0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
bd00: 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   n = 0;.  for(pC
bd10: 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d  ol = p->aCol, i=
bd20: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
bd30: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
bd40: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
bd50: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20  (pCol->zName) + 
bd60: 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64  5;.  }.  n += id
bd70: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
bd80: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20  me);.  if( n<50 
bd90: 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  ){ .    zSep = "
bda0: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
bdb0: 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22  ,";.    zEnd = "
bdc0: 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )";.  }else{.   
bdd0: 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a   zSep = "\n  ";.
bde0: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e      zSep2 = ",\n
bdf0: 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20    ";.    zEnd = 
be00: 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b  "\n)";.  }.  n +
be10: 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c  = 35 + 6*p->nCol
be20: 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69  ;.  zStmt = sqli
be30: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30  te3DbMallocRaw(0
be40: 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d  , n);.  if( zStm
be50: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  t==0 ){.    db->
be60: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
be70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
be80: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
be90: 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c  printf(n, zStmt,
bea0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   "CREATE TABLE "
beb0: 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33  );.  k = sqlite3
bec0: 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b  Strlen30(zStmt);
bed0: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
bee0: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
bef0: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
bf00: 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   '(';.  for(pCol
bf10: 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69  =p->aCol, i=0; i
bf20: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
bf30: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74  Col++){.    stat
bf40: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
bf50: 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d  const azType[] =
bf60: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51   {.        /* SQ
bf70: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20  LITE_AFF_TEXT   
bf80: 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20   */ " TEXT",.   
bf90: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
bfa0: 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20 22 22  FF_NONE    */ ""
bfb0: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
bfc0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
bfd0: 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20  */ " NUM",.     
bfe0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
bff0: 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e  _INTEGER */ " IN
c000: 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  T",.        /* S
c010: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20  QLITE_AFF_REAL  
c020: 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20    */ " REAL".   
c030: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b   };.    int len;
c040: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
c050: 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c  *zType;..    sql
c060: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
c070: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  k, &zStmt[k], zS
c080: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71  ep);.    k += sq
c090: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
c0a0: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
c0b0: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
c0c0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
c0d0: 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  &k, pCol->zName)
c0e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
c0f0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c  ol->affinity-SQL
c100: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3e 3d 20  ITE_AFF_TEXT >= 
c110: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
c120: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
c130: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
c140: 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54 79  < ArraySize(azTy
c150: 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  pe) );.    testc
c160: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
c170: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
c180: 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73 74  TEXT );.    test
c190: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
c1a0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
c1b0: 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 74 65 73  _NONE );.    tes
c1c0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
c1d0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
c1e0: 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
c1f0: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
c200: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
c210: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
c220: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
c230: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
c240: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
c250: 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65  ;.    .    zType
c260: 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e   = azType[pCol->
c270: 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54  affinity - SQLIT
c280: 45 5f 41 46 46 5f 54 45 58 54 5d 3b 0a 20 20 20  E_AFF_TEXT];.   
c290: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   len = sqlite3St
c2a0: 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20  rlen30(zType);. 
c2b0: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
c2c0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
c2d0: 45 5f 41 46 46 5f 4e 4f 4e 45 20 0a 20 20 20 20  E_AFF_NONE .    
c2e0: 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d          || pCol-
c2f0: 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74  >affinity==sqlit
c300: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
c310: 54 79 70 65 2c 20 30 29 20 29 3b 0a 20 20 20 20  Type, 0) );.    
c320: 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  memcpy(&zStmt[k]
c330: 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20  , zType, len);. 
c340: 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20     k += len;.   
c350: 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b   assert( k<=n );
c360: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
c370: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
c380: 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45  tmt[k], "%s", zE
c390: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
c3a0: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  tmt;.}../*.** Re
c3b0: 73 69 7a 65 20 61 6e 20 49 6e 64 65 78 20 6f 62  size an Index ob
c3c0: 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 4e 20 63  ject to hold N c
c3d0: 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e 20 20 52  olumns total.  R
c3e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
c3f0: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  ** on success an
c400: 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  d SQLITE_NOMEM o
c410: 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a  n an OOM error..
c420: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
c430: 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  sizeIndexObject(
c440: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64  sqlite3 *db, Ind
c450: 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 4e 29  ex *pIdx, int N)
c460: 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61  {.  char *zExtra
c470: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
c480: 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
c490: 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20 53  mn>=N ) return S
c4a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
c4b0: 72 74 28 20 70 49 64 78 2d 3e 69 73 52 65 73 69  rt( pIdx->isResi
c4c0: 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 42 79 74  zed==0 );.  nByt
c4d0: 65 20 3d 20 28 73 69 7a 65 6f 66 28 63 68 61 72  e = (sizeof(char
c4e0: 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 31 36 29  *) + sizeof(i16)
c4f0: 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45 78 74 72   + 1)*N;.  zExtr
c500: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
c510: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
c520: 65 29 3b 0a 20 20 69 66 28 20 7a 45 78 74 72 61  e);.  if( zExtra
c530: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
c540: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
c550: 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78  cpy(zExtra, pIdx
c560: 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66  ->azColl, sizeof
c570: 28 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43  (char*)*pIdx->nC
c580: 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e  olumn);.  pIdx->
c590: 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a  azColl = (char**
c5a0: 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72  )zExtra;.  zExtr
c5b0: 61 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72  a += sizeof(char
c5c0: 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a  *)*N;.  memcpy(z
c5d0: 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43  Extra, pIdx->aiC
c5e0: 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31  olumn, sizeof(i1
c5f0: 36 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  6)*pIdx->nColumn
c600: 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c  );.  pIdx->aiCol
c610: 75 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74  umn = (i16*)zExt
c620: 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20  ra;.  zExtra += 
c630: 73 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20  sizeof(i16)*N;. 
c640: 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
c650: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
c660: 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  , pIdx->nColumn)
c670: 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ;.  pIdx->aSortO
c680: 72 64 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74  rder = (u8*)zExt
c690: 72 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c  ra;.  pIdx->nCol
c6a0: 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d  umn = N;.  pIdx-
c6b0: 3e 69 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a  >isResized = 1;.
c6c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c6d0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74  OK;.}../*.** Est
c6e0: 69 6d 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20  imate the total 
c6f0: 72 6f 77 20 77 69 64 74 68 20 66 6f 72 20 61 20  row width for a 
c700: 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
c710: 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61   void estimateTa
c720: 62 6c 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a  bleWidth(Table *
c730: 70 54 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pTab){.  unsigne
c740: 64 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  d wTable = 0;.  
c750: 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54  const Column *pT
c760: 61 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  abCol;.  int i;.
c770: 20 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43    for(i=pTab->nC
c780: 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62  ol, pTabCol=pTab
c790: 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d  ->aCol; i>0; i--
c7a0: 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20  , pTabCol++){.  
c7b0: 20 20 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62    wTable += pTab
c7c0: 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a  Col->szEst;.  }.
c7d0: 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65    if( pTab->iPKe
c7e0: 79 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a  y<0 ) wTable++;.
c7f0: 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77    pTab->szTabRow
c800: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
c810: 28 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f  (wTable*4);.}../
c820: 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68  *.** Estimate th
c830: 65 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f  e average size o
c840: 66 20 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69  f a row for an i
c850: 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
c860: 76 6f 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64  void estimateInd
c870: 65 78 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70  exWidth(Index *p
c880: 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  Idx){.  unsigned
c890: 20 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69   wIndex = 0;.  i
c8a0: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f  nt i;.  const Co
c8b0: 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64  lumn *aCol = pId
c8c0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b  x->pTable->aCol;
c8d0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
c8e0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
c8f0: 29 7b 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70  ){.    i16 x = p
c900: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  Idx->aiColumn[i]
c910: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 78 3c  ;.    assert( x<
c920: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43  pIdx->pTable->nC
c930: 6f 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78  ol );.    wIndex
c940: 20 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43   += x<0 ? 1 : aC
c950: 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  ol[pIdx->aiColum
c960: 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d  n[i]].szEst;.  }
c970: 0a 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f  .  pIdx->szIdxRo
c980: 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  w = sqlite3LogEs
c990: 74 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a  t(wIndex*4);.}..
c9a0: 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  /* Return true i
c9b0: 66 20 76 61 6c 75 65 20 78 20 69 73 20 66 6f 75  f value x is fou
c9c0: 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69  nd any of the fi
c9d0: 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73  rst nCol entries
c9e0: 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73   of aiCol[].*/.s
c9f0: 74 61 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c  tatic int hasCol
ca00: 75 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61  umn(const i16 *a
ca10: 69 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20  iCol, int nCol, 
ca20: 69 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28  int x){.  while(
ca30: 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66   nCol-- > 0 ) if
ca40: 28 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20  ( x==*(aiCol++) 
ca50: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
ca60: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
ca70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   This routine ru
ca80: 6e 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ns at the end of
ca90: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
caa0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
cab0: 74 20 74 68 61 74 0a 2a 2a 20 68 61 73 20 61 20  t that.** has a 
cac0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 63 6c  WITHOUT ROWID cl
cad0: 61 75 73 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f  ause.  The job o
cae0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
caf0: 73 20 74 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74  s to convert bot
cb00: 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63  h.** internal sc
cb10: 68 65 6d 61 20 64 61 74 61 20 73 74 72 75 63 74  hema data struct
cb20: 75 72 65 73 20 61 6e 64 20 74 68 65 20 67 65 6e  ures and the gen
cb30: 65 72 61 74 65 64 20 56 44 42 45 20 63 6f 64 65  erated VDBE code
cb40: 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a 2a 2a   so that they.**
cb50: 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74 65   are appropriate
cb60: 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52   for a WITHOUT R
cb70: 4f 57 49 44 20 74 61 62 6c 65 20 69 6e 73 74 65  OWID table inste
cb80: 61 64 20 6f 66 20 61 20 72 6f 77 69 64 20 74 61  ad of a rowid ta
cb90: 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20  ble..** Changes 
cba0: 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20  include:.**.**  
cbb0: 20 20 20 28 31 29 20 20 43 6f 6e 76 65 72 74 20     (1)  Convert 
cbc0: 74 68 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62  the OP_CreateTab
cbd0: 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 43 72  le into an OP_Cr
cbe0: 65 61 74 65 49 6e 64 65 78 2e 20 20 54 68 65 72  eateIndex.  Ther
cbf0: 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  e is.**         
cc00: 20 6e 6f 20 72 6f 77 69 64 20 62 74 72 65 65 20   no rowid btree 
cc10: 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f  for a WITHOUT RO
cc20: 57 49 44 2e 20 20 49 6e 73 74 65 61 64 2c 20 74  WID.  Instead, t
cc30: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20  he canonical.** 
cc40: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 73 74           data st
cc50: 6f 72 61 67 65 20 69 73 20 61 20 63 6f 76 65 72  orage is a cover
cc60: 69 6e 67 20 69 6e 64 65 78 20 62 74 72 65 65 2e  ing index btree.
cc70: 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 42 79 70  .**     (2)  Byp
cc80: 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e  ass the creation
cc90: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   of the sqlite_m
cca0: 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72  aster table entr
ccb0: 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f  y.**          fo
ccc0: 72 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  r the PRIMARY KE
ccd0: 59 20 61 73 20 74 68 65 20 74 68 65 20 70 72 69  Y as the the pri
cce0: 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 69  mary key index i
ccf0: 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  s now.**        
cd00: 20 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20    identified by 
cd10: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
cd20: 72 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6f 66  r table entry of
cd30: 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
cd40: 66 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 53  f..**     (3)  S
cd50: 65 74 20 74 68 65 20 49 6e 64 65 78 2e 74 6e 75  et the Index.tnu
cd60: 6d 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  m of the PRIMARY
cd70: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
cd80: 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  t in the.**     
cd90: 20 20 20 20 20 73 63 68 65 6d 61 20 74 6f 20 74       schema to t
cda0: 68 65 20 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d  he rootpage from
cdb0: 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e   the main table.
cdc0: 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53 65 74  .**     (4)  Set
cdd0: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   all columns of 
cde0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
cdf0: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f  schema object to
ce00: 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a   be NOT NULL..**
ce10: 20 20 20 20 20 28 35 29 20 20 41 64 64 20 61 6c       (5)  Add al
ce20: 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  l table columns 
ce30: 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  to the PRIMARY K
ce40: 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 0a  EY Index object.
ce50: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 20 74  **          so t
ce60: 68 61 74 20 74 68 65 20 50 52 49 4d 41 52 59 20  hat the PRIMARY 
ce70: 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72 69 6e  KEY is a coverin
ce80: 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20 73 75  g index.  The su
ce90: 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20 20 20  rplus.**        
cea0: 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61    columns are pa
ceb0: 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e 58  rt of KeyInfo.nX
cec0: 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20 6e 6f  Field and are no
ced0: 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20  t used for.**   
cee0: 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67 20 6f         sorting o
cef0: 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e 69 71  r lookup or uniq
cf00: 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e 0a 2a  ueness checks..*
cf10: 2a 20 20 20 20 20 28 36 29 20 20 52 65 70 6c 61  *     (6)  Repla
cf20: 63 65 20 74 68 65 20 72 6f 77 69 64 20 74 61 69  ce the rowid tai
cf30: 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d 61 74  l on all automat
cf40: 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64  ically generated
cf50: 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20 20 20   UNIQUE.**      
cf60: 20 20 20 20 69 6e 64 69 63 65 73 20 77 69 74 68      indices with
cf70: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
cf80: 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61   columns..*/.sta
cf90: 74 69 63 20 76 6f 69 64 20 63 6f 6e 76 65 72 74  tic void convert
cfa0: 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61  ToWithoutRowidTa
cfb0: 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
cfc0: 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b  e, Table *pTab){
cfd0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
cfe0: 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20    Index *pPk;.  
cff0: 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 69  int nPk;.  int i
d000: 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  , j;.  sqlite3 *
d010: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
d020: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
d030: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 2f  rse->pVdbe;..  /
d040: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 4f 50  * Convert the OP
d050: 5f 43 72 65 61 74 65 54 61 62 6c 65 20 6f 70 63  _CreateTable opc
d060: 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  ode that would n
d070: 6f 72 6d 61 6c 6c 79 20 63 72 65 61 74 65 20 74  ormally create t
d080: 68 65 0a 20 20 2a 2a 20 72 6f 6f 74 2d 70 61 67  he.  ** root-pag
d090: 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  e for the table 
d0a0: 69 6e 74 6f 20 61 20 4f 50 5f 43 72 65 61 74 65  into a OP_Create
d0b0: 49 6e 64 65 78 20 6f 70 63 6f 64 65 2e 20 20 54  Index opcode.  T
d0c0: 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63 72  he index.  ** cr
d0d0: 65 61 74 65 64 20 77 69 6c 6c 20 62 65 63 6f 6d  eated will becom
d0e0: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
d0f0: 59 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20  Y index..  */.  
d100: 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72  if( pParse->addr
d110: 43 72 54 61 62 20 29 7b 0a 20 20 20 20 61 73 73  CrTab ){.    ass
d120: 65 72 74 28 20 76 20 29 3b 0a 20 20 20 20 73 71  ert( v );.    sq
d130: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
d140: 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72  , pParse->addrCr
d150: 54 61 62 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f  Tab)->opcode = O
d160: 50 5f 43 72 65 61 74 65 49 6e 64 65 78 3b 0a 20  P_CreateIndex;. 
d170: 20 7d 0a 0a 20 20 2f 2a 20 42 79 70 61 73 73 20   }..  /* Bypass 
d180: 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20  the creation of 
d190: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d1a0: 62 74 72 65 65 20 61 6e 64 20 74 68 65 20 73 71  btree and the sq
d1b0: 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a  lite_master.  **
d1c0: 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a 20 20   table entry..  
d1d0: 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  */.  if( pParse-
d1e0: 3e 61 64 64 72 53 6b 69 70 50 4b 20 29 7b 0a 20  >addrSkipPK ){. 
d1f0: 20 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a     assert( v );.
d200: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
d210: 65 74 4f 70 28 76 2c 20 70 50 61 72 73 65 2d 3e  etOp(v, pParse->
d220: 61 64 64 72 53 6b 69 70 50 4b 29 2d 3e 6f 70 63  addrSkipPK)->opc
d230: 6f 64 65 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20  ode = OP_Goto;. 
d240: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
d250: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d260: 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66 20 74  index.  Or, if t
d270: 68 69 73 20 74 61 62 6c 65 20 77 61 73 20 6f 72  his table was or
d280: 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61 6e  iginally.  ** an
d290: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
d2a0: 20 4b 45 59 20 74 61 62 6c 65 2c 20 63 72 65 61   KEY table, crea
d2b0: 74 65 20 61 20 6e 65 77 20 50 52 49 4d 41 52 59  te a new PRIMARY
d2c0: 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20 20 2a   KEY index. .  *
d2d0: 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50  /.  if( pTab->iP
d2e0: 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45 78  Key>=0 ){.    Ex
d2f0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20  prList *pList;. 
d300: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
d310: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
d320: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a  (pParse, 0, 0);.
d330: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
d340: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
d350: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  List->a[0].zName
d360: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
d370: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20  up(pParse->db,. 
d380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3a0: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f         pTab->aCo
d3b0: 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a  l[pTab->iPKey].z
d3c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74  Name);.    pList
d3d0: 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
d3e0: 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f   = pParse->iPkSo
d3f0: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 61 73 73  rtOrder;.    ass
d400: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65  ert( pParse->pNe
d410: 77 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a  wTable==pTab );.
d420: 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65      pPk = sqlite
d430: 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  3CreateIndex(pPa
d440: 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c  rse, 0, 0, 0, pL
d450: 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43 6f  ist, pTab->keyCo
d460: 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  nf, 0, 0, 0, 0);
d470: 0a 20 20 20 20 69 66 28 20 70 50 6b 3d 3d 30 20  .    if( pPk==0 
d480: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 50  ) return;.    pP
d490: 6b 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 32  k->autoIndex = 2
d4a0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65  ;.    pTab->iPKe
d4b0: 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  y = -1;.  }else{
d4c0: 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69 74  .    pPk = sqlit
d4d0: 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
d4e0: 78 28 70 54 61 62 29 3b 0a 20 20 7d 0a 20 20 70  x(pTab);.  }.  p
d4f0: 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d  Pk->isCovering =
d500: 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   1;.  assert( pP
d510: 6b 21 3d 30 20 29 3b 0a 20 20 6e 50 6b 20 3d 20  k!=0 );.  nPk = 
d520: 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20  pPk->nKeyCol;.. 
d530: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 65 76   /* Make sure ev
d540: 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ery column of th
d550: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
d560: 20 4e 4f 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66   NOT NULL */.  f
d570: 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69  or(i=0; i<nPk; i
d580: 2b 2b 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 61  ++){.    pTab->a
d590: 43 6f 6c 5b 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  Col[pPk->aiColum
d5a0: 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  n[i]].notNull = 
d5b0: 31 3b 0a 20 20 7d 0a 20 20 70 50 6b 2d 3e 75 6e  1;.  }.  pPk->un
d5c0: 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 0a  iqNotNull = 1;..
d5d0: 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61    /* The root pa
d5e0: 67 65 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  ge of the PRIMAR
d5f0: 59 20 4b 45 59 20 69 73 20 74 68 65 20 74 61 62  Y KEY is the tab
d600: 6c 65 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a  le root page */.
d610: 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54    pPk->tnum = pT
d620: 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20  ab->tnum;..  /* 
d630: 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Update the in-me
d640: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
d650: 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55  ion of all UNIQU
d660: 45 20 69 6e 64 69 63 65 73 20 62 79 20 63 6f 6e  E indices by con
d670: 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  verting.  ** the
d680: 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c   final rowid col
d690: 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20  umn into one or 
d6a0: 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  more columns of 
d6b0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  the PRIMARY KEY.
d6c0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78  .  */.  for(pIdx
d6d0: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
d6e0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
d6f0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
d700: 6e 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d  n;.    if( pIdx-
d710: 3e 61 75 74 6f 49 6e 64 65 78 3d 3d 32 20 29 20  >autoIndex==2 ) 
d720: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f  continue;.    fo
d730: 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20  r(i=n=0; i<nPk; 
d740: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
d750: 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d  !hasColumn(pIdx-
d760: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d  >aiColumn, pIdx-
d770: 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61  >nKeyCol, pPk->a
d780: 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b  iColumn[i]) ) n+
d790: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
d7a0: 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f   n==0 ){.      /
d7b0: 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 73 20  * This index is 
d7c0: 61 20 73 75 70 65 72 73 65 74 20 6f 66 20 74 68  a superset of th
d7d0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f  e primary key */
d7e0: 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f  .      pIdx->nCo
d7f0: 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65  lumn = pIdx->nKe
d800: 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74  yCol;.      cont
d810: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
d820: 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f  if( resizeIndexO
d830: 62 6a 65 63 74 28 64 62 2c 20 70 49 64 78 2c 20  bject(db, pIdx, 
d840: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29  pIdx->nKeyCol+n)
d850: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66   ) return;.    f
d860: 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e  or(i=0, j=pIdx->
d870: 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20  nKeyCol; i<nPk; 
d880: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
d890: 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d  !hasColumn(pIdx-
d8a0: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d  >aiColumn, pIdx-
d8b0: 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61  >nKeyCol, pPk->a
d8c0: 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20  iColumn[i]) ){. 
d8d0: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43         pIdx->aiC
d8e0: 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e  olumn[j] = pPk->
d8f0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
d900: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
d910: 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f  l[j] = pPk->azCo
d920: 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 6a  ll[i];.        j
d930: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
d940: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  }.    assert( pI
d950: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64  dx->nColumn>=pId
d960: 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a  x->nKeyCol+n );.
d970: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
d980: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a  ->nColumn>=j );.
d990: 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c    }..  /* Add al
d9a0: 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  l table columns 
d9b0: 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  to the PRIMARY K
d9c0: 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20  EY index.  */.  
d9d0: 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43  if( nPk<pTab->nC
d9e0: 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 72 65  ol ){.    if( re
d9f0: 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  sizeIndexObject(
da00: 64 62 2c 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e  db, pPk, pTab->n
da10: 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  Col) ) return;. 
da20: 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50     for(i=0, j=nP
da30: 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  k; i<pTab->nCol;
da40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
da50: 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d   !hasColumn(pPk-
da60: 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29  >aiColumn, j, i)
da70: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
da80: 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75  rt( j<pPk->nColu
da90: 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  mn );.        pP
daa0: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d  k->aiColumn[j] =
dab0: 20 69 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d   i;.        pPk-
dac0: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 22 42 49  >azColl[j] = "BI
dad0: 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20 6a  NARY";.        j
dae0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
daf0: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
db00: 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b  k->nColumn==j );
db10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61  .    assert( pTa
db20: 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20  b->nCol==j );.  
db30: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e  }else{.    pPk->
db40: 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e  nColumn = pTab->
db50: 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nCol;.  }.}../*.
db60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
db70: 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70  is called to rep
db80: 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29  ort the final ")
db90: 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65  " that terminate
dba0: 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41  s.** a CREATE TA
dbb0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
dbc0: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73  *.** The table s
dbd0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f 74  tructure that ot
dbe0: 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  her action routi
dbf0: 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62 75  nes have been bu
dc00: 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64  ilding.** is add
dc10: 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e  ed to the intern
dc20: 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20  al hash tables, 
dc30: 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f  assuming no erro
dc40: 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72  rs have.** occur
dc50: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e  red..**.** An en
dc60: 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c  try for the tabl
dc70: 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65  e is made in the
dc80: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e   master table on
dc90: 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a   disk, unless.**
dca0: 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
dcb0: 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62  rary table or db
dcc0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20  ->init.busy==1. 
dcd0: 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62   When db->init.b
dce0: 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61  usy==1.** it mea
dcf0: 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  ns we are readin
dd00: 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  g the sqlite_mas
dd10: 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75 73  ter table becaus
dd20: 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e  e we just.** con
dd30: 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64 61  nected to the da
dd40: 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75 73  tabase or becaus
dd50: 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
dd60: 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a  ter table has.**
dd70: 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65   recently change
dd80: 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20  d, so the entry 
dd90: 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 61  for this table a
dda0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69 6e  lready exists in
ddb0: 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  .** the sqlite_m
ddc0: 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65  aster table.  We
ddd0: 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20   do not want to 
dde0: 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e  create it again.
ddf0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53  .**.** If the pS
de00: 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69  elect argument i
de10: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d  s not NULL, it m
de20: 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20 72  eans that this r
de30: 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61  outine.** was ca
de40: 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
de50: 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64   table generated
de60: 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45   from a .** "CRE
de70: 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53  ATE TABLE ... AS
de80: 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61   SELECT ..." sta
de90: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c  tement.  The col
dea0: 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  umn names of.** 
deb0: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69  the new table wi
dec0: 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65 73  ll match the res
ded0: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53  ult set of the S
dee0: 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ELECT..*/.void s
def0: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a  qlite3EndTable(.
df00: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
df10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
df20: 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
df30: 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20  Token *pCons,   
df40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27          /* The '
df50: 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74  ,' token after t
df60: 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64  he last column d
df70: 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  efn. */.  Token 
df80: 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20  *pEnd,          
df90: 20 20 2f 2a 20 54 68 65 20 27 29 27 20 62 65 66    /* The ')' bef
dfa0: 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74  ore options in t
dfb0: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
dfc0: 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70 74 73 2c  */.  u8 tabOpts,
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dfe0: 45 78 74 72 61 20 74 61 62 6c 65 20 6f 70 74 69  Extra table opti
dff0: 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20  ons. Usually 0. 
e000: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
e010: 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20  lect         /* 
e020: 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43  Select from a "C
e030: 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c  REATE ... AS SEL
e040: 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ECT" */.){.  Tab
e050: 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  le *p;          
e060: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65         /* The ne
e070: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  w table */.  sql
e080: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
e090: 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61  e->db; /* The da
e0a0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
e0b0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  n */.  int iDb; 
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20   /* Database in 
e0e0: 77 68 69 63 68 20 74 68 65 20 74 61 62 6c 65 20  which the table 
e0f0: 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78  lives */.  Index
e100: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
e110: 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69       /* An impli
e120: 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ed index of the 
e130: 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20  table */..  if( 
e140: 28 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c  (pEnd==0 && pSel
e150: 65 63 74 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d  ect==0) || db->m
e160: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
e170: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
e180: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
e190: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
e1a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
e1b0: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
e1c0: 74 2e 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65  t.busy || !pSele
e1d0: 63 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ct );..  /* If t
e1e0: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  he db->init.busy
e1f0: 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73 20 77   is 1 it means w
e200: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68  e are reading th
e210: 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a 20 20  e SQL off the.  
e220: 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65  ** "sqlite_maste
e230: 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f 74 65  r" or "sqlite_te
e240: 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62 6c 65  mp_master" table
e250: 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a 20 20   on the disk..  
e260: 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69  ** So do not wri
e270: 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61  te to the disk a
e280: 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74 20 74  gain.  Extract t
e290: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
e2a0: 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ber.  ** for the
e2b0: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
e2c0: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
e2d0: 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20 70 61   field.  (The pa
e2e0: 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73  ge number.  ** s
e2f0: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
e300: 70 75 74 20 74 68 65 72 65 20 62 79 20 74 68 65  put there by the
e310: 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f   sqliteOpenCb ro
e320: 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69  utine.).  */.  i
e330: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
e340: 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20   ){.    p->tnum 
e350: 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
e360: 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70  um;.  }..  /* Sp
e370: 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67  ecial processing
e380: 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   for WITHOUT ROW
e390: 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69  ID Tables */.  i
e3a0: 66 28 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f  f( tabOpts & TF_
e3b0: 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a  WithoutRowid ){.
e3c0: 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46      if( (p->tabF
e3d0: 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
e3e0: 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20  crement) ){.    
e3f0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
e400: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
e410: 20 20 20 20 22 41 55 54 4f 49 4e 43 52 45 4d 45      "AUTOINCREME
e420: 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  NT not allowed o
e430: 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  n WITHOUT ROWID 
e440: 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20  tables");.      
e450: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
e460: 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61    if( (p->tabFla
e470: 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61  gs & TF_HasPrima
e480: 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20  ryKey)==0 ){.   
e490: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e4a0: 73 67 28 70 50 61 72 73 65 2c 20 22 50 52 49 4d  sg(pParse, "PRIM
e4b0: 41 52 59 20 4b 45 59 20 6d 69 73 73 69 6e 67 20  ARY KEY missing 
e4c0: 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c 20 70 2d  on table %s", p-
e4d0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  >zName);.    }el
e4e0: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61 62  se{.      p->tab
e4f0: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69 74 68  Flags |= TF_With
e500: 6f 75 74 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  outRowid;.      
e510: 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74  convertToWithout
e520: 52 6f 77 69 64 54 61 62 6c 65 28 70 50 61 72 73  RowidTable(pPars
e530: 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, p);.    }.  }
e540: 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ..  iDb = sqlite
e550: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
e560: 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
e570: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e580: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20  OMIT_CHECK.  /* 
e590: 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e  Resolve names in
e5a0: 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74   all CHECK const
e5b0: 72 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  raint expression
e5c0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
e5d0: 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73  >pCheck ){.    s
e5e0: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
e5f0: 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73  fReference(pPars
e600: 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b  e, p, NC_IsCheck
e610: 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b  , 0, p->pCheck);
e620: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  .  }.#endif /* !
e630: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
e640: 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20  MIT_CHECK) */.. 
e650: 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65   /* Estimate the
e660: 20 61 76 65 72 61 67 65 20 72 6f 77 20 73 69 7a   average row siz
e670: 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  e for the table 
e680: 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c  and for all impl
e690: 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20  ied indices */. 
e6a0: 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69   estimateTableWi
e6b0: 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 70 49  dth(p);.  for(pI
e6c0: 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49  dx=p->pIndex; pI
e6d0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
e6e0: 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74 69 6d  Next){.    estim
e6f0: 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49  ateIndexWidth(pI
e700: 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  dx);.  }..  /* I
e710: 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69  f not initializi
e720: 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  ng, then create 
e730: 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65  a record for the
e740: 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20   new table.  ** 
e750: 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  in the SQLITE_MA
e760: 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68  STER table of th
e770: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a  e database..  **
e780: 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73  .  ** If this is
e790: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62   a TEMPORARY tab
e7a0: 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e  le, write the en
e7b0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78  try into the aux
e7c0: 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65  iliary.  ** file
e7d0: 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f   instead of into
e7e0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
e7f0: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
e800: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
e810: 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  sy ){.    int n;
e820: 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  .    Vdbe *v;.  
e830: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20    char *zType;  
e840: 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22    /* "view" or "
e850: 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68  table" */.    ch
e860: 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a  ar *zType2;   /*
e870: 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c   "VIEW" or "TABL
e880: 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  E" */.    char *
e890: 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78  zStmt;    /* Tex
e8a0: 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
e8b0: 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20  TABLE or CREATE 
e8c0: 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a  VIEW statement *
e8d0: 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74  /..    v = sqlit
e8e0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
e8f0: 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
e900: 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b  (v==0) ) return;
e910: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ..    sqlite3Vdb
e920: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
e930: 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a  ose, 0);..    /*
e940: 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c   .    ** Initial
e950: 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68  ize zType for th
e960: 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61  e new view or ta
e970: 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
e980: 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d  if( p->pSelect==
e990: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  0 ){.      /* A 
e9a0: 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f  regular table */
e9b0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
e9c0: 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54  table";.      zT
e9d0: 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a  ype2 = "TABLE";.
e9e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e9f0: 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c  MIT_VIEW.    }el
ea00: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76  se{.      /* A v
ea10: 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  iew */.      zTy
ea20: 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20  pe = "view";.   
ea30: 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45     zType2 = "VIE
ea40: 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  W";.#endif.    }
ea50: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
ea60: 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42   is a CREATE TAB
ea70: 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20  LE xx AS SELECT 
ea80: 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65  ..., execute the
ea90: 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73   SELECT.    ** s
eaa0: 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75  tatement to popu
eab0: 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62  late the new tab
eac0: 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67  le. The root-pag
ead0: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
eae0: 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c  .    ** new tabl
eaf0: 65 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72  e is in register
eb00: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
eb10: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
eb20: 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20  Once the SELECT 
eb30: 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62  has been coded b
eb40: 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  y sqlite3Select(
eb50: 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20  ), it is in a.  
eb60: 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74    ** suitable st
eb70: 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72  ate to query for
eb80: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
eb90: 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62  s and types to b
eba0: 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79  e used.    ** by
ebb0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a   the new table..
ebc0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20      **.    ** A 
ebd0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 77 72 69  shared-cache wri
ebe0: 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  te-lock is not r
ebf0: 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65  equired to write
ec00: 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c   to the new tabl
ec10: 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73  e,.    ** as a s
ec20: 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20  chema-lock must 
ec30: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
ec40: 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72  n obtained to cr
ec50: 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20  eate it. Since. 
ec60: 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c     ** a schema-l
ec70: 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c  ock excludes all
ec80: 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
ec90: 75 73 65 72 73 2c 20 74 68 65 20 77 72 69 74 65  users, the write
eca0: 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20  -lock would.    
ecb0: 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e  ** be redundant.
ecc0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
ecd0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
ece0: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
ecf0: 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  ;.      Table *p
ed00: 53 65 6c 54 61 62 3b 0a 0a 20 20 20 20 20 20 61  SelTab;..      a
ed10: 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54  ssert(pParse->nT
ed20: 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71  ab==1);.      sq
ed30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
ed40: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
ed50: 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67 52   1, pParse->regR
ed60: 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  oot, iDb);.     
ed70: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
ed80: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50  geP5(v, OPFLAG_P
ed90: 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20 20 70  2ISREG);.      p
eda0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b  Parse->nTab = 2;
edb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
edc0: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
edd0: 73 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31  st, SRT_Table, 1
ede0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
edf0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
ee00: 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a  Select, &dest);.
ee10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ee20: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
ee30: 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  ose, 1);.      i
ee40: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
ee50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53  =0 ){.        pS
ee60: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
ee70: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
ee80: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
ee90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
eea0: 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75  SelTab==0 ) retu
eeb0: 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rn;.        asse
eec0: 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29  rt( p->aCol==0 )
eed0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f  ;.        p->nCo
eee0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
eef0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43  l;.        p->aC
ef00: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
ef10: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c  ol;.        pSel
ef20: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
ef30: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
ef40: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
ef50: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
ef60: 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62  able(db, pSelTab
ef70: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ef80: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
ef90: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
efa0: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
efb0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
efc0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
efd0: 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63  .      zStmt = c
efe0: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64  reateTableStmt(d
eff0: 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  b, p);.    }else
f000: 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  {.      Token *p
f010: 45 6e 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f  End2 = tabOpts ?
f020: 20 26 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54   &pParse->sLastT
f030: 6f 6b 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20  oken : pEnd;.   
f040: 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e     n = (int)(pEn
f050: 64 32 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e  d2->z - pParse->
f060: 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20  sNameToken.z);. 
f070: 20 20 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e       if( pEnd2->
f080: 7a 5b 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d  z[0]!=';' ) n +=
f090: 20 70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20   pEnd2->n;.     
f0a0: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
f0b0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20  MPrintf(db, .   
f0c0: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 25         "CREATE %
f0d0: 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c  s %.*s", zType2,
f0e0: 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d   n, pParse->sNam
f0f0: 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29  eToken.z.      )
f100: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
f110: 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72  A slot for the r
f120: 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64  ecord has alread
f130: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
f140: 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   in the .    ** 
f150: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
f160: 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65  ble.  We just ne
f170: 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61  ed to update tha
f180: 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a  t slot with all.
f190: 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72      ** the infor
f1a0: 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c  mation we've col
f1b0: 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  lected..    */. 
f1c0: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
f1d0: 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
f1e0: 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
f1f0: 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45  s ".         "SE
f200: 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d  T type='%s', nam
f210: 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25  e=%Q, tbl_name=%
f220: 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c  Q, rootpage=#%d,
f230: 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20   sql=%Q ".      
f240: 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25   "WHERE rowid=#%
f250: 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44  d",.      db->aD
f260: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
f270: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
f280: 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20  .      zType,.  
f290: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
f2a0: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
f2b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52      pParse->regR
f2c0: 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74  oot,.      zStmt
f2d0: 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ,.      pParse->
f2e0: 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a  regRowid.    );.
f2f0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
f300: 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20  e(db, zStmt);.  
f310: 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
f320: 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
f330: 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
f340: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
f350: 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68  REMENT.    /* Ch
f360: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
f370: 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
f380: 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  an sqlite_sequen
f390: 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20  ce table for.   
f3a0: 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63   ** keeping trac
f3b0: 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65  k of autoincreme
f3c0: 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a  nt keys..    */.
f3d0: 20 20 20 20 69 66 28 20 70 2d 3e 74 61 62 46 6c      if( p->tabFl
f3e0: 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
f3f0: 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  rement ){.      
f400: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
f410: 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 61  Db[iDb];.      a
f420: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
f430: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
f440: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20  , iDb, 0) );.   
f450: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68     if( pDb->pSch
f460: 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20  ema->pSeqTab==0 
f470: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
f480: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
f490: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
f4a0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51  "CREATE TABLE %Q
f4b0: 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  .sqlite_sequence
f4c0: 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20  (name,seq)",.   
f4d0: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d         pDb->zNam
f4e0: 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  e.        );.   
f4f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
f500: 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73  f..    /* Repars
f510: 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20  e everything to 
f520: 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72  update our inter
f530: 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75  nal data structu
f540: 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  res */.    sqlit
f550: 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63  e3VdbeAddParseSc
f560: 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20  hemaOp(v, iDb,. 
f570: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f580: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62  3MPrintf(db, "tb
f590: 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20  l_name='%q' AND 
f5a0: 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
f5b0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20  , p->zName));.  
f5c0: 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  }...  /* Add the
f5d0: 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e   table to the in
f5e0: 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e  -memory represen
f5f0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61  tation of the da
f600: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  tabase..  */.  i
f610: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
f620: 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70   ){.    Table *p
f630: 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20  Old;.    Schema 
f640: 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53  *pSchema = p->pS
f650: 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72  chema;.    asser
f660: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
f670: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
f680: 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c  b, 0) );.    pOl
f690: 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  d = sqlite3HashI
f6a0: 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e  nsert(&pSchema->
f6b0: 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d  tblHash, p->zNam
f6c0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
f6f0: 70 2d 3e 7a 4e 61 6d 65 29 2c 70 29 3b 0a 20 20  p->zName),p);.  
f700: 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20    if( pOld ){.  
f710: 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70      assert( p==p
f720: 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  Old );  /* Mallo
f730: 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
f740: 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e  ed inside HashIn
f750: 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20  sert() */.      
f760: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f770: 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
f780: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rn;.    }.    pP
f790: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
f7a0: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61  = 0;.    db->fla
f7b0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
f7c0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66  ernChanges;..#if
f7d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f7e0: 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20  _ALTERTABLE.    
f7f0: 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20  if( !p->pSelect 
f800: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
f810: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f  har *zName = (co
f820: 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61 72 73  nst char *)pPars
f830: 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b  e->sNameToken.z;
f840: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65  .      int nName
f850: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f860: 21 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e  !pSelect && pCon
f870: 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20  s && pEnd );.   
f880: 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d     if( pCons->z=
f890: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
f8a0: 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20  ons = pEnd;.    
f8b0: 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20    }.      nName 
f8c0: 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63  = (int)((const c
f8d0: 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d  har *)pCons->z -
f8e0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70   zName);.      p
f8f0: 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d  ->addColOffset =
f900: 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66   13 + sqlite3Utf
f910: 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20  8CharLen(zName, 
f920: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65  nName);.    }.#e
f930: 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ndif.  }.}..#ifn
f940: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f950: 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  VIEW./*.** The p
f960: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
f970: 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65   routine in orde
f980: 72 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  r to create a ne
f990: 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73  w VIEW.*/.void s
f9a0: 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77  qlite3CreateView
f9b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f9c0: 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e,     /* The pa
f9d0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
f9e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e  .  Token *pBegin
f9f0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
fa00: 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
fa10: 65 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d  egins the statem
fa20: 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ent */.  Token *
fa30: 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54  pName1,     /* T
fa40: 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f  he token that ho
fa50: 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  lds the name of 
fa60: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f  the view */.  To
fa70: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
fa80: 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
fa90: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
faa0: 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
fab0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
fac0: 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43  ct,   /* A SELEC
fad0: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
fae0: 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
faf0: 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69   new view */.  i
fb00: 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
fb10: 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20    /* TRUE for a 
fb20: 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a  TEMPORARY view *
fb30: 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20  /.  int noErr   
fb40: 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65         /* Suppre
fb50: 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ss error message
fb60: 73 20 69 66 20 56 49 45 57 20 61 6c 72 65 61 64  s if VIEW alread
fb70: 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
fb80: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
fb90: 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   n;.  const char
fba0: 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
fbb0: 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  d;.  DbFixer sFi
fbc0: 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  x;.  Token *pNam
fbd0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44 62  e = 0;.  int iDb
fbe0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
fbf0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
fc00: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61   if( pParse->nVa
fc10: 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r>0 ){.    sqlit
fc20: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
fc30: 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20 61  e, "parameters a
fc40: 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69  re not allowed i
fc50: 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20 73  n views");.    s
fc60: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
fc70: 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  te(db, pSelect);
fc80: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
fc90: 0a 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  .  sqlite3StartT
fca0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61  able(pParse, pNa
fcb0: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54  me1, pName2, isT
fcc0: 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72  emp, 1, 0, noErr
fcd0: 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  );.  p = pParse-
fce0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
fcf0: 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p==0 || pParse
fd00: 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ->nErr ){.    sq
fd10: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
fd20: 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e(db, pSelect);.
fd30: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
fd40: 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74    sqlite3TwoPart
fd50: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
fd60: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
fd70: 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71  ame);.  iDb = sq
fd80: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
fd90: 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  ex(db, p->pSchem
fda0: 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 78  a);.  sqlite3Fix
fdb0: 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72  Init(&sFix, pPar
fdc0: 73 65 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c  se, iDb, "view",
fdd0: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 73   pName);.  if( s
fde0: 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28  qlite3FixSelect(
fdf0: 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 20  &sFix, pSelect) 
fe00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
fe10: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
fe20: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
fe30: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  urn;.  }..  /* M
fe40: 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
fe50: 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54 20  e entire SELECT 
fe60: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
fe70: 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
fe80: 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20  .  ** This will 
fe90: 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45 78  force all the Ex
fea0: 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65  pr.token.z value
feb0: 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63 61  s to be dynamica
fec0: 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  lly.  ** allocat
fed0: 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20 70  ed rather than p
fee0: 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70 75  oint to the inpu
fef0: 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63 68  t string - which
ff00: 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a   means that.  **
ff10: 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73 69   they will persi
ff20: 73 74 20 61 66 74 65 72 20 74 68 65 20 63 75 72  st after the cur
ff30: 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 65  rent sqlite3_exe
ff40: 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  c() call returns
ff50: 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c  ..  */.  p->pSel
ff60: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
ff70: 65 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c 65  ectDup(db, pSele
ff80: 63 74 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55  ct, EXPRDUP_REDU
ff90: 43 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  CE);.  sqlite3Se
ffa0: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
ffb0: 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 64  Select);.  if( d
ffc0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ffd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
ffe0: 20 7d 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e   }.  if( !db->in
fff0: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 73  it.busy ){.    s
10000 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
10010 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
10020 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c   p);.  }..  /* L
10030 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  ocate the end of
10040 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57   the CREATE VIEW
10050 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b   statement.  Mak
10060 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a  e sEnd point to.
10070 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20    ** the end..  
10080 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72  */.  sEnd = pPar
10090 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a  se->sLastToken;.
100a0 20 20 69 66 28 20 41 4c 57 41 59 53 28 73 45 6e    if( ALWAYS(sEn
100b0 64 2e 7a 5b 30 5d 21 3d 30 29 20 26 26 20 73 45  d.z[0]!=0) && sE
100c0 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a  nd.z[0]!=';' ){.
100d0 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45      sEnd.z += sE
100e0 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64  nd.n;.  }.  sEnd
100f0 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69  .n = 0;.  n = (i
10100 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65  nt)(sEnd.z - pBe
10110 67 69 6e 2d 3e 7a 29 3b 0a 20 20 7a 20 3d 20 70  gin->z);.  z = p
10120 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c  Begin->z;.  whil
10130 65 28 20 41 4c 57 41 59 53 28 6e 3e 30 29 20 26  e( ALWAYS(n>0) &
10140 26 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  & sqlite3Isspace
10150 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b  (z[n-1]) ){ n--;
10160 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a   }.  sEnd.z = &z
10170 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20  [n-1];.  sEnd.n 
10180 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73  = 1;..  /* Use s
10190 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
101a0 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65 77   to add the view
101b0 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   to the SQLITE_M
101c0 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20  ASTER table */. 
101d0 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
101e0 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45 6e  (pParse, 0, &sEn
101f0 64 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75  d, 0, 0);.  retu
10200 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rn;.}.#endif /* 
10210 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
10220 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65   */..#if !define
10230 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
10240 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
10250 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
10260 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20  UALTABLE)./*.** 
10270 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  The Table struct
10280 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 65  ure pTable is re
10290 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69  ally a VIEW.  Fi
102a0 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20  ll in the names 
102b0 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e  of.** the column
102c0 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e  s of the view in
102d0 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 75   the pTable stru
102e0 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74  cture.  Return t
102f0 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
10300 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65  errors.  If an e
10310 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61  rror is seen lea
10320 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
10330 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
10340 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73  ErrMsg..*/.int s
10350 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
10360 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a  umnNames(Parse *
10370 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
10380 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20  Table){.  Table 
10390 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41  *pSelTab;   /* A
103a0 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d   fake table from
103b0 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74 68   which we get th
103c0 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
103d0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
103e0 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74      /* Copy of t
103f0 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 69  he SELECT that i
10400 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69  mplements the vi
10410 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72  ew */.  int nErr
10420 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d   = 0;     /* Num
10430 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e  ber of errors en
10440 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69  countered */.  i
10450 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
10460 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20   /* Temporarily 
10470 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72  holds the number
10480 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73 69   of cursors assi
10490 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gned */.  sqlite
104a0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
104b0 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65  db;  /* Database
104c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20   connection for 
104d0 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f  malloc errors */
104e0 0a 20 20 69 6e 74 20 28 2a 78 41 75 74 68 29 28  .  int (*xAuth)(
104f0 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
10500 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
10510 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  *,const char*,co
10520 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a 20 20 61  nst char*);..  a
10530 73 73 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b  ssert( pTable );
10540 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10550 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
10560 4c 45 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  LE.  if( sqlite3
10570 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28  VtabCallConnect(
10580 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20  pParse, pTable) 
10590 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
105a0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
105b0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
105c0 70 54 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e  pTable) ) return
105d0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   0;.#endif..#ifn
105e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
105f0 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69  VIEW.  /* A posi
10600 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20  tive nCol means 
10610 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65  the columns name
10620 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 77 20  s for this view 
10630 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  are.  ** already
10640 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69   known..  */.  i
10650 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e  f( pTable->nCol>
10660 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
10670 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e   /* A negative n
10680 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c  Col is a special
10690 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20   marker meaning 
106a0 74 68 61 74 20 77 65 20 61 72 65 20 63 75 72 72  that we are curr
106b0 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e  ently.  ** tryin
106c0 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  g to compute the
106d0 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
106e0 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 69 73  If we enter this
106f0 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20   routine with.  
10700 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43  ** a negative nC
10710 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f  ol, it means two
10720 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66   or more views f
10730 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65  orm a loop, like
10740 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a   this:.  **.  **
10750 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57       CREATE VIEW
10760 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a   one AS SELECT *
10770 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20   FROM two;.  ** 
10780 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20      CREATE VIEW 
10790 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20  two AS SELECT * 
107a0 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20  FROM one;.  **. 
107b0 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68   ** Actually, th
107c0 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20 69 73  e error above is
107d0 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 69 6f   now caught prio
107e0 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 74 68  r to reaching th
107f0 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42  is point..  ** B
10800 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ut the following
10810 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c 20 69   test is still i
10820 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74 20 64  mportant as it d
10830 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a  oes come up.  **
10840 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
10850 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20  g:.  ** .  **   
10860 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d    CREATE TABLE m
10870 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a  ain.ex1(a);.  **
10880 20 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50       CREATE TEMP
10890 20 56 49 45 57 20 65 78 31 20 41 53 20 53 45 4c   VIEW ex1 AS SEL
108a0 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a  ECT a FROM ex1;.
108b0 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
108c0 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b  * FROM temp.ex1;
108d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
108e0 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20  le->nCol<0 ){.  
108f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10900 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20  g(pParse, "view 
10910 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79  %s is circularly
10920 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c   defined", pTabl
10930 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  e->zName);.    r
10940 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61  eturn 1;.  }.  a
10950 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
10960 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Col>=0 );..  /* 
10970 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66  If we get this f
10980 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20  ar, it means we 
10990 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  need to compute 
109a0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e  the table names.
109b0 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  .  ** Note that 
109c0 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  the call to sqli
109d0 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
109e0 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61  lect() will expa
109f0 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20  nd any.  ** "*" 
10a00 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
10a10 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74  results set of t
10a20 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c  he view and will
10a30 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a   assign cursors.
10a40 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d    ** to the elem
10a50 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d  ents of the FROM
10a60 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65   clause.  But we
10a70 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65   do not want the
10a80 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20  se changes.  ** 
10a90 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e  to be permanent.
10aa0 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61    So the computa
10ab0 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20  tion is done on 
10ac0 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45  a copy of the SE
10ad0 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d  LECT.  ** statem
10ae0 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
10af0 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a   the view..  */.
10b00 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
10b10 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70  ->pSelect );.  p
10b20 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  Sel = sqlite3Sel
10b30 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c  ectDup(db, pTabl
10b40 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a  e->pSelect, 0);.
10b50 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20    if( pSel ){.  
10b60 20 20 75 38 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61    u8 enableLooka
10b70 73 69 64 65 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61  side = db->looka
10b80 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 3b 0a 20  side.bEnabled;. 
10b90 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e     n = pParse->n
10ba0 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Tab;.    sqlite3
10bb0 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
10bc0 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65  sors(pParse, pSe
10bd0 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54  l->pSrc);.    pT
10be0 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b  able->nCol = -1;
10bf0 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
10c00 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b  de.bEnabled = 0;
10c10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10c20 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
10c30 4f 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64  ON.    xAuth = d
10c40 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62  b->xAuth;.    db
10c50 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20  ->xAuth = 0;.   
10c60 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
10c70 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
10c80 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
10c90 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68  );.    db->xAuth
10ca0 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a   = xAuth;.#else.
10cb0 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71      pSelTab = sq
10cc0 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66  lite3ResultSetOf
10cd0 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
10ce0 53 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Sel);.#endif.   
10cf0 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
10d00 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65  Enabled = enable
10d10 4c 6f 6f 6b 61 73 69 64 65 3b 0a 20 20 20 20 70  Lookaside;.    p
10d20 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b  Parse->nTab = n;
10d30 0a 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62  .    if( pSelTab
10d40 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
10d50 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d  ( pTable->aCol==
10d60 30 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c  0 );.      pTabl
10d70 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->nCol = pSelTa
10d80 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->nCol;.      p
10d90 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53  Table->aCol = pS
10da0 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20  elTab->aCol;.   
10db0 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
10dc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c   = 0;.      pSel
10dd0 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
10de0 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65       sqlite3Dele
10df0 74 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c  teTable(db, pSel
10e00 54 61 62 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Tab);.      asse
10e10 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
10e20 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
10e30 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d  , pTable->pSchem
10e40 61 29 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  a) );.      pTab
10e50 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6c 61  le->pSchema->fla
10e60 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74  gs |= DB_Unreset
10e70 56 69 65 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65  Views;.    }else
10e80 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  {.      pTable->
10e90 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
10ea0 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nErr++;.    }.  
10eb0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
10ec0 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b  elete(db, pSel);
10ed0 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
10ee0 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64  nErr++;.  }.#end
10ef0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
10f00 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75  T_VIEW */.  retu
10f10 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e  rn nErr;  .}.#en
10f20 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
10f30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
10f40 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
10f50 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
10f60 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e  LTABLE) */..#ifn
10f70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10f80 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  VIEW./*.** Clear
10f90 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
10fa0 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45  s from every VIE
10fb0 57 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64  W in database id
10fc0 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
10fd0 64 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  d sqliteViewRese
10fe0 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  tAll(sqlite3 *db
10ff0 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61  , int idx){.  Ha
11000 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73  shElem *i;.  ass
11010 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
11020 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
11030 69 64 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28  idx, 0) );.  if(
11040 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28   !DbHasProperty(
11050 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
11060 73 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75  setViews) ) retu
11070 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  rn;.  for(i=sqli
11080 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
11090 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d  >aDb[idx].pSchem
110a0 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69  a->tblHash); i;i
110b0 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
110c0 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a  i)){.    Table *
110d0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73  pTab = sqliteHas
110e0 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66  hData(i);.    if
110f0 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  ( pTab->pSelect 
11100 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 44  ){.      sqliteD
11110 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
11120 28 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  (db, pTab);.    
11130 20 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30    pTab->aCol = 0
11140 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43  ;.      pTab->nC
11150 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ol = 0;.    }.  
11160 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65  }.  DbClearPrope
11170 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
11180 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d  UnresetViews);.}
11190 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
111a0 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
111b0 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f  ll(A,B).#endif /
111c0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
111d0 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  EW */../*.** Thi
111e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
111f0 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45  lled by the VDBE
11200 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69   to adjust the i
11210 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
11220 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65  * used by SQLite
11230 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20   when the btree 
11240 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61  layer moves a ta
11250 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54  ble root page. T
11260 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20  he.** root-page 
11270 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
11280 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20  dex in database 
11290 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20  iDb has changed 
112a0 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f  from iFrom.** to
112b0 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b   iTo..**.** Tick
112c0 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20 73  et #1728:  The s
112d0 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68  ymbol table migh
112e0 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  t still contain 
112f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f  information.** o
11300 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20  n tables and/or 
11310 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72 65  indices that are
11320 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20   the process of 
11330 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a  being deleted..*
11340 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c  * If you are unl
11350 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f  ucky, one of tho
11360 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  se deleted indic
11370 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67  es or tables mig
11380 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73  ht.** have the s
11390 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d  ame rootpage num
113a0 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c 20  ber as the real 
113b0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
113c0 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20  hat is.** being 
113d0 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61  moved.  So we ca
113e0 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68  nnot stop search
113f0 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66 69  ing after the fi
11400 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65  rst match .** be
11410 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74 20  cause the first 
11420 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20 66  match might be f
11430 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65  or one of the de
11440 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a  leted indices.**
11450 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e   or tables and n
11460 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64  ot the table/ind
11470 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75 61  ex that is actua
11480 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e  lly being moved.
11490 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74  .** We must cont
114a0 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74  inue looping unt
114b0 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e  il all tables an
114c0 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a  d indices with.*
114d0 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f  * rootpage==iFro
114e0 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76  m have been conv
114f0 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61 20  erted to have a 
11500 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a  rootpage of iTo.
11510 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ** in order to b
11520 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 77  e certain that w
11530 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74 20  e got the right 
11540 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  one..*/.#ifndef 
11550 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
11560 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69  VACUUM.void sqli
11570 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64  te3RootPageMoved
11580 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
11590 74 20 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d  t iDb, int iFrom
115a0 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61  , int iTo){.  Ha
115b0 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20  shElem *pElem;. 
115c0 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20   Hash *pHash;.  
115d0 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65  Db *pDb;..  asse
115e0 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
115f0 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
11600 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20  Db, 0) );.  pDb 
11610 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
11620 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d  .  pHash = &pDb-
11630 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
11640 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  h;.  for(pElem=s
11650 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
11660 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
11670 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
11680 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
11690 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
116a0 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
116b0 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  em);.    if( pTa
116c0 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  b->tnum==iFrom )
116d0 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e  {.      pTab->tn
116e0 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a  um = iTo;.    }.
116f0 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70    }.  pHash = &p
11700 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78  Db->pSchema->idx
11710 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65  Hash;.  for(pEle
11720 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
11730 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  t(pHash); pElem;
11740 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
11750 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
11760 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d     Index *pIdx =
11770 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
11780 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
11790 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pIdx->tnum==iFro
117a0 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  m ){.      pIdx-
117b0 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
117c0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
117d0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64  ./*.** Write cod
117e0 65 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74  e to erase the t
117f0 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
11800 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20  age iTable from 
11810 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a  database iDb..**
11820 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65   Also write code
11830 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73   to modify the s
11840 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
11850 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20  le and internal 
11860 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72  schema.** if a r
11870 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74  oot-page of anot
11880 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
11890 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d  ed by the btree-
118a0 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20  layer whilst.** 
118b0 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28  erasing iTable (
118c0 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
118d0 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
118e0 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
118f0 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  / .static void d
11900 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50  estroyRootPage(P
11910 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
11920 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44  t iTable, int iD
11930 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
11940 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
11950 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31  Parse);.  int r1
11960 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
11970 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
11980 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11990 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c  3(v, OP_Destroy,
119a0 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69 44 62   iTable, r1, iDb
119b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61 79 41  );.  sqlite3MayA
119c0 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a 23 69  bort(pParse);.#i
119d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
119e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
119f0 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73 74 6f  * OP_Destroy sto
11a00 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65 67 65  res an in intege
11a10 72 20 72 31 2e 20 49 66 20 74 68 69 73 20 69 6e  r r1. If this in
11a20 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f  teger.  ** is no
11a30 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20  n-zero, then it 
11a40 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
11a50 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62   number of a tab
11a60 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a  le moved to.  **
11a70 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65   location iTable
11a80 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
11a90 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68  code modifies th
11aa0 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
11ab0 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65  table to.  ** re
11ac0 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a  flect this..  **
11ad0 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22  .  ** The "#NNN"
11ae0 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61   in the SQL is a
11af0 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e   special constan
11b00 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61  t that means wha
11b10 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a  tever value.  **
11b20 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72 20   is in register 
11b30 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d 6d 61  NNN.  See gramma
11b40 72 20 72 75 6c 65 73 20 61 73 73 6f 63 69 61 74  r rules associat
11b50 65 64 20 77 69 74 68 20 74 68 65 20 54 4b 5f 52  ed with the TK_R
11b60 45 47 49 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b  EGISTER.  ** tok
11b70 65 6e 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  en for additiona
11b80 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20  l information.. 
11b90 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73   */.  sqlite3Nes
11ba0 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
11bb0 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20 25   .     "UPDATE %
11bc0 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61 67  Q.%s SET rootpag
11bd0 65 3d 25 64 20 57 48 45 52 45 20 23 25 64 20 41  e=%d WHERE #%d A
11be0 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 22  ND rootpage=#%d"
11bf0 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64  ,.     pParse->d
11c00 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
11c10 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
11c20 69 44 62 29 2c 20 69 54 61 62 6c 65 2c 20 72 31  iDb), iTable, r1
11c30 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  , r1);.#endif.  
11c40 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
11c50 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
11c60 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  );.}../*.** Writ
11c70 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20 65  e VDBE code to e
11c80 72 61 73 65 20 74 61 62 6c 65 20 70 54 61 62 20  rase table pTab 
11c90 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61 74  and all associat
11ca0 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64 69  ed indices on di
11cb0 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75  sk..** Code to u
11cc0 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  pdate the sqlite
11cd0 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20 61  _master tables a
11ce0 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
11cf0 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a  ma definitions.*
11d00 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f 74  * in case a root
11d10 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20  -page belonging 
11d20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  to another table
11d30 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65   is moved by the
11d40 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20   btree layer.** 
11d50 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28 74  is also added (t
11d60 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
11d70 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
11d80 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
11d90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73  .static void des
11da0 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65 20  troyTable(Parse 
11db0 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
11dc0 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53 51  pTab){.#ifdef SQ
11dd0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
11de0 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49  CUUM.  Index *pI
11df0 64 78 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20  dx;.  int iDb = 
11e00 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
11e10 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
11e20 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
11e30 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61  .  destroyRootPa
11e40 67 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  ge(pParse, pTab-
11e50 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66  >tnum, iDb);.  f
11e60 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
11e70 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
11e80 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
11e90 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61     destroyRootPa
11ea0 67 65 28 70 50 61 72 73 65 2c 20 70 49 64 78 2d  ge(pParse, pIdx-
11eb0 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d  >tnum, iDb);.  }
11ec0 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74  .#else.  /* If t
11ed0 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79 20  he database may 
11ee0 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  be auto-vacuum c
11ef0 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49 54  apable (if SQLIT
11f00 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
11f10 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65  M.  ** is not de
11f20 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74 20  fined), then it 
11f30 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
11f40 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20  call OP_Destroy 
11f50 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c  on the.  ** tabl
11f60 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74  e and index root
11f70 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72 2c  -pages in order,
11f80 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74   starting with t
11f90 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a  he numerically .
11fa0 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f    ** largest roo
11fb0 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54  t-page number. T
11fc0 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20 74  his guarantees t
11fd0 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20  hat none of the 
11fe0 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20  root-pages.  ** 
11ff0 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  to be destroyed 
12000 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79 20  is relocated by 
12010 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44 65  an earlier OP_De
12020 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74  stroy. i.e. if t
12030 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  he.  ** followin
12040 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20 20  g were coded:.  
12050 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72  **.  ** OP_Destr
12060 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a  oy 4 0.  ** ....
12070 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
12080 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e  5 0.  **.  ** an
12090 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68 61  d root page 5 ha
120a0 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68 65  ppened to be the
120b0 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
120c0 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ge number in the
120d0 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
120e0 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20 35  then root page 5
120f0 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64 20   would be moved 
12100 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68 65  to page 4 by the
12110 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72   .  ** "OP_Destr
12120 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e 20  oy 4 0" opcode. 
12130 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 22  The subsequent "
12140 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22 20  OP_Destroy 5 0" 
12150 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61  would hit.  ** a
12160 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65 2e   free-list page.
12170 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  .  */.  int iTab
12180 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20   = pTab->tnum;. 
12190 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64 20   int iDestroyed 
121a0 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31  = 0;..  while( 1
121b0 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   ){.    Index *p
121c0 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61  Idx;.    int iLa
121d0 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20  rgest = 0;..    
121e0 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d 3d  if( iDestroyed==
121f0 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74 72  0 || iTab<iDestr
12200 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69 4c  oyed ){.      iL
12210 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a 20  argest = iTab;. 
12220 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49 64     }.    for(pId
12230 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
12240 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
12250 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
12260 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d 3e  nt iIdx = pIdx->
12270 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  tnum;.      asse
12280 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65 6d  rt( pIdx->pSchem
12290 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
122a0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
122b0 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20  Destroyed==0 || 
122c0 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65 64  (iIdx<iDestroyed
122d0 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72 67  )) && iIdx>iLarg
122e0 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  est ){.        i
122f0 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b 0a  Largest = iIdx;.
12300 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12310 20 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d 3d    if( iLargest==
12320 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
12330 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  n;.    }else{.  
12340 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71      int iDb = sq
12350 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
12360 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
12370 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
12380 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62       assert( iDb
12390 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72 73  >=0 && iDb<pPars
123a0 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  e->db->nDb );.  
123b0 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
123c0 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72  age(pParse, iLar
123d0 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20  gest, iDb);.    
123e0 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69    iDestroyed = i
123f0 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20  Largest;.    }. 
12400 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
12410 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72 69 65  ** Remove entrie
12420 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74  s from the sqlit
12430 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 20 28  e_statN tables (
12440 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29  for N in (1,2,3)
12450 29 0a 2a 2a 20 61 66 74 65 72 20 61 20 44 52 4f  ).** after a DRO
12460 50 20 49 4e 44 45 58 20 6f 72 20 44 52 4f 50 20  P INDEX or DROP 
12470 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TABLE command..*
12480 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
12490 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61  lite3ClearStatTa
124a0 62 6c 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  bles(.  Parse *p
124b0 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
124c0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
124d0 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ntext */.  int i
124e0 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
124f0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
12500 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f  e number */.  co
12510 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c  nst char *zType,
12520 20 20 20 20 20 2f 2a 20 22 69 64 78 22 20 6f 72       /* "idx" or
12530 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73   "tbl" */.  cons
12540 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20  t char *zName   
12550 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e     /* Name of in
12560 64 65 78 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a  dex or table */.
12570 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  ){.  int i;.  co
12580 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
12590 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  e = pParse->db->
125a0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
125b0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b    for(i=1; i<=4;
125c0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
125d0 7a 54 61 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71  zTab[24];.    sq
125e0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
125f0 69 7a 65 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62  izeof(zTab),zTab
12600 2c 22 73 71 6c 69 74 65 5f 73 74 61 74 25 64 22  ,"sqlite_stat%d"
12610 2c 69 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ,i);.    if( sql
12620 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
12630 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20  arse->db, zTab, 
12640 7a 44 62 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  zDbName) ){.    
12650 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
12660 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
12670 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
12680 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 25 73  M %Q.%s WHERE %s
12690 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44  =%Q",.        zD
126a0 62 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79  bName, zTab, zTy
126b0 70 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20  pe, zName.      
126c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
126d0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
126e0 6f 64 65 20 74 6f 20 64 72 6f 70 20 61 20 74 61  ode to drop a ta
126f0 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
12700 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61 62 6c  ite3CodeDropTabl
12710 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
12720 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e   Table *pTab, in
12730 74 20 69 44 62 2c 20 69 6e 74 20 69 73 56 69 65  t iDb, int isVie
12740 77 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  w){.  Vdbe *v;. 
12750 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
12760 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69  Parse->db;.  Tri
12770 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a  gger *pTrigger;.
12780 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
12790 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20  >aDb[iDb];..  v 
127a0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
127b0 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
127c0 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71  rt( v!=0 );.  sq
127d0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
127e0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
127f0 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64   1, iDb);..#ifnd
12800 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
12810 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
12820 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
12830 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
12840 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
12850 5f 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65  _VBegin);.  }.#e
12860 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20  ndif..  /* Drop 
12870 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73 73  all triggers ass
12880 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
12890 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
128a0 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20  pped. Code.  ** 
128b0 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20  is generated to 
128c0 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  remove entries f
128d0 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  rom sqlite_maste
128e0 72 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71  r and/or.  ** sq
128f0 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
12900 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20   if required..  
12910 2a 2f 0a 20 20 70 54 72 69 67 67 65 72 20 3d 20  */.  pTrigger = 
12920 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c 69  sqlite3TriggerLi
12930 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  st(pParse, pTab)
12940 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72 69 67  ;.  while( pTrig
12950 67 65 72 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ger ){.    asser
12960 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63  t( pTrigger->pSc
12970 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68  hema==pTab->pSch
12980 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  ema || .        
12990 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
129a0 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
129b0 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c  chema );.    sql
129c0 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50  ite3DropTriggerP
129d0 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67  tr(pParse, pTrig
129e0 67 65 72 29 3b 0a 20 20 20 20 70 54 72 69 67 67  ger);.    pTrigg
129f0 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e 70  er = pTrigger->p
12a00 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  Next;.  }..#ifnd
12a10 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
12a20 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f  UTOINCREMENT.  /
12a30 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74  * Remove any ent
12a40 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ries of the sqli
12a50 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
12a60 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
12a70 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65  h.  ** the table
12a80 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20   being dropped. 
12a90 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65 66  This is done bef
12aa0 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69 73  ore the table is
12ab0 20 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74   dropped.  ** at
12ac0 20 74 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c   the btree level
12ad0 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 71  , in case the sq
12ae0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
12af0 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a  ble needs to.  *
12b00 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65 73 75  * move as a resu
12b10 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70 20 28  lt of the drop (
12b20 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20 61 75  can happen in au
12b30 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e  to-vacuum mode).
12b40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
12b50 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
12b60 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b  Autoincrement ){
12b70 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
12b80 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
12b90 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
12ba0 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71  OM %Q.sqlite_seq
12bb0 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65  uence WHERE name
12bc0 3d 25 51 22 2c 0a 20 20 20 20 20 20 70 44 62 2d  =%Q",.      pDb-
12bd0 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e  >zName, pTab->zN
12be0 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23  ame.    );.  }.#
12bf0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70  endif..  /* Drop
12c00 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54   all SQLITE_MAST
12c10 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  ER table and ind
12c20 65 78 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ex entries that 
12c30 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20 20 2a  refer to the.  *
12c40 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f  * table. The pro
12c50 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20  gram name loops 
12c60 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74  through the mast
12c70 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c  er table and del
12c80 65 74 65 73 0a 20 20 2a 2a 20 65 76 65 72 79 20  etes.  ** every 
12c90 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20  row that refers 
12ca0 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68  to a table of th
12cb0 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
12cc0 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a  he one being.  *
12cd0 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67 67  * dropped. Trigg
12ce0 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ers are handled 
12cf0 73 65 70 61 72 61 74 65 6c 79 20 62 65 63 61 75  separately becau
12d00 73 65 20 61 20 74 72 69 67 67 65 72 20 63 61 6e  se a trigger can
12d10 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64   be.  ** created
12d20 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74   in the temp dat
12d30 61 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72  abase that refer
12d40 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20  s to a table in 
12d50 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64 61 74  another.  ** dat
12d60 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  abase..  */.  sq
12d70 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
12d80 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
12d90 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e  "DELETE FROM %Q.
12da0 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d  %s WHERE tbl_nam
12db0 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21 3d 27  e=%Q and type!='
12dc0 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20 20 20  trigger'",.     
12dd0 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48   pDb->zName, SCH
12de0 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
12df0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
12e00 69 66 28 20 21 69 73 56 69 65 77 20 26 26 20 21  if( !isView && !
12e10 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
12e20 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 54 61  ){.    destroyTa
12e30 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
12e40 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d  );.  }..  /* Rem
12e50 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e  ove the table en
12e60 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27  try from SQLite'
12e70 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  s internal schem
12e80 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a  a and modify.  *
12e90 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * the schema coo
12ea0 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  kie..  */.  if( 
12eb0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
12ec0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
12ed0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
12ee0 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c  Destroy, iDb, 0,
12ef0 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
12f00 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
12f10 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
12f20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20 69 44  OP_DropTable, iD
12f30 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  b, 0, 0, pTab->z
12f40 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Name, 0);.  sqli
12f50 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
12f60 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
12f70 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
12f80 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a  ll(db, iDb);.}..
12f90 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
12fa0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
12fb0 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61  do the work of a
12fc0 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74   DROP TABLE stat
12fd0 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20  ement..** pName 
12fe0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
12ff0 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64  he table to be d
13000 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  ropped..*/.void 
13010 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65  sqlite3DropTable
13020 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
13030 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20  SrcList *pName, 
13040 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74 20  int isView, int 
13050 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65 20  noErr){.  Table 
13060 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76  *pTab;.  Vdbe *v
13070 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
13080 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
13090 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20  int iDb;..  if( 
130a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
130b0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
130c0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
130d0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  }.  assert( pPar
130e0 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20  se->nErr==0 );. 
130f0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e   assert( pName->
13100 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28  nSrc==1 );.  if(
13110 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70   noErr ) db->sup
13120 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54  pressErr++;.  pT
13130 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
13140 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
13150 73 65 2c 20 69 73 56 69 65 77 2c 20 26 70 4e 61  se, isView, &pNa
13160 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28  me->a[0]);.  if(
13170 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70   noErr ) db->sup
13180 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69  pressErr--;..  i
13190 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
131a0 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 73 71    if( noErr ) sq
131b0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e  lite3CodeVerifyN
131c0 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72 73  amedSchema(pPars
131d0 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
131e0 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 67  Database);.    g
131f0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
13200 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  ble;.  }.  iDb =
13210 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
13220 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
13230 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65  pSchema);.  asse
13240 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
13250 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
13260 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20 61 20  /* If pTab is a 
13270 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63  virtual table, c
13280 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d  all ViewGetColum
13290 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75  nNames() to ensu
132a0 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e  re.  ** it is in
132b0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
132c0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
132d0 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33  pTab) && sqlite3
132e0 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
132f0 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
13300 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
13310 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
13320 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
13330 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
13340 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
13350 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  code;.    const 
13360 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
13370 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a  EMA_TABLE(iDb);.
13380 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
13390 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
133a0 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  b].zName;.    co
133b0 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20  nst char *zArg2 
133c0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
133d0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
133e0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
133f0 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
13400 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  b)){.      goto 
13410 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
13420 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
13430 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
13440 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
13450 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
13460 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
13470 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
13480 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
13490 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
134a0 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b  QLITE_DROP_VIEW;
134b0 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
134c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
134d0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65  TUALTABLE.    }e
134e0 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
134f0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
13500 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
13510 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20  ROP_VTABLE;.    
13520 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65    zArg2 = sqlite
13530 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
13540 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d  Tab)->pMod->zNam
13550 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  e;.#endif.    }e
13560 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
13570 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
13580 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
13590 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
135a0 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ROP_TEMP_TABLE;.
135b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
135c0 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
135d0 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20  TE_DROP_TABLE;. 
135e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
135f0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
13600 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
13610 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  de, pTab->zName,
13620 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a   zArg2, zDb) ){.
13630 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
13640 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
13650 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
13660 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
13670 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
13680 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
13690 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
136a0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
136b0 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  able;.    }.  }.
136c0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c  #endif.  if( sql
136d0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
136e0 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
136f0 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20  e_", 7)==0 .    
13700 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
13710 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
13720 22 73 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31  "sqlite_stat", 1
13730 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  1)!=0 ){.    sql
13740 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13750 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
13760 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  ay not be droppe
13770 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
13780 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
13790 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
137a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
137b0 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45  OMIT_VIEW.  /* E
137c0 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45  nsure DROP TABLE
137d0 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20   is not used on 
137e0 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50  a view, and DROP
137f0 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65   VIEW is not use
13800 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c  d.  ** on a tabl
13810 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  e..  */.  if( is
13820 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
13830 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
13840 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13850 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
13860 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74  P TABLE to delet
13870 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61  e table %s", pTa
13880 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
13890 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
138a0 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ble;.  }.  if( !
138b0 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
138c0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
138d0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
138e0 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
138f0 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20   VIEW to delete 
13900 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e  view %s", pTab->
13910 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
13920 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
13930 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
13940 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
13950 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
13960 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
13970 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
13980 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
13990 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
139a0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
139b0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
139c0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
139d0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
139e0 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
139f0 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
13a00 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  s(pParse, iDb, "
13a10 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  tbl", pTab->zNam
13a20 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  e);.    sqlite3F
13a30 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73  kDropTable(pPars
13a40 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b  e, pName, pTab);
13a50 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
13a60 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65  DropTable(pParse
13a70 2c 20 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56  , pTab, iDb, isV
13a80 69 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  iew);.  }..exit_
13a90 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71  drop_table:.  sq
13aa0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
13ab0 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d  te(db, pName);.}
13ac0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
13ad0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
13ae0 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66  o create a new f
13af0 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68  oreign key on th
13b00 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65  e table.** curre
13b10 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
13b20 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43  ruction.  pFromC
13b30 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ol determines wh
13b40 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69  ich columns.** i
13b50 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
13b60 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ble point to the
13b70 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49   foreign key.  I
13b80 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68  f pFromCol==0 th
13b90 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68  en.** connect th
13ba0 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73  e key to the las
13bb0 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65  t column inserte
13bc0 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e  d.  pTo is the n
13bd0 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61  ame of.** the ta
13be0 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 20  ble referred to 
13bf0 28 61 2e 6b 2e 61 20 74 68 65 20 22 70 61 72 65  (a.k.a the "pare
13c00 6e 74 22 20 74 61 62 6c 65 29 2e 20 20 70 54 6f  nt" table).  pTo
13c10 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a  Col is a list.**
13c20 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
13c30 65 20 70 61 72 65 6e 74 20 70 54 6f 20 74 61 62  e parent pTo tab
13c40 6c 65 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61  le.  flags conta
13c50 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  ins all.** infor
13c60 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
13c70 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
13c80 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20  tion algorithms 
13c90 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20  specified.** in 
13ca0 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f  the ON DELETE, O
13cb0 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20  N UPDATE and ON 
13cc0 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a  INSERT clauses..
13cd0 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74  **.** An FKey st
13ce0 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
13cf0 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ed and added to 
13d00 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
13d10 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e  tly.** under con
13d20 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  struction in the
13d30 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
13d40 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  le field..**.** 
13d50 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  The foreign key 
13d60 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44  is set for IMMED
13d70 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e  IATE processing.
13d80 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63    A subsequent c
13d90 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  all.** to sqlite
13da0 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
13db0 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  () might change 
13dc0 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44  this to DEFERRED
13dd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
13de0 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  3CreateForeignKe
13df0 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
13e00 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
13e10 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
13e20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f    ExprList *pFro
13e30 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e  mCol,  /* Column
13e40 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20  s in this table 
13e50 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74  that point to ot
13e60 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54  her table */.  T
13e70 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20  oken *pTo,      
13e80 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
13e90 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
13ea0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54  /.  ExprList *pT
13eb0 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75  oCol,    /* Colu
13ec0 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  mns in the other
13ed0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
13ee0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
13ef0 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
13f00 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
13f10 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ms. */.){.  sqli
13f20 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
13f30 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51  ->db;.#ifndef SQ
13f40 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
13f50 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46  N_KEY.  FKey *pF
13f60 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20  Key = 0;.  FKey 
13f70 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c  *pNextTo;.  Tabl
13f80 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *p = pParse->p
13f90 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20  NewTable;.  int 
13fa0 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  nByte;.  int i;.
13fb0 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68    int nCol;.  ch
13fc0 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74  ar *z;..  assert
13fd0 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66  ( pTo!=0 );.  if
13fe0 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43  ( p==0 || IN_DEC
13ff0 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f  LARE_VTAB ) goto
14000 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70   fk_end;.  if( p
14010 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
14020 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
14030 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  nCol-1;.    if( 
14040 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29 20 29 20  NEVER(iCol<0) ) 
14050 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
14060 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
14070 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20  ToCol->nExpr!=1 
14080 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14090 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
140a0 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e   "foreign key on
140b0 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20   %s".         " 
140c0 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65  should reference
140d0 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e   only one column
140e0 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20   of table %T",. 
140f0 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b          p->aCol[
14100 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f  iCol].zName, pTo
14110 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  );.      goto fk
14120 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
14130 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  nCol = 1;.  }els
14140 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20  e if( pToCol && 
14150 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70  pToCol->nExpr!=p
14160 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29  FromCol->nExpr )
14170 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
14180 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
14190 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66        "number of
141a0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65   columns in fore
141b0 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ign key does not
141c0 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
141d0 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22  r of ".        "
141e0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
141f0 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22  eferenced table"
14200 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  );.    goto fk_e
14210 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  nd;.  }else{.   
14220 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c   nCol = pFromCol
14230 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e  ->nExpr;.  }.  n
14240 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
14250 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29  FKey) + (nCol-1)
14260 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61  *sizeof(pFKey->a
14270 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e  Col[0]) + pTo->n
14280 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43   + 1;.  if( pToC
14290 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
142a0 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78  0; i<pToCol->nEx
142b0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
142c0 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33  nByte += sqlite3
142d0 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d  Strlen30(pToCol-
142e0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31  >a[i].zName) + 1
142f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
14300 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Key = sqlite3DbM
14310 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
14320 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b  yte );.  if( pFK
14330 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  ey==0 ){.    got
14340 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  o fk_end;.  }.  
14350 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70  pFKey->pFrom = p
14360 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
14370 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b  From = p->pFKey;
14380 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70  .  z = (char*)&p
14390 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d  FKey->aCol[nCol]
143a0 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d  ;.  pFKey->zTo =
143b0 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20   z;.  memcpy(z, 
143c0 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b  pTo->z, pTo->n);
143d0 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30  .  z[pTo->n] = 0
143e0 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f  ;.  sqlite3Dequo
143f0 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54  te(z);.  z += pT
14400 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d  o->n+1;.  pFKey-
14410 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  >nCol = nCol;.  
14420 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
14430 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  ){.    pFKey->aC
14440 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d  ol[0].iFrom = p-
14450 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65  >nCol-1;.  }else
14460 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
14470 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
14480 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
14490 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43  for(j=0; j<p->nC
144a0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
144b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
144c0 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ICmp(p->aCol[j].
144d0 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d  zName, pFromCol-
144e0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
144f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b  ){.          pFK
14500 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f  ey->aCol[i].iFro
14510 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  m = j;.         
14520 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
14530 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
14540 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29  if( j>=p->nCol )
14550 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14560 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14570 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e  , .          "un
14580 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25  known column \"%
14590 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  s\" in foreign k
145a0 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20  ey definition", 
145b0 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
145c0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
145d0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
145e0 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  k_end;.      }. 
145f0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
14600 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
14610 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
14620 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  +){.      int n 
14630 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
14640 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  0(pToCol->a[i].z
14650 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b  Name);.      pFK
14660 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c  ey->aCol[i].zCol
14670 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63   = z;.      memc
14680 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b  py(z, pToCol->a[
14690 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20  i].zName, n);.  
146a0 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20      z[n] = 0;.  
146b0 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20      z += n+1;.  
146c0 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d    }.  }.  pFKey-
146d0 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b  >isDeferred = 0;
146e0 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f  .  pFKey->aActio
146f0 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c 61 67  n[0] = (u8)(flag
14700 73 20 26 20 30 78 66 66 29 3b 20 20 20 20 20 20  s & 0xff);      
14710 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45        /* ON DELE
14720 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70  TE action */.  p
14730 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d  FKey->aAction[1]
14740 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20 3e   = (u8)((flags >
14750 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b 20 20  > 8 ) & 0xff);  
14760 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 61    /* ON UPDATE a
14770 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65  ction */..  asse
14780 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
14790 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
147a0 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  , p->pSchema) );
147b0 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b  .  pNextTo = (FK
147c0 65 79 20 2a 29 73 71 6c 69 74 65 33 48 61 73 68  ey *)sqlite3Hash
147d0 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65  Insert(&p->pSche
147e0 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20  ma->fkeyHash, . 
147f0 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c       pFKey->zTo,
14800 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
14810 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2c 20 28 76  (pFKey->zTo), (v
14820 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b  oid *)pFKey.  );
14830 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d  .  if( pNextTo==
14840 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 64 62 2d  pFKey ){.    db-
14850 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
14860 31 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  1;.    goto fk_e
14870 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e  nd;.  }.  if( pN
14880 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73  extTo ){.    ass
14890 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50  ert( pNextTo->pP
148a0 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20  revTo==0 );.    
148b0 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
148c0 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e   pNextTo;.    pN
148d0 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d  extTo->pPrevTo =
148e0 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f   pFKey;.  }..  /
148f0 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69  * Link the forei
14900 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61  gn key to the ta
14910 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20  ble as the last 
14920 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  step..  */.  p->
14930 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20  pFKey = pFKey;. 
14940 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f   pFKey = 0;..fk_
14950 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  end:.  sqlite3Db
14960 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b  Free(db, pFKey);
14970 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
14980 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
14990 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a  FOREIGN_KEY) */.
149a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
149b0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f  tDelete(db, pFro
149c0 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  mCol);.  sqlite3
149d0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
149e0 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f  b, pToCol);.}../
149f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14a00 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
14a10 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d   an INITIALLY IM
14a20 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49  MEDIATE or INITI
14a30 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a  ALLY DEFERRED.**
14a40 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20   clause is seen 
14a50 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72  as part of a for
14a60 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
14a70 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65  ion.  The isDefe
14a80 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  rred.** paramete
14a90 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49  r is 1 for INITI
14aa0 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e  ALLY DEFERRED an
14ab0 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  d 0 for INITIALL
14ac0 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20  Y IMMEDIATE..** 
14ad0 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  The behavior of 
14ae0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
14af0 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67  y created foreig
14b00 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65  n key is adjuste
14b10 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79  d.** accordingly
14b20 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
14b30 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
14b40 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14b50 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b  int isDeferred){
14b60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14b70 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
14b80 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
14b90 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20    FKey *pFKey;. 
14ba0 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61   if( (pTab = pPa
14bb0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
14bc0 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70  =0 || (pFKey = p
14bd0 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29  Tab->pFKey)==0 )
14be0 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
14bf0 74 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30  t( isDeferred==0
14c00 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d   || isDeferred==
14c10 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  1 ); /* EV: R-30
14c20 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70  323-21917 */.  p
14c30 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
14c40 20 3d 20 28 75 38 29 69 73 44 65 66 65 72 72 65   = (u8)isDeferre
14c50 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  d;.#endif.}../*.
14c60 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
14c70 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65   that will erase
14c80 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65   and refill inde
14c90 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69  x *pIdx.  This i
14ca0 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69  s.** used to ini
14cb0 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20  tialize a newly 
14cc0 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72  created index or
14cd0 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68   to recompute th
14ce0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
14cf0 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70  an index in resp
14d00 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45  onse to a REINDE
14d10 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
14d20 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   if memRootPage 
14d30 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c  is not negative,
14d40 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
14d50 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c  he index is newl
14d60 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54  y.** created.  T
14d70 68 65 20 72 65 67 69 73 74 65 72 20 73 70 65 63  he register spec
14d80 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74  ified by memRoot
14d90 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Page contains th
14da0 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e  e.** root page n
14db0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
14dc0 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50  ex.  If memRootP
14dd0 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
14de0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64   then.** the ind
14df0 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
14e00 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c  s and must be cl
14e10 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69  eared before bei
14e20 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a  ng refilled and.
14e30 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
14e40 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
14e50 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72  ndex is taken fr
14e60 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e  om pIndex->tnum.
14e70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14e80 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
14e90 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
14ea0 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c  , Index *pIndex,
14eb0 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65   int memRootPage
14ec0 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
14ed0 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
14ee0 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  e;  /* The table
14ef0 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64   that is indexed
14f00 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
14f10 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
14f20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
14f30 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54  rsor used for pT
14f40 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ab */.  int iIdx
14f50 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
14f60 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  +;     /* Btree 
14f70 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
14f80 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20  pIndex */.  int 
14f90 69 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20 20  iSorter;        
14fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
14fb0 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 4f  rsor opened by O
14fc0 70 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69 6e  penSorter (if in
14fd0 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61   use) */.  int a
14fe0 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  ddr1;           
14ff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
15000 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c  ress of top of l
15010 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
15020 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r2;             
15030 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
15040 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f  ss to jump to fo
15050 72 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  r next iteration
15060 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20   */.  int tnum; 
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15080 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
15090 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
150a0 69 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62 65  int iPartIdxLabe
150b0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
150c0 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c  * Jump to this l
150d0 61 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20 72  abel to skip a r
150e0 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ow */.  Vdbe *v;
150f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15100 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
15110 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
15120 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
15130 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
15140 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  pKey;           
15150 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f        /* KeyInfo
15160 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20   for index */.  
15170 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
15180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15190 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
151a0 6e 67 20 61 73 73 65 6d 62 6c 69 65 64 20 69 6e  ng assemblied in
151b0 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  dex record */.  
151c0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
151d0 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f  arse->db;      /
151e0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
151f0 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
15200 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
15210 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
15220 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d  , pIndex->pSchem
15230 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  a);..#ifndef SQL
15240 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
15250 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c  ZATION.  if( sql
15260 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
15270 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49  arse, SQLITE_REI
15280 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  NDEX, pIndex->zN
15290 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62  ame, 0,.      db
152a0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
152b0 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   ) ){.    return
152c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
152d0 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77 72 69  /* Require a wri
152e0 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74  te-lock on the t
152f0 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20  able to perform 
15300 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a  this operation *
15310 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  /.  sqlite3Table
15320 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
15330 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c  , pTab->tnum, 1,
15340 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a   pTab->zName);..
15350 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
15360 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
15370 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
15380 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74  n;.  if( memRoot
15390 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74  Page>=0 ){.    t
153a0 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67  num = memRootPag
153b0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
153c0 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74  tnum = pIndex->t
153d0 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20  num;.  }.  pKey 
153e0 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
153f0 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  OfIndex(pParse, 
15400 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 4f  pIndex);..  /* O
15410 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63  pen the sorter c
15420 75 72 73 6f 72 20 69 66 20 77 65 20 61 72 65 20  ursor if we are 
15430 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20  to use one. */. 
15440 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73   iSorter = pPars
15450 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c  e->nTab++;.  sql
15460 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
15470 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c  , OP_SorterOpen,
15480 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 30 2c 20   iSorter, 0, 0, 
15490 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20  (char*).        
154a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
154b0 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
154c0 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  ey), P4_KEYINFO)
154d0 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
154e0 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72   table. Loop thr
154f0 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66  ough all rows of
15500 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65   the table, inse
15510 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a  rting index.  **
15520 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68   records into th
15530 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73  e sorter. */.  s
15540 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
15550 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
15560 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
15570 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d  Read);.  addr1 =
15580 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15590 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
155a0 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 72 65 67   iTab, 0);.  reg
155b0 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33  Record = sqlite3
155c0 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
155d0 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65  e);..  sqlite3Ge
155e0 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70  nerateIndexKey(p
155f0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69  Parse, pIndex, i
15600 54 61 62 2c 20 72 65 67 52 65 63 6f 72 64 2c 20  Tab, regRecord, 
15610 30 2c 20 26 69 50 61 72 74 49 64 78 4c 61 62 65  0, &iPartIdxLabe
15620 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l);.  sqlite3Vdb
15630 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
15640 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72  rterInsert, iSor
15650 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  ter, regRecord);
15660 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
15670 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 50  solveLabel(v, iP
15680 61 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20  artIdxLabel);.  
15690 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
156a0 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54  2(v, OP_Next, iT
156b0 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20  ab, addr1+1);.  
156c0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
156d0 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20  ere(v, addr1);. 
156e0 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
156f0 3c 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 65  <0 ) sqlite3Vdbe
15700 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65  AddOp2(v, OP_Cle
15710 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ar, tnum, iDb);.
15720 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15730 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op4(v, OP_OpenWr
15740 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c  ite, iIdx, tnum,
15750 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20 20   iDb, .         
15760 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
15770 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49   *)pKey, P4_KEYI
15780 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  NFO);.  sqlite3V
15790 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f  dbeChangeP5(v, O
157a0 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52 7c 28 28  PFLAG_BULKCSR|((
157b0 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d 30 29 3f  memRootPage>=0)?
157c0 4f 50 46 4c 41 47 5f 50 32 49 53 52 45 47 3a 30  OPFLAG_P2ISREG:0
157d0 29 29 3b 0a 0a 20 20 61 64 64 72 31 20 3d 20 73  ));..  addr1 = s
157e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
157f0 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72  (v, OP_SorterSor
15800 74 2c 20 69 53 6f 72 74 65 72 2c 20 30 29 3b 0a  t, iSorter, 0);.
15810 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 21 3d    assert( pKey!=
15820 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  0 || db->mallocF
15830 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
15840 3e 6e 45 72 72 20 29 3b 0a 20 20 69 66 28 20 70  >nErr );.  if( p
15850 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
15860 4f 45 5f 4e 6f 6e 65 20 26 26 20 70 4b 65 79 21  OE_None && pKey!
15870 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32  =0 ){.    int j2
15880 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
15890 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 33  rrentAddr(v) + 3
158a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
158b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
158c0 74 6f 2c 20 30 2c 20 6a 32 29 3b 0a 20 20 20 20  to, 0, j2);.    
158d0 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56  addr2 = sqlite3V
158e0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
158f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
15900 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
15910 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c  P_SorterCompare,
15920 20 69 53 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65   iSorter, j2, re
15930 67 52 65 63 6f 72 64 2c 0a 20 20 20 20 20 20 20  gRecord,.       
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15950 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 2d    pKey->nField -
15960 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c   pIndex->nKeyCol
15970 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e  );.    sqlite3Un
15980 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 70  iqueConstraint(p
15990 50 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c  Parse, OE_Abort,
159a0 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 65 6c 73   pIndex);.  }els
159b0 65 7b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73  e{.    addr2 = s
159c0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
159d0 74 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20  tAddr(v);.  }.  
159e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
159f0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61  2(v, OP_SorterDa
15a00 74 61 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67  ta, iSorter, reg
15a10 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
15a20 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
15a30 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49  OP_IdxInsert, iI
15a40 64 78 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 31  dx, regRecord, 1
15a50 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15a60 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
15a70 41 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54  AG_USESEEKRESULT
15a80 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
15a90 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
15aa0 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
15ab0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15ac0 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e  p2(v, OP_SorterN
15ad0 65 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64  ext, iSorter, ad
15ae0 64 72 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  dr2);.  sqlite3V
15af0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
15b00 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65  ddr1);..  sqlite
15b10 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
15b20 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a  P_Close, iTab);.
15b30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15b40 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
15b50 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65   iIdx);.  sqlite
15b60 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
15b70 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72  P_Close, iSorter
15b80 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  );.}../*.** Allo
15b90 63 61 74 65 20 68 65 61 70 20 73 70 61 63 65 20  cate heap space 
15ba0 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78  to hold an Index
15bb0 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43 6f   object with nCo
15bc0 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a  l columns..**.**
15bd0 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   Increase the al
15be0 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f  location size to
15bf0 20 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74 72   provide an extr
15c00 61 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a  a nExtra bytes.*
15c10 2a 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67  * of 8-byte alig
15c20 6e 65 64 20 73 70 61 63 65 20 61 66 74 65 72 20  ned space after 
15c30 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
15c40 20 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a   and return a.**
15c50 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
15c60 20 65 78 74 72 61 20 73 70 61 63 65 20 69 6e 20   extra space in 
15c70 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64  *ppExtra..*/.Ind
15c80 65 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63  ex *sqlite3Alloc
15c90 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a  ateIndexObject(.
15ca0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
15cb0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
15cc0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
15cd0 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20  .  i16 nCol,    
15ce0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
15cf0 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
15d00 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
15d10 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
15d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15d30 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
15d40 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 61  extra space to a
15d50 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
15d60 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20 2f  *ppExtra       /
15d70 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
15d80 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20 2a   "extra" space *
15d90 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b  /.){.  Index *p;
15da0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
15db0 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20 6f  llocated index o
15dc0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  bject */.  int n
15dd0 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
15de0 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
15df0 65 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65  e for Index obje
15e00 63 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a  ct + arrays */..
15e10 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
15e20 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 20  (sizeof(Index)) 
15e30 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  +              /
15e40 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
15e50 65 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e  */.          
15e60 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68  ROUND8(sizeof(ch
15e70 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20  ar*)*nCol) +    
15e80 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a       /* Index.az
15e90 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20  Coll     */.    
15ea0 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a        ROUND8(siz
15eb0 65 6f 66 28 74 52 6f 77 63 6e 74 29 2a 28 6e 43  eof(tRowcnt)*(nC
15ec0 6f 6c 2b 31 29 20 2b 20 20 20 20 2f 2a 20 49 6e  ol+1) +    /* In
15ed0 64 65 78 2e 61 69 52 6f 77 45 73 74 20 20 20 2a  dex.aiRowEst   *
15ee0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
15ef0 20 20 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e     sizeof(i16)*n
15f00 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20  Col +           
15f10 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75   /* Index.aiColu
15f20 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  mn   */.        
15f30 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
15f40 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20  u8)*nCol);      
15f50 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
15f60 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20  aSortOrder */.  
15f70 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
15f80 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
15f90 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  e + nExtra);.  i
15fa0 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72  f( p ){.    char
15fb0 20 2a 70 45 78 74 72 61 20 3d 20 28 28 63 68 61   *pExtra = ((cha
15fc0 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a  r*)p)+ROUND8(siz
15fd0 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
15fe0 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68   p->azColl = (ch
15ff0 61 72 2a 2a 29 70 45 78 74 72 61 3b 20 20 20 20  ar**)pExtra;    
16000 20 20 70 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e    pExtra += ROUN
16010 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  D8(sizeof(char*)
16020 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61  *nCol);.    p->a
16030 69 52 6f 77 45 73 74 20 3d 20 28 74 52 6f 77 63  iRowEst = (tRowc
16040 6e 74 2a 29 70 45 78 74 72 61 3b 20 20 70 45 78  nt*)pExtra;  pEx
16050 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 74 52  tra += sizeof(tR
16060 6f 77 63 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b  owcnt)*(nCol+1);
16070 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e  .    p->aiColumn
16080 20 3d 20 28 69 31 36 2a 29 70 45 78 74 72 61 3b   = (i16*)pExtra;
16090 20 20 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20        pExtra += 
160a0 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c  sizeof(i16)*nCol
160b0 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72  ;.    p->aSortOr
160c0 64 65 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72  der = (u8*)pExtr
160d0 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d  a;.    p->nColum
160e0 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d  n = nCol;.    p-
160f0 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20  >nKeyCol = nCol 
16100 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72  - 1;.    *ppExtr
16110 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b  a = ((char*)p) +
16120 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65   nByte;.  }.  re
16130 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
16140 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e   Create a new in
16150 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74  dex for an SQL t
16160 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e  able.  pName1.pN
16170 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65  ame2 is the name
16180 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a   of the index .*
16190 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69  * and pTblList i
161a0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
161b0 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
161c0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
161d0 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65  Both will .** be
161e0 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d   NULL for a prim
161f0 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e  ary key or an in
16200 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61  dex that is crea
16210 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61  ted to satisfy a
16220 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .** UNIQUE const
16230 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c  raint.  If pTabl
16240 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65  e and pIndex are
16250 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73   NULL, use pPars
16260 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20  e->pNewTable.** 
16270 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  as the table to 
16280 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61  be indexed.  pPa
16290 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69  rse->pNewTable i
162a0 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69  s a table that i
162b0 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62  s.** currently b
162c0 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64  eing constructed
162d0 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42   by a CREATE TAB
162e0 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
162f0 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c  .** pList is a l
16300 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
16310 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
16320 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c  List will be NUL
16330 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20  L if this.** is 
16340 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
16350 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69   unique-constrai
16360 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
16370 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64  ecent column add
16380 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62  ed.** to the tab
16390 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
163a0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
163b0 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20    .**.** If the 
163c0 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
163d0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 72   successfully, r
163e0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
163f0 74 6f 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78  to the new Index
16400 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 54  .** structure. T
16410 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 73  his is used by s
16420 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
16430 4b 65 79 28 29 20 74 6f 20 6d 61 72 6b 20 74 68  Key() to mark th
16440 65 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68  e index.** as th
16450 65 20 74 61 62 6c 65 73 20 70 72 69 6d 61 72 79  e tables primary
16460 20 6b 65 79 20 28 49 6e 64 65 78 2e 61 75 74 6f   key (Index.auto
16470 49 6e 64 65 78 3d 3d 32 29 2e 0a 2a 2f 0a 49 6e  Index==2)..*/.In
16480 64 65 78 20 2a 73 71 6c 69 74 65 33 43 72 65 61  dex *sqlite3Crea
16490 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  teIndex(.  Parse
164a0 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
164b0 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   All information
164c0 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72 73   about this pars
164d0 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  e */.  Token *pN
164e0 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69 72  ame1,     /* Fir
164f0 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78  st part of index
16500 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55   name. May be NU
16510 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
16520 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53 65  Name2,     /* Se
16530 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e 64  cond part of ind
16540 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
16550 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73  NULL */.  SrcLis
16560 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20  t *pTblName, /* 
16570 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20  Table to index. 
16580 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  Use pParse->pNew
16590 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20  Table if 0 */.  
165a0 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
165b0 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
165c0 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e  columns to be in
165d0 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
165e0 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a  nError,       /*
165f0 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67   OE_Abort, OE_Ig
16600 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65  nore, OE_Replace
16610 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a  , or OE_None */.
16620 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c    Token *pStart,
16630 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
16640 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
16650 67 69 6e 73 20 74 68 69 73 20 73 74 61 74 65 6d  gins this statem
16660 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ent */.  Expr *p
16670 50 49 57 68 65 72 65 2c 20 20 20 20 2f 2a 20 57  PIWhere,    /* W
16680 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72 20  HERE clause for 
16690 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 20  partial indices 
166a0 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
166b0 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20  er,     /* Sort 
166c0 6f 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79  order of primary
166d0 20 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d   key when pList=
166e0 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69  =NULL */.  int i
166f0 66 4e 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a  fNotExist     /*
16700 20 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69   Omit error if i
16710 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
16720 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  sts */.){.  Inde
16730 78 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20  x *pRet = 0;    
16740 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 72   /* Pointer to r
16750 65 74 75 72 6e 20 2a 2f 0a 20 20 54 61 62 6c 65  eturn */.  Table
16760 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
16770 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20 69  /* Table to be i
16780 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65  ndexed */.  Inde
16790 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20 20  x *pIndex = 0;  
167a0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 6f   /* The index to
167b0 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 20   be created */. 
167c0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
167d0 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ;     /* Name of
167e0 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
167f0 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
16800 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16810 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
16820 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69  zName */.  int i
16830 2c 20 6a 3b 0a 20 20 44 62 46 69 78 65 72 20 73  , j;.  DbFixer s
16840 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  Fix;        /* F
16850 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74  or assigning dat
16860 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70  abase names to p
16870 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73  Table */.  int s
16880 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20  ortOrderMask;   
16890 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45  /* 1 to honor DE
168a0 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20  SC in index.  0 
168b0 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20  to ignore. */.  
168c0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
168d0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a  arse->db;.  Db *
168e0 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
168f0 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63   /* The specific
16900 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
16910 67 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61  g the indexed da
16920 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
16930 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
16940 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
16950 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
16960 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  s being written 
16970 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
16980 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71  e = 0;    /* Unq
16990 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
169a0 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72   the index to cr
169b0 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  eate */.  struct
169c0 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
169d0 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f  pListItem; /* Fo
169e0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
169f0 4c 69 73 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  List */.  const 
16a00 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b  Column *pTabCol;
16a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
16a20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61  column in the ta
16a30 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ble */.  int nEx
16a40 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tra = 0;        
16a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
16a60 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
16a70 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69   zExtra[] */.  i
16a80 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20  nt nExtraCol;   
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16aa0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
16ab0 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  ra columns neede
16ac0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78  d */.  char *zEx
16ad0 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  tra;            
16ae0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
16af0 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65   space after the
16b00 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f   Index object */
16b10 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20  .  Index *pPk = 
16b20 30 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d 41  0;      /* PRIMA
16b30 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f 72  RY KEY index for
16b40 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
16b50 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  ables */..  asse
16b60 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
16b70 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e  ==0 );      /* N
16b80 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68  ever called with
16b90 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f   prior errors */
16ba0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
16bb0 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45  cFailed || IN_DE
16bc0 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
16bd0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
16be0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
16bf0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
16c00 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
16c10 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
16c20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
16c30 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
16c40 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
16c50 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
16c60 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65   be indexed.  Re
16c70 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f  turn early if no
16c80 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
16c90 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
16ca0 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74  ){..    /* Use t
16cb0 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65  he two-part inde
16cc0 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  x name to determ
16cd0 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ine the database
16ce0 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72   .    ** to sear
16cf0 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ch for the table
16d00 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c  . 'Fix' the tabl
16d10 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64  e name to this d
16d20 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  b.    ** before 
16d30 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74  looking up the t
16d40 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
16d50 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20   assert( pName1 
16d60 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20  && pName2 );.   
16d70 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
16d80 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
16d90 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
16da0 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
16db0 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20  f( iDb<0 ) goto 
16dc0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
16dd0 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
16de0 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a  Name && pName->z
16df0 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
16e00 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a  ITE_OMIT_TEMPDB.
16e10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e      /* If the in
16e20 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71  dex name was unq
16e30 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20  ualified, check 
16e40 69 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  if the table.   
16e50 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61   ** is a temp ta
16e60 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20  ble. If so, set 
16e70 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
16e80 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69  1. Do not do thi
16e90 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74  s.    ** if init
16ea0 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62  ialising a datab
16eb0 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20  ase schema..    
16ec0 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  */.    if( !db->
16ed0 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
16ee0 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
16ef0 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70  3SrcListLookup(p
16f00 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29  Parse, pTblName)
16f10 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d  ;.      if( pNam
16f20 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62  e2->n==0 && pTab
16f30 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d   && pTab->pSchem
16f40 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
16f50 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
16f60 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20   iDb = 1;.      
16f70 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
16f80 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e      sqlite3FixIn
16f90 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
16fa0 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20  , iDb, "index", 
16fb0 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
16fc0 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
16fd0 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d  t(&sFix, pTblNam
16fe0 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42  e) ){.      /* B
16ff0 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65  ecause the parse
17000 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62  r constructs pTb
17010 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e  lName from a sin
17020 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a  gle identifier,.
17030 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
17040 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e  FixSrcList can n
17050 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20  ever fail. */.  
17060 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
17070 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20     }.    pTab = 
17080 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
17090 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
170a0 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30  , &pTblName->a[0
170b0 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
170c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
170d0 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29  ==0 || pTab==0 )
170e0 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ;.    if( pTab==
170f0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
17100 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
17110 69 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64 62  if( iDb==1 && db
17120 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
17130 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma!=pTab->pSchem
17140 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  a ){.      sqlit
17150 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
17160 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22  e, .           "
17170 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20  cannot create a 
17180 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f  TEMP index on no
17190 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22 25  n-TEMP table \"%
171a0 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\"",.          
171b0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
171c0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
171d0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
171e0 20 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73 52   }.    if( !HasR
171f0 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 50 6b  owid(pTab) ) pPk
17200 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
17210 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
17220 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
17230 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29  sert( pName==0 )
17240 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
17250 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70  tart==0 );.    p
17260 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
17270 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28  ewTable;.    if(
17280 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78   !pTab ) goto ex
17290 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
172a0 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
172b0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
172c0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
172d0 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20  a);.  }.  pDb = 
172e0 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a  &db->aDb[iDb];..
172f0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
17300 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
17310 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
17320 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
17330 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
17340 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
17350 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26  7)==0 .       &&
17360 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
17370 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d  (&pTab->zName[7]
17380 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29 21  ,"altertab_",9)!
17390 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
173a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
173b0 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
173c0 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c  not be indexed",
173d0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
173e0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
173f0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
17400 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17410 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54  IT_VIEW.  if( pT
17420 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
17430 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
17440 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
17450 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
17460 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
17470 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
17480 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ex;.  }.#endif.#
17490 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
174a0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
174b0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
174c0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
174d0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
174e0 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61  rse, "virtual ta
174f0 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  bles may not be 
17500 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
17510 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
17520 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
17530 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  f..  /*.  ** Fin
17540 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
17550 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73  e index.  Make s
17560 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74  ure there is not
17570 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72   already another
17580 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
17590 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61  able with the sa
175a0 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a  me name.  .  **.
175b0 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20    ** Exception: 
175c0 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69   If we are readi
175d0 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ng the names of 
175e0 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65  permanent indice
175f0 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  s from the.  ** 
17600 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
17610 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d  ble (because som
17620 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
17630 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65  changed the sche
17640 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65  ma) and.  ** one
17650 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   of the index na
17660 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74  mes collides wit
17670 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  h the name of a 
17680 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
17690 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74  or.  ** index, t
176a0 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74  hen we will cont
176b0 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20  inue to process 
176c0 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a  this index..  **
176d0 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d  .  ** If pName==
176e0 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  0 it means that 
176f0 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c  we are.  ** deal
17700 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61  ing with a prima
17710 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45  ry key or UNIQUE
17720 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65   constraint.  We
17730 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20   have to invent 
17740 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d  our.  ** own nam
17750 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e  e..  */.  if( pN
17760 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
17770 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
17780 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
17790 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  e);.    if( zNam
177a0 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
177b0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
177c0 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
177d0 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  ->z!=0 );.    if
177e0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
177f0 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
17800 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
17810 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
17820 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
17830 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
17840 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
17850 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
17860 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
17870 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20  b, zName, 0)!=0 
17880 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
17890 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
178a0 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
178b0 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
178c0 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
178d0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
178e0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
178f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
17900 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
17910 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
17920 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30  , pDb->zName)!=0
17930 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69   ){.      if( !i
17940 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20  fNotExist ){.   
17950 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
17960 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
17970 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65  dex %s already e
17980 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  xists", zName);.
17990 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
179a0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
179b0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
179c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
179d0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
179e0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
179f0 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
17a00 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
17a10 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  x;.    }.  }else
17a20 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
17a30 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20   Index *pLoop;. 
17a40 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61     for(pLoop=pTa
17a50 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20  b->pIndex, n=1; 
17a60 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
17a70 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b  op->pNext, n++){
17a80 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  }.    zName = sq
17a90 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
17aa0 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   "sqlite_autoind
17ab0 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d  ex_%s_%d", pTab-
17ac0 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  >zName, n);.    
17ad0 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
17ae0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
17af0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
17b00 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
17b10 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a  eck for authoriz
17b20 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ation to create 
17b30 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23  an index..  */.#
17b40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17b50 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
17b60 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  .  {.    const c
17b70 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e  har *zDb = pDb->
17b80 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
17b90 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
17ba0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
17bb0 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
17bc0 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62  BLE(iDb), 0, zDb
17bd0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
17be0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
17bf0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  x;.    }.    i =
17c00 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49   SQLITE_CREATE_I
17c10 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f  NDEX;.    if( !O
17c20 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
17c30 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54  b==1 ) i = SQLIT
17c40 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
17c50 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
17c60 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
17c70 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  arse, i, zName, 
17c80 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
17c90 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
17ca0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
17cb0 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
17cc0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69  dif..  /* If pLi
17cd0 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20  st==0, it means 
17ce0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
17cf0 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20   called to make 
17d00 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b  a primary.  ** k
17d10 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61  ey out of the la
17d20 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20  st column added 
17d30 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  to the table und
17d40 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
17d50 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20  .  ** So create 
17d60 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73  a fake list to s
17d70 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20  imulate this..  
17d80 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
17d90 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
17da0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
17db0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
17dc0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  , 0);.    if( pL
17dd0 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78  ist==0 ) goto ex
17de0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
17df0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  .    pList->a[0]
17e00 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  .zName = sqlite3
17e10 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65 2d  DbStrDup(pParse-
17e20 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
17e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61               pTa
17e50 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
17e60 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  ol-1].zName);.  
17e70 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f    pList->a[0].so
17e80 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 73 6f  rtOrder = (u8)so
17e90 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
17ea0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
17eb0 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  w many bytes of 
17ec0 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69 72  space are requir
17ed0 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c  ed to store expl
17ee0 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63  icitly.  ** spec
17ef0 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ified collation 
17f00 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a  sequence names..
17f10 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
17f20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
17f30 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
17f40 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
17f50 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
17f60 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20  f( pExpr ){.    
17f70 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
17f80 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
17f90 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  );.      nExtra 
17fa0 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53  += (1 + sqlite3S
17fb0 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75  trlen30(pExpr->u
17fc0 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d  .zToken));.    }
17fd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  .  }..  /* .  **
17fe0 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e   Allocate the in
17ff0 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a  dex structure. .
18000 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73    */.  nName = s
18010 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
18020 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61 43  Name);.  nExtraC
18030 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e  ol = pPk ? pPk->
18040 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70  nKeyCol : 1;.  p
18050 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41  Index = sqlite3A
18060 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65  llocateIndexObje
18070 63 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45  ct(db, pList->nE
18080 78 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c  xpr + nExtraCol,
18090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
180a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180b0 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e         nName + n
180c0 45 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74  Extra + 1, &zExt
180d0 72 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ra);.  if( db->m
180e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
180f0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18100 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
18110 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
18120 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49  YTE_ALIGNMENT(pI
18130 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 29 20  ndex->aiRowEst) 
18140 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  );.  assert( EIG
18150 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
18160 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  T(pIndex->azColl
18170 29 20 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a  ) );.  pIndex->z
18180 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20  Name = zExtra;. 
18190 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65   zExtra += nName
181a0 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70   + 1;.  memcpy(p
181b0 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Index->zName, zN
181c0 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20  ame, nName+1);. 
181d0 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20   pIndex->pTable 
181e0 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78  = pTab;.  pIndex
181f0 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29  ->onError = (u8)
18200 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65  onError;.  pInde
18210 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d  x->uniqNotNull =
18220 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e   onError!=OE_Non
18230 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74  e;.  pIndex->aut
18240 6f 49 6e 64 65 78 20 3d 20 28 75 38 29 28 70 4e  oIndex = (u8)(pN
18250 61 6d 65 3d 3d 30 29 3b 0a 20 20 70 49 6e 64 65  ame==0);.  pInde
18260 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  x->pSchema = db-
18270 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
18280 61 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  a;.  pIndex->nKe
18290 79 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  yCol = pList->nE
182a0 78 70 72 3b 0a 20 20 69 66 28 20 70 50 49 57 68  xpr;.  if( pPIWh
182b0 65 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ere ){.    sqlit
182c0 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
182d0 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70  erence(pParse, p
182e0 54 61 62 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c  Tab, NC_PartIdx,
182f0 20 70 50 49 57 68 65 72 65 2c 20 30 29 3b 0a 20   pPIWhere, 0);. 
18300 20 20 20 70 49 6e 64 65 78 2d 3e 70 50 61 72 74     pIndex->pPart
18310 49 64 78 57 68 65 72 65 20 3d 20 70 50 49 57 68  IdxWhere = pPIWh
18320 65 72 65 3b 0a 20 20 20 20 70 50 49 57 68 65 72  ere;.    pPIWher
18330 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73  e = 0;.  }.  ass
18340 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
18350 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
18360 69 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a  iDb, 0) );..  /*
18370 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
18380 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72   we should honor
18390 20 44 45 53 43 20 72 65 71 75 65 73 74 73 20 6f   DESC requests o
183a0 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a  n index columns.
183b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e    */.  if( pDb->
183c0 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f  pSchema->file_fo
183d0 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73  rmat>=4 ){.    s
183e0 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d  ortOrderMask = -
183f0 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45  1;   /* Honor DE
18400 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  SC */.  }else{. 
18410 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b     sortOrderMask
18420 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f   = 0;    /* Igno
18430 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a  re DESC */.  }..
18440 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61    /* Scan the na
18450 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  mes of the colum
18460 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ns of the table 
18470 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e  to be indexed an
18480 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20  d.  ** load the 
18490 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69  column indices i
184a0 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74  nto the Index st
184b0 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74  ructure.  Report
184c0 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69   an error.  ** i
184d0 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20  f any column is 
184e0 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a  not found..  **.
184f0 20 20 2a 2a 20 54 4f 44 4f 3a 20 20 41 64 64 20    ** TODO:  Add 
18500 61 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 73  a test to make s
18510 75 72 65 20 74 68 61 74 20 74 68 65 20 73 61 6d  ure that the sam
18520 65 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20  e column is not 
18530 6e 61 6d 65 64 0a 20 20 2a 2a 20 6d 6f 72 65 20  named.  ** more 
18540 74 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e  than once within
18550 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e   the same index.
18560 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74    Only the first
18570 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 20 20 2a   instance of.  *
18580 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69 6c  * the column wil
18590 6c 20 65 76 65 72 20 62 65 20 75 73 65 64 20 62  l ever be used b
185a0 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e  y the optimizer.
185b0 20 20 4e 6f 74 65 20 74 68 61 74 20 75 73 69 6e    Note that usin
185c0 67 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20  g the.  ** same 
185d0 63 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74 68 61 6e  column more than
185e0 20 6f 6e 63 65 20 63 61 6e 6e 6f 74 20 62 65 20   once cannot be 
185f0 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73 65  an error because
18600 20 74 68 61 74 20 77 6f 75 6c 64 20 0a 20 20 2a   that would .  *
18610 2a 20 62 72 65 61 6b 20 62 61 63 6b 77 61 72 64  * break backward
18620 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
18630 2d 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  - it needs to be
18640 20 61 20 77 61 72 6e 69 6e 67 2e 0a 20 20 2a 2f   a warning..  */
18650 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73  .  for(i=0, pLis
18660 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  tItem=pList->a; 
18670 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
18680 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b  i++, pListItem++
18690 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
186a0 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c  r *zColName = pL
186b0 69 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  istItem->zName;.
186c0 20 20 20 20 69 6e 74 20 72 65 71 75 65 73 74 65      int requeste
186d0 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  dSortOrder;.    
186e0 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20  char *zColl;    
186f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18700 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  * Collation sequ
18710 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20  ence name */..  
18720 20 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43    for(j=0, pTabC
18730 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a  ol=pTab->aCol; j
18740 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
18750 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20  , pTabCol++){.  
18760 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
18770 74 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c  trICmp(zColName,
18780 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29   pTabCol->zName)
18790 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
187a0 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54   }.    if( j>=pT
187b0 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
187c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
187d0 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
187e0 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d   %s has no colum
187f0 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20  n named %s",.   
18800 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
18810 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20  , zColName);.   
18820 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
18830 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
18840 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18850 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
18860 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
18870 2d 3e 6e 43 6f 6c 3c 3d 30 78 37 66 66 66 20 26  ->nCol<=0x7fff &
18880 26 20 6a 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20  & j<=0x7fff );. 
18890 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
188a0 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b  umn[i] = (i16)j;
188b0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49 74  .    if( pListIt
188c0 65 6d 2d 3e 70 45 78 70 72 20 29 7b 0a 20 20 20  em->pExpr ){.   
188d0 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20     int nColl;.  
188e0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
188f0 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70  tItem->pExpr->op
18900 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a  ==TK_COLLATE );.
18910 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c        zColl = pL
18920 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
18930 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
18940 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  nColl = sqlite3S
18950 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b  trlen30(zColl) +
18960 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
18970 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20  ( nExtra>=nColl 
18980 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
18990 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e  zExtra, zColl, n
189a0 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f  Coll);.      zCo
189b0 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20  ll = zExtra;.   
189c0 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f     zExtra += nCo
189d0 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  ll;.      nExtra
189e0 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d   -= nColl;.    }
189f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c  else{.      zCol
18a00 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  l = pTab->aCol[j
18a10 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69  ].zColl;.      i
18a20 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c  f( !zColl ) zCol
18a30 6c 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  l = "BINARY";.  
18a40 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d    }.    if( !db-
18a50 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73  >init.busy && !s
18a60 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
18a70 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
18a80 6c 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  l) ){.      goto
18a90 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18aa0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
18ab0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
18ac0 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71  = zColl;.    req
18ad0 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20  uestedSortOrder 
18ae0 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72  = pListItem->sor
18af0 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64  tOrder & sortOrd
18b00 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64  erMask;.    pInd
18b10 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
18b20 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73 74 65  ] = (u8)requeste
18b30 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  dSortOrder;.    
18b40 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  if( pTab->aCol[j
18b50 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 20 70  ].notNull==0 ) p
18b60 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75  Index->uniqNotNu
18b70 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ll = 0;.  }.  if
18b80 28 20 70 50 6b 20 29 7b 0a 20 20 20 20 66 6f 72  ( pPk ){.    for
18b90 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65  (j=0; j<pPk->nKe
18ba0 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  yCol; j++){.    
18bb0 20 20 69 6e 74 20 78 20 3d 20 70 50 6b 2d 3e 61    int x = pPk->a
18bc0 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
18bd0 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28    if( hasColumn(
18be0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
18bf0 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  , pIndex->nKeyCo
18c00 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20 20 20 20  l, x) ){.       
18c10 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
18c20 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65  --; .      }else
18c30 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
18c40 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
18c50 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  x;.        pInde
18c60 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70  x->azColl[i] = p
18c70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  Pk->azColl[j];. 
18c80 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
18c90 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70  SortOrder[i] = p
18ca0 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a  Pk->aSortOrder[j
18cb0 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  ];.        i++;.
18cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18cd0 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 6e    assert( i==pIn
18ce0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  dex->nColumn );.
18cf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
18d00 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
18d10 20 3d 20 2d 31 3b 0a 20 20 20 20 70 49 6e 64 65   = -1;.    pInde
18d20 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 22  x->azColl[i] = "
18d30 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 20 20 73  BINARY";.  }.  s
18d40 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
18d50 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 20 20 69  Est(pIndex);.  i
18d60 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  f( pParse->pNewT
18d70 61 62 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d 61  able==0 ) estima
18d80 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49 6e  teIndexWidth(pIn
18d90 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61  dex);..  if( pTa
18da0 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b==pParse->pNewT
18db0 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  able ){.    /* T
18dc0 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
18dd0 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63  been called to c
18de0 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74  reate an automat
18df0 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20  ic index as a.  
18e00 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61    ** result of a
18e10 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
18e20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e  UNIQUE clause on
18e30 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69   a column defini
18e40 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  tion, or.    ** 
18e50 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
18e60 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66   UNIQUE clause f
18e70 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c  ollowing the col
18e80 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e  umn definitions.
18e90 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65  .    ** i.e. one
18ea0 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
18eb0 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
18ec0 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  t(x PRIMARY KEY,
18ed0 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41   y);.    ** CREA
18ee0 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c  TE TABLE t(x, y,
18ef0 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a   UNIQUE(x, y));.
18f00 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69      **.    ** Ei
18f10 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20  ther way, check 
18f20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61  to see if the ta
18f30 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20  ble already has 
18f40 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49  such an index. I
18f50 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e  f.    ** so, don
18f60 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69  't bother creati
18f70 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69  ng this one. Thi
18f80 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74  s only applies t
18f90 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74  o.    ** automat
18fa0 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69  ically created i
18fb0 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61  ndices. Users ca
18fc0 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73  n do as they wis
18fd0 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78  h with.    ** ex
18fe0 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a  plicit indices..
18ff0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77      **.    ** Tw
19000 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d  o UNIQUE or PRIM
19010 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
19020 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  nts are consider
19030 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20  ed equivalent.  
19040 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20 73    ** (and thus s
19050 75 70 70 72 65 73 73 69 6e 67 20 74 68 65 20 73  uppressing the s
19060 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20  econd one) even 
19070 69 66 20 74 68 65 79 20 68 61 76 65 20 64 69 66  if they have dif
19080 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f  ferent.    ** so
19090 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a  rt orders..    *
190a0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72  *.    ** If ther
190b0 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20  e are different 
190c0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
190d0 63 65 73 20 6f 72 20 69 66 20 74 68 65 20 63 6f  ces or if the co
190e0 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20  lumns of.    ** 
190f0 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  the constraint o
19100 63 63 75 72 20 69 6e 20 64 69 66 66 65 72 65 6e  ccur in differen
19110 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20 74  t orders, then t
19120 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  he constraints a
19130 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64  re.    ** consid
19140 65 72 65 64 20 64 69 73 74 69 6e 63 74 20 61 6e  ered distinct an
19150 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69 6e  d both result in
19160 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65   separate indice
19170 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e  s..    */.    In
19180 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66  dex *pIdx;.    f
19190 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49  or(pIdx=pTab->pI
191a0 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
191b0 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
191c0 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
191d0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
191e0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
191f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
19200 28 20 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65  ( pIdx->autoInde
19210 78 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  x );.      asser
19220 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  t( pIndex->onErr
19230 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a  or!=OE_None );..
19240 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
19250 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d  nKeyCol!=pIndex-
19260 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69  >nKeyCol ) conti
19270 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  nue;.      for(k
19280 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; k<pIdx->nKey
19290 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  Col; k++){.     
192a0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
192b0 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  1;.        const
192c0 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20   char *z2;.     
192d0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
192e0 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78  olumn[k]!=pIndex
192f0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20  ->aiColumn[k] ) 
19300 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a  break;.        z
19310 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  1 = pIdx->azColl
19320 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20  [k];.        z2 
19330 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
19340 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [k];.        if(
19350 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69 74   z1!=z2 && sqlit
19360 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
19370 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
19380 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d   }.      if( k==
19390 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b  pIdx->nKeyCol ){
193a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
193b0 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64  x->onError!=pInd
193c0 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ex->onError ){. 
193d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
193e0 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61   constraint crea
193f0 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64  tes the same ind
19400 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73  ex as a previous
19410 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
19420 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69  nstraint specifi
19430 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20  ed somewhere in 
19440 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
19450 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
19460 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
19470 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   the ON CONFLICT
19480 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66   clauses are dif
19490 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20  ferent. If both 
194a0 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
194b0 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  ** constraint an
194c0 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  d the previous e
194d0 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72  quivalent constr
194e0 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63  aint have explic
194f0 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  it.          ** 
19500 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
19510 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65  ses this is an e
19520 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c  rror. Otherwise,
19530 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20   use the.       
19540 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79     ** explicitly
19550 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76   specified behav
19560 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ior for the inde
19570 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  x..          */.
19580 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
19590 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
195a0 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e  E_Default || pIn
195b0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
195c0 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20  _Default) ){.   
195d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
195e0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
195f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
19600 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f    "conflicting O
19610 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
19620 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30  es specified", 0
19630 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
19640 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
19650 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
19660 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
19670 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72        pIdx->onEr
19680 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e  ror = pIndex->on
19690 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Error;.         
196a0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
196b0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
196c0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
196d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
196e0 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
196f0 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  w Index structur
19700 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61  e to its table a
19710 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a  nd to the other.
19720 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    ** in-memory d
19730 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
19740 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  es. .  */.  if( 
19750 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
19760 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
19770 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
19780 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
19790 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d  d(db, 0, pIndex-
197a0 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
197b0 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
197c0 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e  Insert(&pIndex->
197d0 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
197e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
197f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
19800 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 71 6c 69  dex->zName, sqli
19810 74 65 33 53 74 72 6c 65 6e 33 30 28 70 49 6e 64  te3Strlen30(pInd
19820 65 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20  ex->zName),.    
19830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19840 20 20 20 20 20 20 70 49 6e 64 65 78 29 3b 0a 20        pIndex);. 
19850 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
19860 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e    assert( p==pIn
19870 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  dex );  /* Mallo
19880 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
19890 65 64 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e  ed */.      db->
198a0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
198b0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
198c0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
198d0 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c      }.    db->fl
198e0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
198f0 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20  ternChanges;.   
19900 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
19910 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
19920 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
19930 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d  t.newTnum;.    }
19940 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
19950 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
19960 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  l CREATE INDEX s
19970 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45  tatement (or CRE
19980 41 54 45 20 54 41 42 4c 45 20 69 66 20 74 68 65  ATE TABLE if the
19990 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61  .  ** index is a
199a0 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20  n implied index 
199b0 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20  for a UNIQUE or 
199c0 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
199d0 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 2a  traint) then.  *
199e0 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f 20 61  * emit code to a
199f0 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
19a00 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69  x rootpage on di
19a10 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65  sk and make an e
19a20 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 74 68  ntry for.  ** th
19a30 65 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73  e index in the s
19a40 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
19a50 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  le and populate 
19a60 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 0a 20  the index with. 
19a70 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75   ** content.  Bu
19a80 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  t, do not do thi
19a90 73 20 69 66 20 77 65 20 61 72 65 20 73 69 6d 70  s if we are simp
19aa0 6c 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  ly reading the s
19ab0 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a  qlite_master.  *
19ac0 2a 20 74 61 62 6c 65 20 74 6f 20 70 61 72 73 65  * table to parse
19ad0 20 74 68 65 20 73 63 68 65 6d 61 2c 20 6f 72 20   the schema, or 
19ae0 69 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  if this index is
19af0 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
19b00 20 69 6e 64 65 78 0a 20 20 2a 2a 20 6f 66 20 61   index.  ** of a
19b10 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
19b20 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
19b30 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69  If pTblName==0 i
19b40 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64  t means this ind
19b50 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ex is generated 
19b60 61 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52  as an implied PR
19b70 49 4d 41 52 59 20 4b 45 59 0a 20 20 2a 2a 20 6f  IMARY KEY.  ** o
19b80 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69  r UNIQUE index i
19b90 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
19ba0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
19bb0 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a  ce the table.  *
19bc0 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
19bd0 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
19be0 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
19bf0 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
19c00 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73  alization.  ** s
19c10 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70  tep can be skipp
19c20 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
19c30 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
19c40 3d 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69 64  ==0 && (HasRowid
19c50 28 70 54 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61  (pTab) || pTblNa
19c60 6d 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 56 64  me!=0) ){.    Vd
19c70 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
19c80 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20  *zStmt;.    int 
19c90 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
19ca0 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20  >nMem;..    v = 
19cb0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
19cc0 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
19cd0 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
19ce0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
19cf0 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
19d00 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20  he rootpage for 
19d10 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  the index.    */
19d20 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
19d30 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
19d40 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
19d50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
19d60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65  AddOp2(v, OP_Cre
19d70 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 69  ateIndex, iDb, i
19d80 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61  Mem);..    /* Ga
19d90 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  ther the complet
19da0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
19db0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
19dc0 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ment into.    **
19dd0 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61   the zStmt varia
19de0 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ble.    */.    i
19df0 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
19e00 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29     int n = (int)
19e10 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f  (pParse->sLastTo
19e20 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a  ken.z - pName->z
19e30 29 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  ) + pParse->sLas
19e40 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20  tToken.n;.      
19e50 69 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31  if( pName->z[n-1
19e60 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20  ]==';' ) n--;.  
19e70 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69      /* A named i
19e80 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70  ndex with an exp
19e90 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44  licit CREATE IND
19ea0 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
19eb0 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
19ec0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
19ed0 20 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58   "CREATE%s INDEX
19ee0 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20   %.*s",.        
19ef0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
19f00 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45   ? "" : " UNIQUE
19f10 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b  ", n, pName->z);
19f20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19f30 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69    /* An automati
19f40 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20  c index created 
19f50 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  by a PRIMARY KEY
19f60 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
19f70 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f  raint */.      /
19f80 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  * zStmt = sqlite
19f90 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f  3MPrintf(""); */
19fa0 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30  .      zStmt = 0
19fb0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19fc0 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  Add an entry in 
19fd0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f  sqlite_master fo
19fe0 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20  r this index.   
19ff0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
1a000 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
1a010 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53  e, .        "INS
1a020 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56  ERT INTO %Q.%s V
1a030 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51  ALUES('index',%Q
1a040 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20  ,%Q,#%d,%Q);",. 
1a050 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
1a060 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
1a070 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
1a080 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
1a090 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61  ame,.        pTa
1a0a0 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
1a0b0 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20    iMem,.        
1a0c0 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20  zStmt.    );.   
1a0d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1a0e0 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20  b, zStmt);..    
1a0f0 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65  /* Fill the inde
1a100 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20  x with data and 
1a110 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65  reparse the sche
1a120 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45  ma. Code an OP_E
1a130 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20  xpire.    ** to 
1a140 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  invalidate all p
1a150 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  re-compiled stat
1a160 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  ements..    */. 
1a170 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20     if( pTblName 
1a180 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a190 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
1a1a0 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d  se, pIndex, iMem
1a1b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a1c0 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
1a1d0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
1a1e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
1a1f0 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20  arseSchemaOp(v, 
1a200 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 73 71  iDb,.         sq
1a210 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1a220 20 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20   "name='%q' AND 
1a230 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 70  type='index'", p
1a240 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Index->zName));.
1a250 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a260 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 78  eAddOp1(v, OP_Ex
1a270 70 69 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  pire, 0);.    }.
1a280 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61    }..  /* When a
1a290 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74  dding an index t
1a2a0 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
1a2b0 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c  dices for a tabl
1a2c0 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  e, make.  ** sur
1a2d0 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61  e all indices la
1a2e0 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65  beled OE_Replace
1a2f0 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20   come after all 
1a300 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20  those labeled.  
1a310 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54  ** OE_Ignore.  T
1a320 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
1a330 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74   for the correct
1a340 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63   constraint chec
1a350 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e  k.  ** processin
1a360 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e  g (in sqlite3Gen
1a370 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  erateConstraintC
1a380 68 65 63 6b 73 28 29 29 20 61 73 20 70 61 72 74  hecks()) as part
1a390 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20   of.  ** UPDATE 
1a3a0 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74 65  and INSERT state
1a3b0 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20  ments.  .  */.  
1a3c0 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
1a3d0 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  y || pTblName==0
1a3e0 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72   ){.    if( onEr
1a3f0 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
1a400 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d  || pTab->pIndex=
1a410 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
1a420 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
1a430 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
1a440 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
1a450 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
1a460 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61  Index;.      pTa
1a470 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  b->pIndex = pInd
1a480 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ex;.    }else{. 
1a490 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68       Index *pOth
1a4a0 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  er = pTab->pInde
1a4b0 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
1a4c0 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26  pOther->pNext &&
1a4d0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e   pOther->pNext->
1a4e0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
1a4f0 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ace ){.        p
1a500 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e  Other = pOther->
1a510 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
1a520 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
1a530 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
1a540 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72  xt;.      pOther
1a550 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
1a560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 74  ;.    }.    pRet
1a570 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70   = pIndex;.    p
1a580 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Index = 0;.  }..
1a590 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65    /* Clean up be
1a5a0 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
1a5b0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1a5c0 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  x:.  if( pIndex 
1a5d0 29 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20  ) freeIndex(db, 
1a5e0 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74  pIndex);.  sqlit
1a5f0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1a600 20 70 50 49 57 68 65 72 65 29 3b 0a 20 20 73 71   pPIWhere);.  sq
1a610 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
1a620 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
1a630 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1a640 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c 4e  Delete(db, pTblN
1a650 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
1a660 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
1a670 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
1a680 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74  .}../*.** Fill t
1a690 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  he Index.aiRowEs
1a6a0 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64  t[] array with d
1a6b0 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69  efault informati
1a6c0 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  on - information
1a6d0 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77  .** to be used w
1a6e0 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20  hen we have not 
1a6f0 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20  run the ANALYZE 
1a700 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61  command..**.** a
1a710 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75  iRowEst[0] is su
1a720 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e  ppose to contain
1a730 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1a740 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69  lements in the i
1a750 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77  ndex..** Since w
1a760 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67  e do not know, g
1a770 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20  uess 1 million. 
1a780 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20   aiRowEst[1] is 
1a790 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
1a7a0 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
1a7b0 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1a7c0 65 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  e that match any
1a7d0 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75   particular valu
1a7e0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73  e of the.** firs
1a7f0 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
1a800 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74  index.  aiRowEst
1a810 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [2] is an estima
1a820 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
1a830 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74  .** of rows that
1a840 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69   match any parti
1a850 63 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74 69  cular combiniati
1a860 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  on of the first 
1a870 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20  2 columns.** of 
1a880 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20  the index.  And 
1a890 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75  so forth.  It mu
1a8a0 73 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  st always be the
1a8b0 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20   case that.*.** 
1a8c0 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
1a8d0 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b  st[N]<=aiRowEst[
1a8e0 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20  N-1].**         
1a8f0 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31    aiRowEst[N]>=1
1a900 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f  .**.** Apart fro
1a910 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76 65 20  m that, we have 
1a920 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20  little to go on 
1a930 62 65 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f  besides intuitio
1a940 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61  n as to.** how a
1a950 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64  iRowEst[] should
1a960 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
1a970 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65    The numbers ge
1a980 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20  nerated here.** 
1a990 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70  are based on typ
1a9a0 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e  ical values foun
1a9b0 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69  d in actual indi
1a9c0 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
1a9d0 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
1a9e0 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  t(Index *pIdx){.
1a9f0 20 20 74 52 6f 77 63 6e 74 20 2a 61 20 3d 20 70    tRowcnt *a = p
1aa00 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20  Idx->aiRowEst;. 
1aa10 20 69 6e 74 20 69 3b 0a 20 20 74 52 6f 77 63 6e   int i;.  tRowcn
1aa20 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 61  t n;.  assert( a
1aa30 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20  !=0 );.  a[0] = 
1aa40 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52  pIdx->pTable->nR
1aa50 6f 77 45 73 74 3b 0a 20 20 69 66 28 20 61 5b 30  owEst;.  if( a[0
1aa60 5d 3c 31 30 20 29 20 61 5b 30 5d 20 3d 20 31 30  ]<10 ) a[0] = 10
1aa70 3b 0a 20 20 6e 20 3d 20 31 30 3b 0a 20 20 66 6f  ;.  n = 10;.  fo
1aa80 72 28 69 3d 31 3b 20 69 3c 3d 70 49 64 78 2d 3e  r(i=1; i<=pIdx->
1aa90 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nKeyCol; i++){. 
1aaa0 20 20 20 61 5b 69 5d 20 3d 20 6e 3b 0a 20 20 20     a[i] = n;.   
1aab0 20 69 66 28 20 6e 3e 35 20 29 20 6e 2d 2d 3b 0a   if( n>5 ) n--;.
1aac0 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e    }.  if( pIdx->
1aad0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
1aae0 20 29 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e   ){.    a[pIdx->
1aaf0 6e 4b 65 79 43 6f 6c 5d 20 3d 20 31 3b 0a 20 20  nKeyCol] = 1;.  
1ab00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
1ab10 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f  routine will dro
1ab20 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61  p an existing na
1ab30 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73  med index.  This
1ab40 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c   routine.** impl
1ab50 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20  ements the DROP 
1ab60 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e  INDEX statement.
1ab70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ab80 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20  DropIndex(Parse 
1ab90 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
1aba0 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45   *pName, int ifE
1abb0 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20  xists){.  Index 
1abc0 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20  *pIndex;.  Vdbe 
1abd0 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
1abe0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1abf0 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73    int iDb;..  as
1ac00 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
1ac10 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65  rr==0 );   /* Ne
1ac20 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ver called with 
1ac30 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a  prior errors */.
1ac40 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1ac50 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
1ac60 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1ac70 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ex;.  }.  assert
1ac80 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
1ac90 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
1aca0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
1acb0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
1acc0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
1acd0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
1ace0 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
1acf0 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
1ad00 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
1ad10 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
1ad20 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
1ad30 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20   pIndex==0 ){.  
1ad40 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73 20    if( !ifExists 
1ad50 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1ad60 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1ad70 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
1ad80 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b   %S", pName, 0);
1ad90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ada0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
1adb0 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70  ifyNamedSchema(p
1adc0 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  Parse, pName->a[
1add0 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
1ade0 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
1adf0 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
1ae00 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
1ae10 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
1ae20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 75    if( pIndex->au
1ae30 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73  toIndex ){.    s
1ae40 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1ae50 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20 61 73  Parse, "index as
1ae60 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 55 4e  sociated with UN
1ae70 49 51 55 45 20 22 0a 20 20 20 20 20 20 22 6f 72  IQUE ".      "or
1ae80 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
1ae90 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62  straint cannot b
1aea0 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a  e dropped", 0);.
1aeb0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1aec0 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
1aed0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
1aee0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
1aef0 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
1af00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1af10 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
1af20 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63  ON.  {.    int c
1af30 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
1af40 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54 61 62  P_INDEX;.    Tab
1af50 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65  le *pTab = pInde
1af60 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20 20 63  x->pTable;.    c
1af70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
1af80 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
1af90 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ame;.    const c
1afa0 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45  har *zTab = SCHE
1afb0 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20  MA_TABLE(iDb);. 
1afc0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
1afd0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1afe0 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
1aff0 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  Tab, 0, zDb) ){.
1b000 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1b010 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
1b020 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f  }.    if( !OMIT_
1b030 54 45 4d 50 44 42 20 26 26 20 69 44 62 20 29 20  TEMPDB && iDb ) 
1b040 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
1b050 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20  OP_TEMP_INDEX;. 
1b060 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
1b070 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1b080 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  code, pIndex->zN
1b090 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
1b0a0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
1b0b0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1b0c0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
1b0d0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
1b0e0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
1b0f0 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 61  move the index a
1b100 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74  nd from the mast
1b110 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20  er table */.  v 
1b120 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1b130 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
1b140 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  v ){.    sqlite3
1b150 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
1b160 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
1b170 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
1b180 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
1b190 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45 4c 45  se,.       "DELE
1b1a0 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
1b1b0 45 52 45 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20  ERE name=%Q AND 
1b1c0 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20  type='index'",. 
1b1d0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
1b1e0 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
1b1f0 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 49 6e  _TABLE(iDb), pIn
1b200 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  dex->zName.    )
1b210 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65  ;.    sqlite3Cle
1b220 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61  arStatTables(pPa
1b230 72 73 65 2c 20 69 44 62 2c 20 22 69 64 78 22 2c  rse, iDb, "idx",
1b240 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b   pIndex->zName);
1b250 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
1b260 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
1b270 20 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72   iDb);.    destr
1b280 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
1b290 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c  e, pIndex->tnum,
1b2a0 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
1b2b0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
1b2c0 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44  OP_DropIndex, iD
1b2d0 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d  b, 0, 0, pIndex-
1b2e0 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a  >zName, 0);.  }.
1b2f0 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78  .exit_drop_index
1b300 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
1b310 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61  stDelete(db, pNa
1b320 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41  me);.}../*.** pA
1b330 72 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65  rray is a pointe
1b340 72 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  r to an array of
1b350 20 6f 62 6a 65 63 74 73 2e 20 45 61 63 68 20 6f   objects. Each o
1b360 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20  bject in the.** 
1b370 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79  array is szEntry
1b380 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
1b390 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75 73 65  This routine use
1b3a0 73 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  s sqlite3DbReall
1b3b0 6f 63 28 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e  oc().** to exten
1b3c0 64 20 74 68 65 20 61 72 72 61 79 20 73 6f 20 74  d the array so t
1b3d0 68 61 74 20 74 68 65 72 65 20 69 73 20 73 70 61  hat there is spa
1b3e0 63 65 20 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a  ce for a new obj
1b3f0 65 63 74 20 61 74 20 74 68 65 20 65 6e 64 2e 0a  ect at the end..
1b400 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
1b410 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1b420 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e  ed, *pnEntry con
1b430 74 61 69 6e 73 20 74 68 65 20 63 75 72 72 65 6e  tains the curren
1b440 74 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65  t size of.** the
1b450 20 61 72 72 61 79 20 28 69 6e 20 65 6e 74 72 69   array (in entri
1b460 65 73 20 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f  es - so the allo
1b470 63 61 74 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45  cation is ((*pnE
1b480 6e 74 72 79 29 20 2a 20 73 7a 45 6e 74 72 79 29  ntry) * szEntry)
1b490 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74   bytes.** in tot
1b4a0 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  al)..**.** If th
1b4b0 65 20 72 65 61 6c 6c 6f 63 28 29 20 69 73 20 73  e realloc() is s
1b4c0 75 63 63 65 73 73 66 75 6c 20 28 69 2e 65 2e 20  uccessful (i.e. 
1b4d0 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74  if no OOM condit
1b4e0 69 6f 6e 20 6f 63 63 75 72 73 29 2c 20 74 68 65  ion occurs), the
1b4f0 0a 2a 2a 20 73 70 61 63 65 20 61 6c 6c 6f 63 61  .** space alloca
1b500 74 65 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ted for the new 
1b510 6f 62 6a 65 63 74 20 69 73 20 7a 65 72 6f 65 64  object is zeroed
1b520 2c 20 2a 70 6e 45 6e 74 72 79 20 75 70 64 61 74  , *pnEntry updat
1b530 65 64 20 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74  ed to.** reflect
1b540 20 74 68 65 20 6e 65 77 20 73 69 7a 65 20 6f 66   the new size of
1b550 20 74 68 65 20 61 72 72 61 79 20 61 6e 64 20 61   the array and a
1b560 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1b570 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  new allocation.*
1b580 2a 20 72 65 74 75 72 6e 65 64 2e 20 2a 70 49 64  * returned. *pId
1b590 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
1b5a0 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77  index of the new
1b5b0 20 61 72 72 61 79 20 65 6e 74 72 79 20 69 6e 20   array entry in 
1b5c0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
1b5d0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
1b5e0 68 65 20 72 65 61 6c 6c 6f 63 28 29 20 66 61 69  he realloc() fai
1b5f0 6c 73 2c 20 2a 70 49 64 78 20 69 73 20 73 65 74  ls, *pIdx is set
1b600 20 74 6f 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79   to -1, *pnEntry
1b610 20 72 65 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68   remains.** unch
1b620 61 6e 67 65 64 20 61 6e 64 20 61 20 63 6f 70 79  anged and a copy
1b630 20 6f 66 20 70 41 72 72 61 79 20 72 65 74 75 72   of pArray retur
1b640 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ned..*/.void *sq
1b650 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
1b660 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  te(.  sqlite3 *d
1b670 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  b,      /* Conne
1b680 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
1b690 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  of malloc failur
1b6a0 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  es */.  void *pA
1b6b0 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72 72  rray,     /* Arr
1b6c0 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
1b6d0 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f 63  Might be realloc
1b6e0 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ated */.  int sz
1b6f0 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20 53  Entry,      /* S
1b700 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a 65  ize of each obje
1b710 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ct in the array 
1b720 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72  */.  int *pnEntr
1b730 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  y,     /* Number
1b740 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72   of objects curr
1b750 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a  ently in use */.
1b760 20 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20    int *pIdx     
1b770 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1b780 20 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20   index of a new 
1b790 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  slot here */.){.
1b7a0 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74    char *z;.  int
1b7b0 20 6e 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20   n = *pnEntry;. 
1b7c0 20 69 66 28 20 28 6e 20 26 20 28 6e 2d 31 29 29   if( (n & (n-1))
1b7d0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 73  ==0 ){.    int s
1b7e0 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a  z = (n==0) ? 1 :
1b7f0 20 32 2a 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a   2*n;.    void *
1b800 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
1b810 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72  Realloc(db, pArr
1b820 61 79 2c 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b  ay, sz*szEntry);
1b830 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
1b840 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   ){.      *pIdx 
1b850 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
1b860 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d  rn pArray;.    }
1b870 0a 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e  .    pArray = pN
1b880 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63  ew;.  }.  z = (c
1b890 68 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d  har*)pArray;.  m
1b8a0 65 6d 73 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45  emset(&z[n * szE
1b8b0 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72  ntry], 0, szEntr
1b8c0 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b  y);.  *pIdx = n;
1b8d0 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20  .  ++*pnEntry;. 
1b8e0 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a   return pArray;.
1b8f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
1b900 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
1b910 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69 73   the given IdLis
1b920 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  t.  Create a new
1b930 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65   IdList if.** ne
1b940 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ed be..**.** A n
1b950 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65 74  ew IdList is ret
1b960 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69  urned, or NULL i
1b970 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  f malloc() fails
1b980 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c  ..*/.IdList *sql
1b990 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
1b9a0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
1b9b0 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
1b9c0 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69  en *pToken){.  i
1b9d0 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1b9e0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
1b9f0 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
1ba00 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
1ba10 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20 20  of(IdList) );.  
1ba20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1ba30 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1ba40 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69   pList->a = sqli
1ba50 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
1ba60 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  (.      db,.    
1ba70 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20    pList->a,.    
1ba80 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e    sizeof(pList->
1ba90 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c  a[0]),.      &pL
1baa0 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20  ist->nId,.      
1bab0 26 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c  &i.  );.  if( i<
1bac0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1bad0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
1bae0 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74   pList);.    ret
1baf0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  urn 0;.  }.  pLi
1bb00 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d  st->a[i].zName =
1bb10 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1bb20 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e  Token(db, pToken
1bb30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  );.  return pLis
1bb40 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  t;.}../*.** Dele
1bb50 74 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f  te an IdList..*/
1bb60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c  .void sqlite3IdL
1bb70 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
1bb80 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
1bb90 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
1bba0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1bbb0 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
1bbc0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
1bbd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1bbe0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
1bbf0 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  ist->a[i].zName)
1bc00 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
1bc10 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d  bFree(db, pList-
1bc20 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >a);.  sqlite3Db
1bc30 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
1bc40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1bc50 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c   the index in pL
1bc60 69 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74  ist of the ident
1bc70 69 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e  ifier named zId.
1bc80 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69    Return -1.** i
1bc90 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
1bca0 69 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73  int sqlite3IdLis
1bcb0 74 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70  tIndex(IdList *p
1bcc0 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  List, const char
1bcd0 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
1bce0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1bcf0 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
1bd00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1bd10 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
1bd20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
1bd30 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  ICmp(pList->a[i]
1bd40 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d  .zName, zName)==
1bd50 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
1bd60 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
1bd70 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74  ../*.** Expand t
1bd80 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  he space allocat
1bd90 65 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ed for the given
1bda0 20 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20   SrcList object 
1bdb0 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e  by.** creating n
1bdc0 45 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20  Extra new slots 
1bdd0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74  beginning at iSt
1bde0 61 72 74 2e 20 20 69 53 74 61 72 74 20 69 73 20  art.  iStart is 
1bdf0 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e  zero based..** N
1be00 65 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72  ew slots are zer
1be10 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65  oed..**.** For e
1be20 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20  xample, suppose 
1be30 61 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61  a SrcList initia
1be40 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f  lly contains two
1be50 20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a   entries: A,B..*
1be60 2a 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65  * To append 3 ne
1be70 77 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74  w entries onto t
1be80 68 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a  he end, do this:
1be90 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65  .**.**    sqlite
1bea0 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
1beb0 64 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c  db, pSrclist, 3,
1bec0 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72   2);.**.** After
1bed0 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20   the call above 
1bee0 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  it would contain
1bef0 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69  :  A, B, nil, ni
1bf00 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68  l, nil..** If th
1bf10 65 20 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e  e iStart argumen
1bf20 74 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73  t had been 1 ins
1bf30 74 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20  tead of 2, then 
1bf40 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f  the result.** wo
1bf50 75 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20  uld have been:  
1bf60 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c  A, nil, nil, nil
1bf70 2c 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64  , B.  To prepend
1bf80 20 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a   the new slots,.
1bf90 2a 2a 20 74 68 65 20 69 53 74 61 72 74 20 76 61  ** the iStart va
1bfa0 6c 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20  lue would be 0. 
1bfb0 20 54 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e   The result then
1bfc0 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69   would.** be: ni
1bfd0 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20  l, nil, nil, A, 
1bfe0 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  B..**.** If a me
1bff0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1c000 66 61 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73  fails the SrcLis
1c010 74 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20  t is unchanged. 
1c020 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c   The.** db->mall
1c030 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69  ocFailed flag wi
1c040 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 74 72 75  ll be set to tru
1c050 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  e..*/.SrcList *s
1c060 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
1c070 61 72 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20  arge(.  sqlite3 
1c080 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61  *db,       /* Da
1c090 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1c0a0 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f  n to notify of O
1c0b0 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53  OM errors */.  S
1c0c0 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20  rcList *pSrc,   
1c0d0 20 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74    /* The SrcList
1c0e0 20 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20   to be enlarged 
1c0f0 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
1c100 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1c110 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74  r of new slots t
1c120 6f 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61  o add to pSrc->a
1c130 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  [] */.  int iSta
1c140 72 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  rt         /* In
1c150 64 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d  dex in pSrc->a[]
1c160 20 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c   of first new sl
1c170 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ot */.){.  int i
1c180 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
1c190 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69  hecking on calli
1c1a0 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
1c1b0 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
1c1c0 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=0 );.  assert
1c1d0 28 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20  ( nExtra>=1 );. 
1c1e0 20 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30   assert( pSrc!=0
1c1f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
1c200 74 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63  tart<=pSrc->nSrc
1c210 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
1c220 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70  te additional sp
1c230 61 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ace if needed */
1c240 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72  .  if( pSrc->nSr
1c250 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e  c+nExtra>pSrc->n
1c260 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63  Alloc ){.    Src
1c270 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
1c280 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72  int nAlloc = pSr
1c290 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a  c->nSrc+nExtra;.
1c2a0 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20      int nGot;.  
1c2b0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1c2c0 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53  DbRealloc(db, pS
1c2d0 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rc,.            
1c2e0 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29     sizeof(*pSrc)
1c2f0 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69   + (nAlloc-1)*si
1c300 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29  zeof(pSrc->a[0])
1c310 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77   );.    if( pNew
1c320 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
1c330 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
1c340 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
1c350 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20  eturn pSrc;.    
1c360 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65  }.    pSrc = pNe
1c370 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73  w;.    nGot = (s
1c380 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69  qlite3DbMallocSi
1c390 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73  ze(db, pNew) - s
1c3a0 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69  izeof(*pSrc))/si
1c3b0 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29  zeof(pSrc->a[0])
1c3c0 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41  +1;.    pSrc->nA
1c3d0 6c 6c 6f 63 20 3d 20 28 75 38 29 6e 47 6f 74 3b  lloc = (u8)nGot;
1c3e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  .  }..  /* Move 
1c3f0 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74  existing slots t
1c400 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74  hat come after t
1c410 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65  he newly inserte
1c420 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74  d slots.  ** out
1c430 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20   of the way */. 
1c440 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
1c450 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20  c-1; i>=iStart; 
1c460 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e  i--){.    pSrc->
1c470 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53  a[i+nExtra] = pS
1c480 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  rc->a[i];.  }.  
1c490 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 28 69  pSrc->nSrc += (i
1c4a0 38 29 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20  8)nExtra;..  /* 
1c4b0 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20 61  Zero the newly a
1c4c0 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20 2a  llocated slots *
1c4d0 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72 63  /.  memset(&pSrc
1c4e0 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20  ->a[iStart], 0, 
1c4f0 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30  sizeof(pSrc->a[0
1c500 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f  ])*nExtra);.  fo
1c510 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69 53  r(i=iStart; i<iS
1c520 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b  tart+nExtra; i++
1c530 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  ){.    pSrc->a[i
1c540 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  ].iCursor = -1;.
1c550 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e    }..  /* Return
1c560 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1c570 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c 69  e enlarged SrcLi
1c580 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  st */.  return p
1c590 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  Src;.}.../*.** A
1c5a0 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c  ppend a new tabl
1c5b0 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69  e name to the gi
1c5c0 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72  ven SrcList.  Cr
1c5d0 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69  eate a new SrcLi
1c5e0 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
1c5f0 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69  .  A new entry i
1c600 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65  s created in the
1c610 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66   SrcList even if
1c620 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e   pTable is NULL.
1c630 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74  .**.** A SrcList
1c640 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
1c650 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69   NULL if there i
1c660 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20  s an OOM error. 
1c670 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a   The returned.**
1c680 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 62   SrcList might b
1c690 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
1c6a0 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 77  e SrcList that w
1c6b0 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20 6d  as input or it m
1c6c0 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77  ight be.** a new
1c6d0 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d   one.  If an OOM
1c6e0 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
1c6f0 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69  rs, then the pri
1c700 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69 73  or value of pLis
1c710 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 70  t.** that is inp
1c720 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ut to this routi
1c730 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  ne is automatica
1c740 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  lly freed..**.**
1c750 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73   If pDatabase is
1c760 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65   not null, it me
1c770 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62  ans that the tab
1c780 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e  le has an option
1c790 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e  al.** database n
1c7a0 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b  ame prefix.  Lik
1c7b0 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61  e this:  "databa
1c7c0 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20  se.table".  The 
1c7d0 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69  pDatabase.** poi
1c7e0 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65  nts to the table
1c7f0 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54   name and the pT
1c800 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74  able points to t
1c810 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
1c820 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74  ..** The SrcList
1c830 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64  .a[].zName field
1c840 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
1c850 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
1c860 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f  hich might.** co
1c870 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28  me from pTable (
1c880 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  if pDatabase is 
1c890 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44  NULL) or from pD
1c8a0 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72  atabase.  .** Sr
1c8b0 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62  cList.a[].zDatab
1c8c0 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69  ase is filled wi
1c8d0 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
1c8e0 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  name from pTable
1c8f0 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c  ,.** or with NUL
1c900 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65  L if no database
1c910 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a   is specified..*
1c920 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f  *.** In other wo
1c930 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b  rds, if call lik
1c940 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
1c950 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
1c960 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42  ListAppend(D,A,B
1c970 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,0);.**.** Then 
1c980 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d  B is a table nam
1c990 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
1c9a0 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65  se name is unspe
1c9b0 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c  cified.  If call
1c9c0 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a  ed.** like this:
1c9d0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  .**.**         s
1c9e0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1c9f0 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a  end(D,A,B,C);.**
1ca00 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68  .** Then C is th
1ca10 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
1ca20 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61   B is the databa
1ca30 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20 69  se name.  If C i
1ca40 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65  s defined.** the
1ca50 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f  n so is B.  In o
1ca60 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20 6e  ther words, we n
1ca70 65 76 65 72 20 68 61 76 65 20 61 20 63 61 73 65  ever have a case
1ca80 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   where:.**.**   
1ca90 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
1caa0 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 30  ListAppend(D,A,0
1cab0 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20  ,C);.**.** Both 
1cac0 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61  pTable and pData
1cad0 62 61 73 65 20 61 72 65 20 61 73 73 75 6d 65 64  base are assumed
1cae0 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20   to be quoted.  
1caf0 54 68 65 79 20 61 72 65 20 64 65 71 75 6f 74 65  They are dequote
1cb00 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69 6e  d.** before bein
1cb10 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 53  g added to the S
1cb20 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69  rcList..*/.SrcLi
1cb30 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
1cb40 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c 69  stAppend(.  sqli
1cb50 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
1cb60 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  /* Connection to
1cb70 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f   notify of mallo
1cb80 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20  c failures */.  
1cb90 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  SrcList *pList, 
1cba0 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f      /* Append to
1cbb0 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20 4e   this SrcList. N
1cbc0 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e 65  ULL creates a ne
1cbd0 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54  w SrcList */.  T
1cbe0 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
1cbf0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61     /* Table to a
1cc00 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ppend */.  Token
1cc10 20 2a 70 44 61 74 61 62 61 73 65 20 20 20 20 2f   *pDatabase    /
1cc20 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20 74 68  * Database of th
1cc30 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
1cc40 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1cc50 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73  tem *pItem;.  as
1cc60 73 65 72 74 28 20 70 44 61 74 61 62 61 73 65 3d  sert( pDatabase=
1cc70 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20  =0 || pTable!=0 
1cc80 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61  );  /* Cannot ha
1cc90 76 65 20 43 20 77 69 74 68 6f 75 74 20 42 20 2a  ve C without B *
1cca0 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  /.  if( pList==0
1ccb0 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
1ccc0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
1ccd0 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 53  ero(db, sizeof(S
1cce0 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  rcList) );.    i
1ccf0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1cd00 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
1cd10 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20  t->nAlloc = 1;. 
1cd20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c   }.  pList = sql
1cd30 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
1cd40 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c  ge(db, pList, 1,
1cd50 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20   pList->nSrc);. 
1cd60 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1cd70 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
1cd80 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
1cd90 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  e(db, pList);.  
1cda0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1cdb0 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74    pItem = &pList
1cdc0 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d  ->a[pList->nSrc-
1cdd0 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62  1];.  if( pDatab
1cde0 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65  ase && pDatabase
1cdf0 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44  ->z==0 ){.    pD
1ce00 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d  atabase = 0;.  }
1ce10 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
1ce20 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70   ){.    Token *p
1ce30 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65  Temp = pDatabase
1ce40 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  ;.    pDatabase 
1ce50 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54  = pTable;.    pT
1ce60 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20  able = pTemp;.  
1ce70 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  }.  pItem->zName
1ce80 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1ce90 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62  omToken(db, pTab
1cea0 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44  le);.  pItem->zD
1ceb0 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
1cec0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1ced0 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20  b, pDatabase);. 
1cee0 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
1cef0 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56  ../*.** Assign V
1cf00 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20  dbeCursor index 
1cf10 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74  numbers to all t
1cf20 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69  ables in a SrcLi
1cf30 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
1cf40 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
1cf50 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50  ursors(Parse *pP
1cf60 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
1cf70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
1cf80 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1cf90 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1cfa0 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20  assert(pList || 
1cfb0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
1cfc0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
1cfd0 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
1cfe0 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(i=0, pItem=pL
1cff0 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
1d000 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
1d010 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
1d020 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d  pItem->iCursor>=
1d030 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
1d040 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20   pItem->iCursor 
1d050 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
1d060 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
1d070 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
1d080 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
1d090 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
1d0a0 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  s(pParse, pItem-
1d0b0 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b  >pSelect->pSrc);
1d0c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d0d0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
1d0e0 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63  te an entire Src
1d0f0 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61  List including a
1d100 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74  ll its substruct
1d110 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
1d120 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
1d130 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  e(sqlite3 *db, S
1d140 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
1d150 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
1d160 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1d170 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
1d180 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
1d190 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
1d1a0 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
1d1b0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
1d1c0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
1d1d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1d1e0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
1d1f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1d200 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
1d210 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
1d220 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
1d230 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
1d240 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1d250 62 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78  b, pItem->zIndex
1d260 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
1d270 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70 49  leteTable(db, pI
1d280 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
1d290 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
1d2a0 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
1d2b0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
1d2c0 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
1d2d0 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a  b, pItem->pOn);.
1d2e0 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1d2f0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  tDelete(db, pIte
1d300 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  m->pUsing);.  }.
1d310 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1d320 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
1d330 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1d340 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
1d350 68 65 20 70 61 72 73 65 72 20 74 6f 20 61 64 64  he parser to add
1d360 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74   a new term to t
1d370 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67  he.** end of a g
1d380 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75  rowing FROM clau
1d390 73 65 2e 20 20 54 68 65 20 22 70 22 20 70 61 72  se.  The "p" par
1d3a0 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 70 61  ameter is the pa
1d3b0 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f  rt of.** the FRO
1d3c0 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20 68 61  M clause that ha
1d3d0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
1d3e0 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70 22  onstructed.  "p"
1d3f0 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74   is NULL.** if t
1d400 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1d410 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
1d420 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c  M clause.  pTabl
1d430 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a  e and pDatabase.
1d440 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20  ** are the name 
1d450 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  of the table and
1d460 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20   database named 
1d470 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1d480 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74  se term..** pDat
1d490 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66  abase is NULL if
1d4a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1d4b0 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  me qualifier is 
1d4c0 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a  missing - the.**
1d4d0 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66   usual case.  If
1d4e0 20 74 68 65 20 74 65 72 6d 20 68 61 73 20 61 20   the term has a 
1d4f0 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69  alias, then pAli
1d500 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  as points to the
1d510 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e  .** alias token.
1d520 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73    If the term is
1d530 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65   a subquery, the
1d540 6e 20 70 53 75 62 71 75 65 72 79 20 69 73 20 74  n pSubquery is t
1d550 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  he.** SELECT sta
1d560 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20  tement that the 
1d570 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73  subquery encodes
1d580 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e  .  The pTable an
1d590 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70  d.** pDatabase p
1d5a0 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55  arameters are NU
1d5b0 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69 65  LL for subquerie
1d5c0 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20  s.  The pOn and 
1d5d0 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65  pUsing.** parame
1d5e0 74 65 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e  ters are the con
1d5f0 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61  tent of the ON a
1d600 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
1d610 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
1d620 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68 69   new SrcList whi
1d630 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68  ch encodes is th
1d640 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20  e FROM with the 
1d650 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65  new.** term adde
1d660 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  d..*/.SrcList *s
1d670 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
1d680 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50  endFromTerm(.  P
1d690 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1d6a0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
1d6b0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
1d6c0 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20  rcList *p,      
1d6d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65         /* The le
1d6e0 66 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 46  ft part of the F
1d6f0 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61  ROM clause alrea
1d700 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b  dy seen */.  Tok
1d710 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20  en *pTable,     
1d720 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1d730 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64  the table to add
1d740 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   to the FROM cla
1d750 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  use */.  Token *
1d760 70 44 61 74 61 62 61 73 65 2c 20 20 20 20 20 20  pDatabase,      
1d770 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1d780 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
1d790 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20  ing pTable */.  
1d7a0 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20  Token *pAlias,  
1d7b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
1d7c0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
1d7d0 66 20 74 68 65 20 41 53 20 73 75 62 65 78 70 72  f the AS subexpr
1d7e0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  ession */.  Sele
1d7f0 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20  ct *pSubquery,  
1d800 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72      /* A subquer
1d810 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  y used in place 
1d820 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20  of a table name 
1d830 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20  */.  Expr *pOn, 
1d840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d850 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  The ON clause of
1d860 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c   a join */.  IdL
1d870 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20  ist *pUsing     
1d880 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e       /* The USIN
1d890 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  G clause of a jo
1d8a0 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  in */.){.  struc
1d8b0 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1d8c0 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
1d8d0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1d8e0 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26 20 28  b;.  if( !p && (
1d8f0 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29 20 29  pOn || pUsing) )
1d900 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1d910 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
1d920 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69 73 20   JOIN clause is 
1d930 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
1d940 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e  %s", .      (pOn
1d950 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47   ? "ON" : "USING
1d960 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 67 6f  ").    );.    go
1d970 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65  to append_from_e
1d980 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  rror;.  }.  p = 
1d990 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1d9a0 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61 62  pend(db, p, pTab
1d9b0 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  le, pDatabase);.
1d9c0 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45    if( p==0 || NE
1d9d0 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20  VER(p->nSrc==0) 
1d9e0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65  ){.    goto appe
1d9f0 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20  nd_from_error;. 
1da00 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 2d   }.  pItem = &p-
1da10 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
1da20 20 61 73 73 65 72 74 28 20 70 41 6c 69 61 73 21   assert( pAlias!
1da30 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41 6c 69  =0 );.  if( pAli
1da40 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74  as->n ){.    pIt
1da50 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
1da60 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1da70 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20  n(db, pAlias);. 
1da80 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c   }.  pItem->pSel
1da90 65 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b  ect = pSubquery;
1daa0 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  .  pItem->pOn = 
1dab0 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55  pOn;.  pItem->pU
1dac0 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20  sing = pUsing;. 
1dad0 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70   return p;.. app
1dae0 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a  end_from_error:.
1daf0 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 29    assert( p==0 )
1db00 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
1db10 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a  elete(db, pOn);.
1db20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
1db30 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67  elete(db, pUsing
1db40 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1db50 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 75  ctDelete(db, pSu
1db60 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74 75 72  bquery);.  retur
1db70 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 0;.}../*.** Ad
1db80 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  d an INDEXED BY 
1db90 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63  or NOT INDEXED c
1dba0 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d 6f 73  lause to the mos
1dbb0 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
1dbc0 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20   .** element of 
1dbd0 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73 74 20  the source-list 
1dbe0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
1dbf0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
1dc00 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
1dc10 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 50  cListIndexedBy(P
1dc20 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1dc30 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20  cList *p, Token 
1dc40 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a 20 20  *pIndexedBy){.  
1dc50 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 65 64  assert( pIndexed
1dc60 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  By!=0 );.  if( p
1dc70 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53   && ALWAYS(p->nS
1dc80 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73 74 72  rc>0) ){.    str
1dc90 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1dca0 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
1dcb0 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
1dcc0 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 6e  assert( pItem->n
1dcd0 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 26 26 20  otIndexed==0 && 
1dce0 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30  pItem->zIndex==0
1dcf0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64   );.    if( pInd
1dd00 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20  exedBy->n==1 && 
1dd10 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29  !pIndexedBy->z )
1dd20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f  {.      /* A "NO
1dd30 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73  T INDEXED" claus
1dd40 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20  e was supplied. 
1dd50 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20  See parse.y .   
1dd60 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20     ** construct 
1dd70 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f  "indexed_opt" fo
1dd80 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20  r details. */.  
1dd90 20 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e      pItem->notIn
1dda0 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  dexed = 1;.    }
1ddb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
1ddc0 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69  m->zIndex = sqli
1ddd0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1dde0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e  (pParse->db, pIn
1ddf0 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a  dexedBy);.    }.
1de00 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
1de10 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20  n building up a 
1de20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
1de30 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a  he parser, the j
1de40 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  oin operator.** 
1de50 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74  is initially att
1de60 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
1de70 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20  t operand.  But 
1de80 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
1de90 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68  or.** expects th
1dea0 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
1deb0 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67  to be on the rig
1dec0 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  ht operand.  Thi
1ded0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69  s routine.** Shi
1dee0 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65  fts all join ope
1def0 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74  rators from left
1df00 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e   to right for an
1df10 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20   entire FROM.** 
1df20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78  clause..**.** Ex
1df30 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74  ample: Suppose t
1df40 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20  he join is like 
1df50 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1df60 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20        A natural 
1df70 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a  cross join B.**.
1df80 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  ** The operator 
1df90 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73  is "natural cros
1dfa0 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20  s join".  The A 
1dfb0 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61  and B operands a
1dfc0 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  re stored.** in 
1dfd0 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61  p->a[0] and p->a
1dfe0 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c  [1], respectivel
1dff0 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  y.  The parser i
1e000 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20  nitially stores 
1e010 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  the.** operator 
1e020 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f  with A.  This ro
1e030 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61  utine shifts tha
1e040 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20  t operator over 
1e050 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  to B..*/.void sq
1e060 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66  lite3SrcListShif
1e070 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73  tJoinType(SrcLis
1e080 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  t *p){.  if( p )
1e090 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1e0a0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 20 7c 7c   assert( p->a ||
1e0b0 20 70 2d 3e 6e 53 72 63 3d 3d 30 20 29 3b 0a 20   p->nSrc==0 );. 
1e0c0 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63     for(i=p->nSrc
1e0d0 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20  -1; i>0; i--){. 
1e0e0 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69       p->a[i].joi
1e0f0 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31  ntype = p->a[i-1
1e100 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20  ].jointype;.    
1e110 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f  }.    p->a[0].jo
1e120 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a  intype = 0;.  }.
1e130 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
1e140 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
1e150 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
1e160 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  nTransaction(Par
1e170 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1e180 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  type){.  sqlite3
1e190 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
1e1a0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
1e1b0 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
1e1c0 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
1e1d0 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
1e1e0 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28 20  b!=0 );./*  if( 
1e1f0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d  db->aDb[0].pBt==
1e200 30 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a 20  0 ) return; */. 
1e210 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1e220 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1e230 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
1e240 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29  , "BEGIN", 0, 0)
1e250 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
1e260 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
1e270 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1e280 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74  ;.  if( !v ) ret
1e290 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21  urn;.  if( type!
1e2a0 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a  =TK_DEFERRED ){.
1e2b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
1e2c0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
1e2d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e2e0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e  ddOp2(v, OP_Tran
1e2f0 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70  saction, i, (typ
1e300 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29  e==TK_EXCLUSIVE)
1e310 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
1e320 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
1e330 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  v, i);.    }.  }
1e340 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
1e350 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
1e360 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a  ommit, 0, 0);.}.
1e370 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
1e380 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
1e390 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
1e3a0 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  tTransaction(Par
1e3b0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
1e3c0 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72  dbe *v;..  asser
1e3d0 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
1e3e0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1e3f0 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ->db!=0 );.  if(
1e400 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1e410 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1e420 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43  _TRANSACTION, "C
1e430 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b  OMMIT", 0, 0) ){
1e440 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1e450 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1e460 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1e470 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
1e480 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1e490 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
1e4a0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 0);.  }.}..
1e4b0 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
1e4c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
1e4d0 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
1e4e0 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
1e4f0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1e500 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73    Vdbe *v;..  as
1e510 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
1e520 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1e530 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  rse->db!=0 );.  
1e540 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1e550 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1e560 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
1e570 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20   "ROLLBACK", 0, 
1e580 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1e590 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
1e5a0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1e5b0 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
1e5c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1e5d0 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
1e5e0 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20  ommit, 1, 1);.  
1e5f0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
1e600 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1e610 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
1e620 20 77 68 65 6e 20 69 74 20 70 61 72 73 65 73 20   when it parses 
1e630 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65  a command to cre
1e640 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20  ate,.** release 
1e650 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53  or rollback an S
1e660 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a  QL savepoint. .*
1e670 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61  /.void sqlite3Sa
1e680 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70  vepoint(Parse *p
1e690 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54  Parse, int op, T
1e6a0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
1e6b0 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
1e6c0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1e6d0 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
1e6e0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
1e6f0 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  me ){.    Vdbe *
1e700 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1e710 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e  be(pParse);.#ifn
1e720 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e730 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
1e740 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
1e750 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d  har * const az[]
1e760 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52   = { "BEGIN", "R
1e770 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41  ELEASE", "ROLLBA
1e780 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72  CK" };.    asser
1e790 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45  t( !SAVEPOINT_BE
1e7a0 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54  GIN && SAVEPOINT
1e7b0 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53  _RELEASE==1 && S
1e7c0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1e7d0 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20  K==2 );.#endif. 
1e7e0 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c     if( !v || sql
1e7f0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1e800 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56  arse, SQLITE_SAV
1e810 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20  EPOINT, az[op], 
1e820 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20  zName, 0) ){.   
1e830 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1e840 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
1e850 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
1e860 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  n;.    }.    sql
1e870 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1e880 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20  , OP_Savepoint, 
1e890 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c  op, 0, 0, zName,
1e8a0 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
1e8b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
1e8c0 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  sure the TEMP da
1e8d0 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61  tabase is open a
1e8e0 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  nd available for
1e8f0 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a   use.  Return.**
1e900 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1e910 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e  rrors.  Leave an
1e920 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
1e930 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
1e940 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
1e950 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
1e960 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a  Database(Parse *
1e970 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
1e980 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1e990 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61  >db;.  if( db->a
1e9a0 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20  Db[1].pBt==0 && 
1e9b0 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
1e9c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
1e9d0 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a      Btree *pBt;.
1e9e0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1e9f0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20   int flags = .  
1ea00 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1ea10 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a  PEN_READWRITE |.
1ea20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1ea30 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
1ea40 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1ea50 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
1ea60 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
1ea70 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
1ea80 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
1ea90 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
1eaa0 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20  P_DB;..    rc = 
1eab0 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
1eac0 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62  (db->pVfs, 0, db
1ead0 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73  , &pBt, 0, flags
1eae0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1eaf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1eb00 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1eb10 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
1eb20 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  e to open a temp
1eb30 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22  orary database "
1eb40 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66  .        "file f
1eb50 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f  or storing tempo
1eb60 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20  rary tables");. 
1eb70 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
1eb80 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
1eb90 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
1eba0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d  db->aDb[1].pBt =
1ebb0 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74   pBt;.    assert
1ebc0 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ( db->aDb[1].pSc
1ebd0 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20  hema );.    if( 
1ebe0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71  SQLITE_NOMEM==sq
1ebf0 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
1ec00 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e  eSize(pBt, db->n
1ec10 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c  extPagesize, -1,
1ec20 20 30 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d   0) ){.      db-
1ec30 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
1ec40 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1ec50 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
1ec60 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1ec70 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
1ec80 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 76  code that will v
1ec90 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61  erify the schema
1eca0 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73 74 61 72   cookie and star
1ecb0 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74 72 61 6e  t.** a read-tran
1ecc0 73 61 63 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20  saction for all 
1ecd0 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  named database f
1ece0 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  iles..**.** It i
1ecf0 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  s important that
1ed00 20 61 6c 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b   all schema cook
1ed10 69 65 73 20 62 65 20 76 65 72 69 66 69 65 64 20  ies be verified 
1ed20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20  and all.** read 
1ed30 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 62 65 20  transactions be 
1ed40 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
1ed50 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 68 61 70  nything else hap
1ed60 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56  pens in.** the V
1ed70 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20 42 75  DBE program.  Bu
1ed80 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  t this routine c
1ed90 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  an be called aft
1eda0 65 72 20 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a  er much other.**
1edb0 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e 20 67   code has been g
1edc0 65 6e 65 72 61 74 65 64 2e 20 20 53 6f 20 68 65  enerated.  So he
1edd0 72 65 20 69 73 20 77 68 61 74 20 77 65 20 64 6f  re is what we do
1ede0 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  :.**.** The firs
1edf0 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74  t time this rout
1ee00 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77  ine is called, w
1ee10 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74  e code an OP_Got
1ee20 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a  o that.** will j
1ee30 75 6d 70 20 74 6f 20 61 20 73 75 62 72 6f 75 74  ump to a subrout
1ee40 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ine at the end o
1ee50 66 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 20 20  f the program.  
1ee60 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72  Then we.** recor
1ee70 64 20 65 76 65 72 79 20 64 61 74 61 62 61 73 65  d every database
1ee80 20 74 68 61 74 20 6e 65 65 64 73 20 69 74 73 20   that needs its 
1ee90 73 63 68 65 6d 61 20 76 65 72 69 66 69 65 64 20  schema verified 
1eea0 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61 72 73 65  in the.** pParse
1eeb0 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65  ->cookieMask fie
1eec0 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61 66 74 65  ld.  Later, afte
1eed0 72 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65  r all other code
1eee0 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e   has been.** gen
1eef0 65 72 61 74 65 64 2c 20 74 68 65 20 73 75 62 72  erated, the subr
1ef00 6f 75 74 69 6e 65 20 74 68 61 74 20 64 6f 65 73  outine that does
1ef10 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69   the cookie veri
1ef20 66 69 63 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a  fications and.**
1ef30 20 73 74 61 72 74 73 20 74 68 65 20 74 72 61 6e   starts the tran
1ef40 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65  sactions will be
1ef50 20 63 6f 64 65 64 20 61 6e 64 20 74 68 65 20 4f   coded and the O
1ef60 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a  P_Goto P2 value.
1ef70 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20  ** will be made 
1ef80 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
1ef90 20 73 75 62 72 6f 75 74 69 6e 65 2e 20 20 54 68   subroutine.  Th
1efa0 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20  e generation of 
1efb0 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65  the.** cookie ve
1efc0 72 69 66 69 63 61 74 69 6f 6e 20 73 75 62 72 6f  rification subro
1efd0 75 74 69 6e 65 20 63 6f 64 65 20 68 61 70 70 65  utine code happe
1efe0 6e 73 20 69 6e 20 73 71 6c 69 74 65 33 46 69 6e  ns in sqlite3Fin
1eff0 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a  ishCoding()..**.
1f000 2a 2a 20 49 66 20 69 44 62 3c 30 20 74 68 65 6e  ** If iDb<0 then
1f010 20 63 6f 64 65 20 74 68 65 20 4f 50 5f 47 6f 74   code the OP_Got
1f020 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73  o only - don't s
1f030 65 74 20 66 6c 61 67 20 74 6f 20 76 65 72 69 66  et flag to verif
1f040 79 20 74 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20  y the.** schema 
1f050 6f 6e 20 61 6e 79 20 64 61 74 61 62 61 73 65 73  on any databases
1f060 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
1f070 73 65 64 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20  sed to position 
1f080 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65  the OP_Goto.** e
1f090 61 72 6c 79 20 69 6e 20 74 68 65 20 63 6f 64 65  arly in the code
1f0a0 2c 20 62 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77  , before we know
1f0b0 20 69 66 20 61 6e 79 20 64 61 74 61 62 61 73 65   if any database
1f0c0 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65 20   tables will be 
1f0d0 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  used..*/.void sq
1f0e0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
1f0f0 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61  chema(Parse *pPa
1f100 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  rse, int iDb){. 
1f110 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65   Parse *pTopleve
1f120 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  l = sqlite3Parse
1f130 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29  Toplevel(pParse)
1f140 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1f150 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
1f160 20 69 66 28 20 70 54 6f 70 6c 65 76 65 6c 21 3d   if( pToplevel!=
1f170 70 50 61 72 73 65 20 29 7b 0a 20 20 20 20 2f 2a  pParse ){.    /*
1f180 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
1f190 74 61 6b 65 6e 20 69 66 20 61 20 74 72 69 67 67  taken if a trigg
1f1a0 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
1f1b0 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 49 6e 20  being coded. In 
1f1c0 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 61 73 65  this.    ** case
1f1d0 2c 20 73 65 74 20 63 6f 6f 6b 69 65 47 6f 74 6f  , set cookieGoto
1f1e0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
1f1f0 61 6c 75 65 20 74 6f 20 73 68 6f 77 20 74 68 61  alue to show tha
1f200 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  t this function.
1f210 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
1f220 63 61 6c 6c 65 64 2e 20 54 68 69 73 20 69 73 20  called. This is 
1f230 75 73 65 64 20 62 79 20 74 68 65 20 73 71 6c 69  used by the sqli
1f240 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74  te3ExprCodeConst
1f250 61 6e 74 73 28 29 0a 20 20 20 20 2a 2a 20 66 75  ants().    ** fu
1f260 6e 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70  nction. */.    p
1f270 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74  Parse->cookieGot
1f280 6f 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64  o = -1;.  }.#end
1f290 69 66 0a 20 20 69 66 28 20 70 54 6f 70 6c 65 76  if.  if( pToplev
1f2a0 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d  el->cookieGoto==
1f2b0 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76  0 ){.    Vdbe *v
1f2c0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1f2d0 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20  e(pToplevel);.  
1f2e0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
1f2f0 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e  urn;  /* This on
1f300 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74 68  ly happens if th
1f310 65 72 65 20 77 61 73 20 61 20 70 72 69 6f 72 20  ere was a prior 
1f320 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 70 54 6f  error */.    pTo
1f330 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f  plevel->cookieGo
1f340 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  to = sqlite3Vdbe
1f350 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
1f360 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a  o, 0, 0)+1;.  }.
1f370 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a    if( iDb>=0 ){.
1f380 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
1f390 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b  = pToplevel->db;
1f3a0 0a 20 20 20 20 79 44 62 4d 61 73 6b 20 6d 61 73  .    yDbMask mas
1f3b0 6b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  k;..    assert( 
1f3c0 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
1f3d0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61     assert( db->a
1f3e0 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c  Db[iDb].pBt!=0 |
1f3f0 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20  | iDb==1 );.    
1f400 61 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49  assert( iDb<SQLI
1f410 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b  TE_MAX_ATTACHED+
1f420 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
1f430 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
1f440 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
1f450 20 30 29 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20   0) );.    mask 
1f460 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c  = ((yDbMask)1)<<
1f470 69 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70 54  iDb;.    if( (pT
1f480 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d  oplevel->cookieM
1f490 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
1f4a0 7b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65 76 65  {.      pTopleve
1f4b0 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d  l->cookieMask |=
1f4c0 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 54 6f   mask;.      pTo
1f4d0 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61  plevel->cookieVa
1f4e0 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61  lue[iDb] = db->a
1f4f0 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
1f500 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a  >schema_cookie;.
1f510 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
1f520 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
1f530 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1f540 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
1f550 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a  ase(pToplevel);.
1f560 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f570 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72  }.}../*.** If ar
1f580 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e 55  gument zDb is NU
1f590 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73 71  LL, then call sq
1f5a0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
1f5b0 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63 68  chema() for each
1f5c0 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61   .** attached da
1f5d0 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69 73  tabase. Otherwis
1f5e0 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72  e, invoke it for
1f5f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
1f600 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f  med zDb only..*/
1f610 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
1f620 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65  eVerifyNamedSche
1f630 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
1f640 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
1f650 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  b){.  sqlite3 *d
1f660 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1f670 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1f680 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
1f690 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  ++){.    Db *pDb
1f6a0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
1f6b0 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
1f6c0 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d   && (!zDb || 0==
1f6d0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1f6e0 44 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 29  Db, pDb->zName))
1f6f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1f700 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
1f710 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20 20  a(pParse, i);.  
1f720 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1f730 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20 63   Generate VDBE c
1f740 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72 65  ode that prepare
1f750 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f  s for doing an o
1f760 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  peration that.**
1f770 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68   might change th
1f780 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
1f790 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
1f7a0 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61 6e  tarts a new tran
1f7b0 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61 72  saction if we ar
1f7c0 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77 69  e not already wi
1f7d0 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61  thin.** a transa
1f7e0 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61 72  ction.  If we ar
1f7f0 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  e already within
1f800 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
1f810 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e  then a checkpoin
1f820 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20 74  t.** is set if t
1f830 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20  he setStatement 
1f840 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75  parameter is tru
1f850 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e 74  e.  A checkpoint
1f860 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65   should.** be se
1f870 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73  t for operations
1f880 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69 6c   that might fail
1f890 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73 74   (due to a const
1f8a0 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a  raint) part of.*
1f8b0 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75 67  * the way throug
1f8c0 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c 6c  h and which will
1f8d0 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f   need to undo so
1f8e0 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f 75  me writes withou
1f8f0 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72  t having to.** r
1f900 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f 6c  ollback the whol
1f910 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  e transaction.  
1f920 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 77  For operations w
1f930 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61  here all constra
1f940 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  ints.** can be c
1f950 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61 6e  hecked before an
1f960 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  y changes are ma
1f970 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  de to the databa
1f980 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72 0a  se, it is never.
1f990 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ** necessary to 
1f9a0 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e 64  undo a write and
1f9b0 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20   the checkpoint 
1f9c0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73 65  should not be se
1f9d0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1f9e0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
1f9f0 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61  ation(Parse *pPa
1fa00 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61 74  rse, int setStat
1fa10 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b  ement, int iDb){
1fa20 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
1fa30 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
1fa40 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
1fa50 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64  e);.  sqlite3Cod
1fa60 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
1fa70 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 54  arse, iDb);.  pT
1fa80 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61  oplevel->writeMa
1fa90 73 6b 20 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29  sk |= ((yDbMask)
1faa0 31 29 3c 3c 69 44 62 3b 0a 20 20 70 54 6f 70 6c  1)<<iDb;.  pTopl
1fab0 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69  evel->isMultiWri
1fac0 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d 65  te |= setStateme
1fad0 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64  nt;.}../*.** Ind
1fae0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 73  icate that the s
1faf0 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e 74  tatement current
1fb00 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
1fb10 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 74  ction might writ
1fb20 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f  e.** more than o
1fb30 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70 6c  ne entry (exampl
1fb40 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20  e: deleting one 
1fb50 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74 69  row then inserti
1fb60 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69  ng another,.** i
1fb70 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c  nserting multipl
1fb80 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62 6c  e rows in a tabl
1fb90 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  e, or inserting 
1fba0 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 20  a row and index 
1fbb0 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20  entries.).** If 
1fbc0 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73 20  an abort occurs 
1fbd0 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 68  after some of th
1fbe0 65 73 65 20 77 72 69 74 65 73 20 68 61 76 65 20  ese writes have 
1fbf0 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e 20  completed, then 
1fc00 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65  it will.** be ne
1fc10 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
1fc20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 72  the completed wr
1fc30 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ites..*/.void sq
1fc40 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 28  lite3MultiWrite(
1fc50 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1fc60 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
1fc70 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
1fc80 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
1fc90 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
1fca0 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 31  isMultiWrite = 1
1fcb0 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20  ;.}../* .** The 
1fcc0 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 63  code generator c
1fcd0 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
1fce0 65 20 69 66 20 69 73 20 64 69 73 63 6f 76 65 72  e if is discover
1fcf0 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a 20  s that it is.** 
1fd00 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f 72  possible to abor
1fd10 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70 72  t a statement pr
1fd20 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f  ior to completio
1fd30 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  n.  In order to 
1fd40 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 73  .** perform this
1fd50 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20 63   abort without c
1fd60 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20 64 61  orrupting the da
1fd70 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64 20  tabase, we need 
1fd80 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20  to make.** sure 
1fd90 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
1fda0 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65 64 20  nt is protected 
1fdb0 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  by a statement t
1fdc0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
1fdd0 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77  * Technically, w
1fde0 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73  e only need to s
1fdf0 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74 20  et the mayAbort 
1fe00 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 69  flag if the.** i
1fe10 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61 67  sMultiWrite flag
1fe20 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1fe30 73 65 74 2e 20 20 54 68 65 72 65 20 69 73 20 61  set.  There is a
1fe40 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79   time dependency
1fe50 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74 68  .** such that th
1fe60 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 63  e abort must occ
1fe70 75 72 20 61 66 74 65 72 20 74 68 65 20 6d 75 6c  ur after the mul
1fe80 74 69 77 72 69 74 65 2e 20 20 54 68 69 73 20 6d  tiwrite.  This m
1fe90 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61  akes.** some sta
1fea0 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e  tements involvin
1feb0 67 20 74 68 65 20 52 45 50 4c 41 43 45 20 63 6f  g the REPLACE co
1fec0 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
1fed0 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67  n algorithm.** g
1fee0 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74 65  o a little faste
1fef0 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20 61  r.  But taking a
1ff00 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69 73  dvantage of this
1ff10 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 79   time dependency
1ff20 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72  .** makes it mor
1ff30 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 70  e difficult to p
1ff40 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 63 6f  rove that the co
1ff50 64 65 20 69 73 20 63 6f 72 72 65 63 74 20 28 69  de is correct (i
1ff60 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 72  n .** particular
1ff70 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20 75 73  , it prevents us
1ff80 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e   from writing an
1ff90 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d   effective.** im
1ffa0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1ffb0 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79  sqlite3AssertMay
1ffc0 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f 20  Abort()) and so 
1ffd0 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a  we have chosen.*
1ffe0 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73 61  * to take the sa
1fff0 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b 69  fe route and ski
20000 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  p the optimizati
20010 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
20020 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72 73  te3MayAbort(Pars
20030 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61  e *pParse){.  Pa
20040 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
20050 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
20060 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
20070 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41   pToplevel->mayA
20080 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  bort = 1;.}../*.
20090 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61  ** Code an OP_Ha
200a0 6c 74 20 74 68 61 74 20 63 61 75 73 65 73 20 74  lt that causes t
200b0 68 65 20 76 64 62 65 20 74 6f 20 72 65 74 75 72  he vdbe to retur
200c0 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n an SQLITE_CONS
200d0 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e  TRAINT.** error.
200e0 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 72   The onError par
200f0 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e 65  ameter determine
20100 73 20 77 68 69 63 68 20 28 69 66 20 61 6e 79 29  s which (if any)
20110 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
20120 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72  t.** and/or curr
20130 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
20140 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
20150 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 48  */.void sqlite3H
20160 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  altConstraint(. 
20170 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
20180 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
20190 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65  ntext */.  int e
201a0 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20  rrCode,      /* 
201b0 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20 63  extended error c
201c0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  ode */.  int onE
201d0 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f  rror,      /* Co
201e0 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f  nstraint type */
201f0 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20 20 20  .  char *p4,    
20200 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65       /* Error me
20210 73 73 61 67 65 20 2a 2f 0a 20 20 69 38 20 70 34  ssage */.  i8 p4
20220 74 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  type,        /* 
20230 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50 34 5f  P4_STATIC or P4_
20240 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75  TRANSIENT */.  u
20250 38 20 70 35 45 72 72 6d 73 67 20 20 20 20 20 20  8 p5Errmsg      
20260 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20 74 79   /* P5_ErrMsg ty
20270 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20  pe */.){.  Vdbe 
20280 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
20290 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
202a0 73 73 65 72 74 28 20 28 65 72 72 43 6f 64 65 26  ssert( (errCode&
202b0 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
202c0 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20 69 66  NSTRAINT );.  if
202d0 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62  ( onError==OE_Ab
202e0 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ort ){.    sqlit
202f0 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
20300 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
20310 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
20320 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c  P_Halt, errCode,
20330 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c   onError, 0, p4,
20340 20 70 34 74 79 70 65 29 3b 0a 20 20 69 66 28 20   p4type);.  if( 
20350 70 35 45 72 72 6d 73 67 20 29 20 73 71 6c 69 74  p5Errmsg ) sqlit
20360 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
20370 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a  , p5Errmsg);.}..
20380 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
20390 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 55 4e 49  _Halt due to UNI
203a0 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  QUE or PRIMARY K
203b0 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69  EY constraint vi
203c0 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  olation..*/.void
203d0 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f   sqlite3UniqueCo
203e0 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
203f0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
20400 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
20410 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
20420 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74  r,      /* Const
20430 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20  raint type */.  
20440 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
20450 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
20460 68 61 74 20 74 72 69 67 67 65 72 73 20 74 68 65  hat triggers the
20470 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29   constraint */.)
20480 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  {.  char *zErr;.
20490 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63    int j;.  StrAc
204a0 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20 54 61  cum errMsg;.  Ta
204b0 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 64 78  ble *pTab = pIdx
204c0 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c  ->pTable;..  sql
204d0 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74  ite3StrAccumInit
204e0 28 26 65 72 72 4d 73 67 2c 20 30 2c 20 30 2c 20  (&errMsg, 0, 0, 
204f0 32 30 30 29 3b 0a 20 20 65 72 72 4d 73 67 2e 64  200);.  errMsg.d
20500 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
20510 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
20520 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  x->nKeyCol; j++)
20530 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c  {.    char *zCol
20540 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49   = pTab->aCol[pI
20550 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d  dx->aiColumn[j]]
20560 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
20570 6a 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63  j ) sqlite3StrAc
20580 63 75 6d 41 70 70 65 6e 64 28 26 65 72 72 4d 73  cumAppend(&errMs
20590 67 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20 20  g, ", ", 2);.   
205a0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
205b0 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20  Append(&errMsg, 
205c0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 2d 31 29  pTab->zName, -1)
205d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72  ;.    sqlite3Str
205e0 41 63 63 75 6d 41 70 70 65 6e 64 28 26 65 72 72  AccumAppend(&err
205f0 4d 73 67 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20  Msg, ".", 1);.  
20600 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
20610 6d 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c  mAppend(&errMsg,
20620 20 7a 43 6f 6c 2c 20 2d 31 29 3b 0a 20 20 7d 0a   zCol, -1);.  }.
20630 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
20640 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26  StrAccumFinish(&
20650 65 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  errMsg);.  sqlit
20660 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
20670 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 28 70  (pParse, .    (p
20680 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 3d 3d  Idx->autoIndex==
20690 32 29 3f 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  2)?SQLITE_CONSTR
206a0 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a  AINT_PRIMARYKEY:
206b0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
206c0 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e  T_UNIQUE,.    on
206d0 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f  Error, zErr, P4_
206e0 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73  DYNAMIC, P5_Cons
206f0 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d  traintUnique);.}
20700 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e  .../*.** Code an
20710 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20   OP_Halt due to 
20720 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64  non-unique rowid
20730 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
20740 33 52 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74  3RowidConstraint
20750 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
20760 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
20770 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
20780 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
20790 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f  /* Conflict reso
207a0 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
207b0 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
207c0 62 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74  b       /* The t
207d0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f  able with the no
207e0 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a  n-unique rowid *
207f0 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d  / .){.  char *zM
20800 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  sg;.  int rc;.  
20810 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e  if( pTab->iPKey>
20820 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d  =0 ){.    zMsg =
20830 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
20840 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e  pParse->db, "%s.
20850 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  %s", pTab->zName
20860 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20870 20 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62              pTab
20880 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b  ->aCol[pTab->iPK
20890 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ey].zName);.    
208a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
208b0 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45  TRAINT_PRIMARYKE
208c0 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
208d0 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
208e0 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62  rintf(pParse->db
208f0 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54  , "%s.rowid", pT
20900 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
20910 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
20920 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20  TRAINT_ROWID;.  
20930 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43  }.  sqlite3HaltC
20940 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
20950 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a  , rc, onError, z
20960 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c  Msg, P4_DYNAMIC,
20970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20980 20 20 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73           P5_Cons
20990 74 72 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d  traintUnique);.}
209a0 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
209b0 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20 75   see if pIndex u
209c0 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  ses the collatin
209d0 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
209e0 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
209f0 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64  e if it does and
20a00 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65   false if it doe
20a10 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  s not..*/.#ifnde
20a20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
20a30 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74  INDEX.static int
20a40 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28   collationMatch(
20a50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
20a60 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  l, Index *pIndex
20a70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  ){.  int i;.  as
20a80 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29  sert( zColl!=0 )
20a90 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
20aa0 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Index->nColumn; 
20ab0 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
20ac0 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78  char *z = pIndex
20ad0 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
20ae0 20 61 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c   assert( z!=0 ||
20af0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
20b00 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66  n[i]<0 );.    if
20b10 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ( pIndex->aiColu
20b20 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73  mn[i]>=0 && 0==s
20b30 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
20b40 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
20b50 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
20b60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
20b70 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
20b80 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
20b90 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74  ndices of pTab t
20ba0 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  hat use the coll
20bb0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
20bc0 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c  Coll..** If pCol
20bd0 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
20be0 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
20bf0 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e  of pTab..*/.#ifn
20c00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20c10 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
20c20 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65  oid reindexTable
20c30 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
20c40 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61  Table *pTab, cha
20c50 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
20c60 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
20c70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
20c80 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
20c90 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
20ca0 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78  */..  for(pIndex
20cb0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
20cc0 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49  Index; pIndex=pI
20cd0 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ndex->pNext){.  
20ce0 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c    if( zColl==0 |
20cf0 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  | collationMatch
20d00 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20  (zColl, pIndex) 
20d10 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  ){.      int iDb
20d20 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
20d30 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
20d40 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
20d50 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
20d60 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
20d70 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
20d80 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
20d90 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
20da0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
20db0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
20dc0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
20dd0 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
20de0 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ces of all table
20df0 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
20e00 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20  es where the.** 
20e10 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20  indices use the 
20e20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
20e30 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43  ce pColl.  If pC
20e40 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
20e50 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64  mpute.** all ind
20e60 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e  ices everywhere.
20e70 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
20e80 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
20e90 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
20ea0 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72  dexDatabases(Par
20eb0 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72  se *pParse, char
20ec0 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
20ed0 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20ef0 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   A single databa
20f00 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
20f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
20f30 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
20f40 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
20f50 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
20f60 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
20f70 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
20f80 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20    HashElem *k;  
20f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20fa0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
20fb0 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20  r tables in pDb 
20fc0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
20fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20fe0 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
20ff0 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a  he database */..
21000 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21010 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
21020 74 65 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a  texes(db) );  /*
21030 20 4e 65 65 64 65 64 20 66 6f 72 20 73 63 68 65   Needed for sche
21040 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66  ma access */.  f
21050 6f 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62  or(iDb=0, pDb=db
21060 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e  ->aDb; iDb<db->n
21070 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b  Db; iDb++, pDb++
21080 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
21090 44 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72  Db!=0 );.    for
210a0 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (k=sqliteHashFir
210b0 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  st(&pDb->pSchema
210c0 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20  ->tblHash);  k; 
210d0 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  k=sqliteHashNext
210e0 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62  (k)){.      pTab
210f0 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74   = (Table*)sqlit
21100 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20  eHashData(k);.  
21110 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
21120 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a  (pParse, pTab, z
21130 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Coll);.    }.  }
21140 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
21150 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
21160 6f 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63  or the REINDEX c
21170 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  ommand..**.**   
21180 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20       REINDEX    
21190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211a0 20 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20          -- 1.** 
211b0 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
211c0 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20  <collation>     
211d0 20 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a            -- 2.*
211e0 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
211f0 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
21200 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33  tablename>  -- 3
21210 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
21220 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e  EX  ?<database>.
21230 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d  ?<indexname>  --
21240 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20   4.**.** Form 1 
21250 63 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63  causes all indic
21260 65 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68  es in all attach
21270 65 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20  ed databases to 
21280 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46  be rebuilt..** F
21290 6f 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61  orm 2 rebuilds a
212a0 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
212b0 6c 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  l databases that
212c0 20 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a   use the named.*
212d0 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  * collating func
212e0 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61  tion.  Forms 3 a
212f0 6e 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65  nd 4 rebuild the
21300 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20   named index or 
21310 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61  all.** indices a
21320 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
21330 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a  he named table..
21340 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
21350 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76  E_OMIT_REINDEX.v
21360 6f 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64  oid sqlite3Reind
21370 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
21380 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c  , Token *pName1,
21390 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b   Token *pName2){
213a0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
213b0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
213c0 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  * Collating sequ
213d0 65 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64  ence to be reind
213e0 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  exed, or NULL */
213f0 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
21400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21410 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  * Name of a tabl
21420 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e or index */.  
21430 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
21440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21450 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
21460 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ase */.  Table *
21470 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
21480 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
21490 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
214a0 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
214b0 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
214c0 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73   /* An index ass
214d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61  ociated with pTa
214e0 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20  b */.  int iDb; 
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21500 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
21510 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  se index number 
21520 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
21530 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
21540 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
21550 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
21560 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65   Token *pObjName
21570 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
21580 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
21590 65 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65  e or index to be
215a0 20 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20   reindexed */.. 
215b0 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
215c0 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
215d0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
215e0 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
215f0 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
21600 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
21610 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
21620 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
21630 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
21640 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
21650 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
21660 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31   }..  if( pName1
21670 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64  ==0 ){.    reind
21680 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
21690 73 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  se, 0);.    retu
216a0 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  rn;.  }else if( 
216b0 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29  NEVER(pName2==0)
216c0 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30   || pName2->z==0
216d0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   ){.    char *zC
216e0 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28  oll;.    assert(
216f0 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20   pName1->z );.  
21700 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    zColl = sqlite
21710 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
21720 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
21730 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f  1);.    if( !zCo
21740 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ll ) return;.   
21750 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
21760 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
21770 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20  ENC(db), zColl, 
21780 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  0);.    if( pCol
21790 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64  l ){.      reind
217a0 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72  exDatabases(pPar
217b0 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  se, zColl);.    
217c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
217d0 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  db, zColl);.    
217e0 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
217f0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
21800 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
21810 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
21820 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
21830 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
21840 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b  me2, &pObjName);
21850 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72  .  if( iDb<0 ) r
21860 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c  eturn;.  z = sql
21870 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
21880 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b  n(db, pObjName);
21890 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
218a0 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62  turn;.  zDb = db
218b0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
218c0 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  ;.  pTab = sqlit
218d0 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
218e0 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70  z, zDb);.  if( p
218f0 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64  Tab ){.    reind
21900 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  exTable(pParse, 
21910 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71  pTab, 0);.    sq
21920 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
21930 7a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  z);.    return;.
21940 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
21950 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
21960 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73  db, z, zDb);.  s
21970 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
21980 20 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65   z);.  if( pInde
21990 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
219a0 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
219b0 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
219c0 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
219d0 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
219e0 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
219f0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
21a00 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
21a10 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
21a20 6c 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74  le to identify t
21a30 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20  he object to be 
21a40 72 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23  reindexed");.}.#
21a50 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
21a60 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  urn a KeyInfo st
21a70 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20  ructure that is 
21a80 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
21a90 74 68 65 20 67 69 76 65 6e 20 49 6e 64 65 78 2e  the given Index.
21aa0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4b 65 79 49 6e  .**.** The KeyIn
21ab0 66 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  fo structure for
21ac0 20 61 6e 20 69 6e 64 65 78 20 69 73 20 63 61 63   an index is cac
21ad0 68 65 64 20 69 6e 20 74 68 65 20 49 6e 64 65 78  hed in the Index
21ae0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 53 6f 20 74   object..** So t
21af0 68 65 72 65 20 6d 69 67 68 74 20 62 65 20 6d 75  here might be mu
21b00 6c 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65  ltiple reference
21b10 73 20 74 6f 20 74 68 65 20 72 65 74 75 72 6e 65  s to the returne
21b20 64 20 70 6f 69 6e 74 65 72 2e 20 20 54 68 65 0a  d pointer.  The.
21b30 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  ** caller should
21b40 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 6f 64 69   not try to modi
21b50 66 79 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f  fy the KeyInfo o
21b60 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
21b70 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69   caller should i
21b80 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 4b 65 79  nvoke sqlite3Key
21b90 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f 6e 20 74  InfoUnref() on t
21ba0 68 65 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65  he returned obje
21bb0 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68 61  ct.** when it ha
21bc0 73 20 66 69 6e 69 73 68 65 64 20 75 73 69 6e 67  s finished using
21bd0 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20   it..*/.KeyInfo 
21be0 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f  *sqlite3KeyInfoO
21bf0 66 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  fIndex(Parse *pP
21c00 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
21c10 78 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65  x){.  if( pParse
21c20 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20  ->nErr ) return 
21c30 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
21c40 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
21c50 43 48 45 0a 20 20 69 66 28 20 70 49 64 78 2d 3e  CHE.  if( pIdx->
21c60 70 4b 65 79 49 6e 66 6f 20 26 26 20 70 49 64 78  pKeyInfo && pIdx
21c70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 21 3d  ->pKeyInfo->db!=
21c80 70 50 61 72 73 65 2d 3e 64 62 20 29 7b 0a 20 20  pParse->db ){.  
21c90 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
21ca0 55 6e 72 65 66 28 70 49 64 78 2d 3e 70 4b 65 79  Unref(pIdx->pKey
21cb0 49 6e 66 6f 29 3b 0a 20 20 20 20 70 49 64 78 2d  Info);.    pIdx-
21cc0 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20  >pKeyInfo = 0;. 
21cd0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
21ce0 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pIdx->pKeyInfo==
21cf0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
21d00 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70      int nCol = p
21d10 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  Idx->nColumn;.  
21d20 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64    int nKey = pId
21d30 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20  x->nKeyCol;.    
21d40 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20  KeyInfo *pKey;. 
21d50 20 20 20 69 66 28 20 70 49 64 78 2d 3e 75 6e 69     if( pIdx->uni
21d60 71 4e 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  qNotNull ){.    
21d70 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
21d80 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61  KeyInfoAlloc(pPa
21d90 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e  rse->db, nKey, n
21da0 43 6f 6c 2d 6e 4b 65 79 29 3b 0a 20 20 20 20 7d  Col-nKey);.    }
21db0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4b 65 79  else{.      pKey
21dc0 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
21dd0 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  oAlloc(pParse->d
21de0 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20  b, nCol, 0);.   
21df0 20 7d 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20   }.    if( pKey 
21e00 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
21e10 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
21e20 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29  sWriteable(pKey)
21e30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
21e40 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
21e50 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
21e60 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43  Coll = pIdx->azC
21e70 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  oll[i];.        
21e80 69 66 28 20 4e 45 56 45 52 28 7a 43 6f 6c 6c 3d  if( NEVER(zColl=
21e90 3d 30 29 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42  =0) ) zColl = "B
21ea0 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20 20  INARY";.        
21eb0 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pKey->aColl[i] =
21ec0 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
21ed0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
21ee0 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 4b  oll);.        pK
21ef0 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ey->aSortOrder[i
21f00 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ] = pIdx->aSortO
21f10 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 7d  rder[i];.      }
21f20 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
21f30 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20  e->nErr ){.     
21f40 20 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66     sqlite3KeyInf
21f50 6f 55 6e 72 65 66 28 70 4b 65 79 29 3b 0a 20 20  oUnref(pKey);.  
21f60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21f70 20 20 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66     pIdx->pKeyInf
21f80 6f 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20  o = pKey;.      
21f90 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
21fa0 74 75 72 6e 20 73 71 6c 69 74 65 33 4b 65 79 49  turn sqlite3KeyI
21fb0 6e 66 6f 52 65 66 28 70 49 64 78 2d 3e 70 4b 65  nfoRef(pIdx->pKe
21fc0 79 49 6e 66 6f 29 3b 0a 7d 0a                    yInfo);.}.