/ Hex Artifact Content
Login

Artifact 48f400fa14fd6add244b954ce7e223ce7ccacf0b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
0d90: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
0da0: 65 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20  e given yDbMask 
0db0: 6f 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20  object is empty 
0dc0: 2d 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73  - if it contains
0dd0: 20 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20   no.** 1 bits.  
0de0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0df0: 75 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61  used by the DbMa
0e00: 73 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20  skAllZero() and 
0e10: 44 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a  DbMaskNotZero().
0e20: 2a 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53  ** macros when S
0e30: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
0e40: 45 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ED is greater th
0e50: 61 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51  an 30..*/.#if SQ
0e60: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
0e70: 44 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33  D>30.int sqlite3
0e80: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44  DbMaskAllZero(yD
0e90: 62 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20  bMask m){.  int 
0ea0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
0eb0: 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b  sizeof(yDbMask);
0ec0: 20 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29   i++) if( m[i] )
0ed0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74   return 0;.  ret
0ee0: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
0ef0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
0f00: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
0f10: 74 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c  ter a single SQL
0f20: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f30: 65 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e  een.** parsed an
0f40: 64 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  d a VDBE program
0f50: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74   to execute that
0f60: 20 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62   statement has b
0f70: 65 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e  een.** prepared.
0f80: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70    This routine p
0f90: 75 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e  uts the finishin
0fa0: 67 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65  g touches on the
0fb0: 0a 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d  .** VDBE program
0fc0: 20 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20   and resets the 
0fd0: 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
0fe0: 20 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a   for the next.**
0ff0: 20 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   parse..**.** No
1000: 74 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72  te that if an er
1010: 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74  ror occurred, it
1020: 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61   might be the ca
1030: 73 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44  se that.** no VD
1040: 42 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65  BE code was gene
1050: 72 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  rated..*/.void s
1060: 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
1070: 6e 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ng(Parse *pParse
1080: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1090: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
10a0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
10b0: 70 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a  pToplevel==0 );.
10c0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
10d0: 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  b;.  if( db->mal
10e0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
10f0: 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
1100: 2d 3e 6e 65 73 74 65 64 20 29 20 72 65 74 75 72  ->nested ) retur
1110: 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
1120: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a  >nErr ) return;.
1130: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67  .  /* Begin by g
1140: 65 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74  enerating some t
1150: 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20  ermination code 
1160: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
1170: 65 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67  e.  ** vdbe prog
1180: 72 61 6d 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  ram.  */.  v = s
1190: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
11a0: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
11b0: 20 21 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74   !pParse->isMult
11c0: 69 57 72 69 74 65 20 0a 20 20 20 20 20 20 20 7c  iWrite .       |
11d0: 7c 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  | sqlite3VdbeAss
11e0: 65 72 74 4d 61 79 41 62 6f 72 74 28 76 2c 20 70  ertMayAbort(v, p
11f0: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
1200: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
1210: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
1220: 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f  VdbeDeletePriorO
1230: 70 63 6f 64 65 28 76 2c 20 4f 50 5f 43 6c 6f 73  pcode(v, OP_Clos
1240: 65 29 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74  e) ){}.    sqlit
1250: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
1260: 4f 50 5f 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f  OP_Halt);..    /
1270: 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73  * The cookie mas
1280: 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62  k contains one b
1290: 69 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61  it for each data
12a0: 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a  base file open..
12b0: 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73      ** (Bit 0 is
12c0: 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31   for main, bit 1
12d0: 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e   is for temp, an
12e0: 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69  d so forth.)  Bi
12f0: 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65  ts are.    ** se
1300: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
1310: 61 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64  ase that is used
1320: 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  .  Generate code
1330: 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20   to start a.    
1340: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
1350: 6e 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61  n each used data
1360: 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69  base and to veri
1370: 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
1380: 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65  okie.    ** on e
1390: 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73  ach used databas
13a0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
13b0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
13c0: 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 28  ed==0 .     && (
13d0: 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28 70 50  DbMaskNonZero(pP
13e0: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
13f0: 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70 43 6f  ) || pParse->pCo
1400: 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29 7b 0a  nstExpr).    ){.
1410: 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c 20 69        int iDb, i
1420: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1430: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
1440: 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65 3d 3d  (v, 0)->opcode==
1450: 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20 20 20  OP_Init );.     
1460: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
1470: 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20 20 20  Here(v, 0);.    
1480: 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69 44 62    for(iDb=0; iDb
1490: 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29  <db->nDb; iDb++)
14a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 44 62  {.        if( Db
14b0: 4d 61 73 6b 54 65 73 74 28 70 50 61 72 73 65 2d  MaskTest(pParse-
14c0: 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62  >cookieMask, iDb
14d0: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
14e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14f0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c  VdbeUsesBtree(v,
1500: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73   iDb);.        s
1510: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1520: 49 6e 74 28 76 2c 0a 20 20 20 20 20 20 20 20 20  Int(v,.         
1530: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1550: 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f      /* Opcode */
1560: 0a 20 20 20 20 20 20 20 20 20 20 69 44 62 2c 20  .          iDb, 
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1590: 20 50 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   P1 */.         
15a0: 20 44 62 4d 61 73 6b 54 65 73 74 28 70 50 61 72   DbMaskTest(pPar
15b0: 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 2c 69 44  se->writeMask,iD
15c0: 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20  b), /* P2 */.   
15d0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63         pParse->c
15e0: 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 2c  ookieValue[iDb],
15f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20            /* P3 
1600: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  */.          db-
1610: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
1620: 61 2d 3e 69 47 65 6e 65 72 61 74 69 6f 6e 20 20  a->iGeneration  
1630: 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 20  /* P4 */.       
1640: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1650: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
1660: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   ) sqlite3VdbeCh
1670: 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20  angeP5(v, 1);.  
1680: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
1690: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
16a0: 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 66 6f 72  LTABLE.      for
16b0: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
16c0: 6e 56 74 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b  nVtabLock; i++){
16d0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 76  .        char *v
16e0: 74 61 62 20 3d 20 28 63 68 61 72 20 2a 29 73 71  tab = (char *)sq
16f0: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
1700: 62 2c 20 70 50 61 72 73 65 2d 3e 61 70 56 74 61  b, pParse->apVta
1710: 62 4c 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20  bLock[i]);.     
1720: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1730: 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp4(v, OP_VBegi
1740: 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74 61 62  n, 0, 0, 0, vtab
1750: 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P4_VTAB);.    
1760: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65    }.      pParse
1770: 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20 3d 20 30 3b  ->nVtabLock = 0;
1780: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f  .#endif..      /
1790: 2a 20 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63  * Once all the c
17a0: 6f 6f 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e  ookies have been
17b0: 20 76 65 72 69 66 69 65 64 20 61 6e 64 20 74 72   verified and tr
17c0: 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65  ansactions opene
17d0: 64 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74  d, .      ** obt
17e0: 61 69 6e 20 74 68 65 20 72 65 71 75 69 72 65 64  ain the required
17f0: 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68   table-locks. Th
1800: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  is is a no-op un
1810: 6c 65 73 73 20 74 68 65 20 0a 20 20 20 20 20 20  less the .      
1820: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
1830: 66 65 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c  feature is enabl
1840: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
1850: 20 20 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b     codeTableLock
1860: 73 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  s(pParse);..    
1870: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1880: 61 6e 79 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e  any AUTOINCREMEN
1890: 54 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  T data structure
18a0: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
18b0: 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74    */.      sqlit
18c0: 65 33 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 42  e3AutoincrementB
18d0: 65 67 69 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20  egin(pParse);.. 
18e0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 63 6f 6e       /* Code con
18f0: 73 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e  stant expression
1900: 73 20 74 68 61 74 20 77 68 65 72 65 20 66 61 63  s that where fac
1910: 74 6f 72 65 64 20 6f 75 74 20 6f 66 20 69 6e 6e  tored out of inn
1920: 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20  er loops */.    
1930: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 43    if( pParse->pC
1940: 6f 6e 73 74 45 78 70 72 20 29 7b 0a 20 20 20 20  onstExpr ){.    
1950: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
1960: 4c 20 3d 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e  L = pParse->pCon
1970: 73 74 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  stExpr;.        
1980: 70 50 61 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46  pParse->okConstF
1990: 61 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  actor = 0;.     
19a0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
19b0: 4c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  L->nExpr; i++){.
19c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
19d0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
19e0: 2c 20 70 45 4c 2d 3e 61 5b 69 5d 2e 70 45 78 70  , pEL->a[i].pExp
19f0: 72 2c 20 70 45 4c 2d 3e 61 5b 69 5d 2e 75 2e 69  r, pEL->a[i].u.i
1a00: 43 6f 6e 73 74 45 78 70 72 52 65 67 29 3b 0a 20  ConstExprReg);. 
1a10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1a20: 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c  ..      /* Final
1a30: 6c 79 2c 20 6a 75 6d 70 20 62 61 63 6b 20 74 6f  ly, jump back to
1a40: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1a50: 66 20 74 68 65 20 65 78 65 63 75 74 61 62 6c 65  f the executable
1a60: 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20   code. */.      
1a70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a80: 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
1a90: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   1);.    }.  }..
1aa0: 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 56 44  .  /* Get the VD
1ab0: 42 45 20 70 72 6f 67 72 61 6d 20 72 65 61 64 79  BE program ready
1ac0: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 0a 20   for execution. 
1ad0: 20 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20 41   */.  if( v && A
1ae0: 4c 57 41 59 53 28 70 50 61 72 73 65 2d 3e 6e 45  LWAYS(pParse->nE
1af0: 72 72 3d 3d 30 29 20 26 26 20 21 64 62 2d 3e 6d  rr==0) && !db->m
1b00: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1b10: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73     assert( pPars
1b20: 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d  e->iCacheLevel==
1b30: 30 20 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65  0 );  /* Disable
1b40: 73 20 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73  s and re-enables
1b50: 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 2f 2a   match */.    /*
1b60: 20 41 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 6f 6e   A minimum of on
1b70: 65 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  e cursor is requ
1b80: 69 72 65 64 20 69 66 20 61 75 74 6f 69 6e 63 72  ired if autoincr
1b90: 65 6d 65 6e 74 20 69 73 20 75 73 65 64 0a 20 20  ement is used.  
1ba0: 20 20 2a 20 20 53 65 65 20 74 69 63 6b 65 74 20    *  See ticket 
1bb0: 5b 61 36 39 36 33 37 39 63 31 66 30 38 38 36 36  [a696379c1f08866
1bc0: 5d 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61  ] */.    if( pPa
1bd0: 72 73 65 2d 3e 70 41 69 6e 63 21 3d 30 20 26 26  rse->pAinc!=0 &&
1be0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 30   pParse->nTab==0
1bf0: 20 29 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20   ) pParse->nTab 
1c00: 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 1;.    sqlite3
1c10: 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c  VdbeMakeReady(v,
1c20: 20 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70 50   pParse);.    pP
1c30: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
1c40: 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72  E_DONE;.    pPar
1c50: 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20  se->colNamesSet 
1c60: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1c70: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
1c80: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
1c90: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20  .  pParse->nTab 
1ca0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
1cb0: 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Mem = 0;.  pPars
1cc0: 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70  e->nSet = 0;.  p
1cd0: 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b  Parse->nVar = 0;
1ce0: 0a 20 20 44 62 4d 61 73 6b 5a 65 72 6f 28 70 50  .  DbMaskZero(pP
1cf0: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
1d00: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  );.}../*.** Run 
1d10: 74 68 65 20 70 61 72 73 65 72 20 61 6e 64 20 63  the parser and c
1d20: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 72 65  ode generator re
1d30: 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f 72 64  cursively in ord
1d40: 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a  er to generate.*
1d50: 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53  * code for the S
1d60: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76  QL statement giv
1d70: 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  en onto the end 
1d80: 6f 66 20 74 68 65 20 70 50 61 72 73 65 20 63 6f  of the pParse co
1d90: 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74  ntext.** current
1da0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
1db0: 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65  ction.  When the
1dc0: 20 70 61 72 73 65 72 20 69 73 20 72 75 6e 20 72   parser is run r
1dd0: 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68  ecursively.** th
1de0: 69 73 20 77 61 79 2c 20 74 68 65 20 66 69 6e 61  is way, the fina
1df0: 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74  l OP_Halt is not
1e00: 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20 6f 74   appended and ot
1e10: 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  her initializati
1e20: 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69  on.** and finali
1e30: 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61 72 65  zation steps are
1e40: 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75 73 65   omitted because
1e50: 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e 64 6c   those are handl
1e60: 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75  ing by the.** ou
1e70: 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a  termost parser..
1e80: 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74  **.** Not everyt
1e90: 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62 6c 65  hing is nestable
1ea0: 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69 74 79  .  This facility
1eb0: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
1ec0: 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54  permit.** INSERT
1ed0: 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45  , UPDATE, and DE
1ee0: 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20  LETE operations 
1ef0: 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d  against SQLITE_M
1f00: 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63  ASTER.  Use.** c
1f10: 61 72 65 20 69 66 20 79 6f 75 20 64 65 63 69 64  are if you decid
1f20: 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73 65 20  e to try to use 
1f30: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72  this routine for
1f40: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
1f50: 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oses..*/.void sq
1f60: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
1f70: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1f80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
1f90: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
1fa0: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
1fb0: 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a  *zSql;.  char *z
1fc0: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71  ErrMsg = 0;.  sq
1fd0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1fe0: 73 65 2d 3e 64 62 3b 0a 23 20 64 65 66 69 6e 65  se->db;.# define
1ff0: 20 53 41 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f   SAVE_SZ  (sizeo
2000: 66 28 50 61 72 73 65 29 20 2d 20 6f 66 66 73 65  f(Parse) - offse
2010: 74 6f 66 28 50 61 72 73 65 2c 6e 56 61 72 29 29  tof(Parse,nVar))
2020: 0a 20 20 63 68 61 72 20 73 61 76 65 42 75 66 5b  .  char saveBuf[
2030: 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28  SAVE_SZ];..  if(
2040: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
2050: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
2060: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
2070: 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69  <10 );  /* Nesti
2080: 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ng should only b
2090: 65 20 6f 66 20 6c 69 6d 69 74 65 64 20 64 65 70  e of limited dep
20a0: 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74  th */.  va_start
20b0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
20c0: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 56   zSql = sqlite3V
20d0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72  MPrintf(db, zFor
20e0: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
20f0: 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53  nd(ap);.  if( zS
2100: 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ql==0 ){.    ret
2110: 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c  urn;   /* A mall
2120: 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
2130: 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61  led */.  }.  pPa
2140: 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20  rse->nested++;. 
2150: 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66 2c   memcpy(saveBuf,
2160: 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20   &pParse->nVar, 
2170: 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73  SAVE_SZ);.  mems
2180: 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72  et(&pParse->nVar
2190: 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20  , 0, SAVE_SZ);. 
21a0: 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65   sqlite3RunParse
21b0: 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20  r(pParse, zSql, 
21c0: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c  &zErrMsg);.  sql
21d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
21e0: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
21f0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71  e3DbFree(db, zSq
2200: 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50  l);.  memcpy(&pP
2210: 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65  arse->nVar, save
2220: 42 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20  Buf, SAVE_SZ);. 
2230: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d   pParse->nested-
2240: 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  -;.}../*.** Loca
2250: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
2260: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2270: 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74  describes a part
2280: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a  icular database.
2290: 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  ** table given t
22a0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
22b0: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
22c0: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
22d0: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
22e0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
22f0: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
2300: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
2310: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
2320: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
2330: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
2340: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 20  earched for the 
2350: 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a  table and the.**
2360: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
2370: 74 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65  table is returne
2380: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
2390: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74   for duplicate t
23a0: 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73  able.** names is
23b0: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
23c0: 72 63 68 20 6f 72 64 65 72 20 69 73 20 54 45 4d  rch order is TEM
23d0: 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41  P first, then MA
23e0: 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20  IN, then any.** 
23f0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
2400: 73 65 73 20 61 64 64 65 64 20 75 73 69 6e 67 20  ses added using 
2410: 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61  the ATTACH comma
2420: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  nd..**.** See al
2430: 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  so sqlite3Locate
2440: 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c  Table()..*/.Tabl
2450: 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 54 61  e *sqlite3FindTa
2460: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
2470: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2480: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
2490: 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61  zDatabase){.  Ta
24a0: 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  ble *p = 0;.  in
24b0: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  t i;.  int nName
24c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d  ;.  assert( zNam
24d0: 65 21 3d 30 20 29 3b 0a 20 20 6e 4e 61 6d 65 20  e!=0 );.  nName 
24e0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
24f0: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 2f 2a 20 41  0(zName);.  /* A
2500: 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20 72  ll mutexes are r
2510: 65 71 75 69 72 65 64 20 66 6f 72 20 73 63 68 65  equired for sche
2520: 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65  ma access.  Make
2530: 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68   sure we hold th
2540: 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  em. */.  assert(
2550: 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c   zDatabase!=0 ||
2560: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2570: 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29  dsAllMutexes(db)
2580: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54   );.  for(i=OMIT
2590: 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e  _TEMPDB; i<db->n
25a0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  Db; i++){.    in
25b0: 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e  t j = (i<2) ? i^
25c0: 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72  1 : i;   /* Sear
25d0: 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d  ch TEMP before M
25e0: 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  AIN */.    if( z
25f0: 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20 73  Database!=0 && s
2600: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
2610: 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62  atabase, db->aDb
2620: 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e  [j].zName) ) con
2630: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
2640: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
2650: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c  MutexHeld(db, j,
2660: 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73   0) );.    p = s
2670: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
2680: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65  db->aDb[j].pSche
2690: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61  ma->tblHash, zNa
26a0: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
26b0: 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20  if( p ) break;. 
26c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
26d0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74  ../*.** Locate t
26e0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72  he in-memory str
26f0: 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63  ucture that desc
2700: 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75 6c  ribes a particul
2710: 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  ar database.** t
2720: 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e  able given the n
2730: 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c  ame of that tabl
2740: 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c  e and (optionall
2750: 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  y) the name of t
2760: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
2770: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
2780: 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ble.  Return NUL
2790: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20  L if not found. 
27a0: 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a   Also leave an.*
27b0: 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  * error message 
27c0: 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  in pParse->zErrM
27d0: 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69  sg..**.** The di
27e0: 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
27f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   this routine an
2800: 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  d sqlite3FindTab
2810: 6c 65 28 29 20 69 73 20 74 68 61 74 20 74 68 69  le() is that thi
2820: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61  s.** routine lea
2830: 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ves an error mes
2840: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
2850: 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a  zErrMsg where.**
2860: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
2870: 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f  e() does not..*/
2880: 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c  .Table *sqlite3L
2890: 6f 63 61 74 65 54 61 62 6c 65 28 0a 20 20 50 61  ocateTable(.  Pa
28a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
28b0: 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20       /* context 
28c0: 69 6e 20 77 68 69 63 68 20 74 6f 20 72 65 70 6f  in which to repo
28d0: 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  rt errors */.  i
28e0: 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20  nt isView,      
28f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2900: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 56   looking for a V
2910: 49 45 57 20 72 61 74 68 65 72 20 74 68 61 6e 20  IEW rather than 
2920: 61 20 54 41 42 4c 45 20 2a 2f 0a 20 20 63 6f 6e  a TABLE */.  con
2930: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
2940: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2950: 68 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20  he table we are 
2960: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20  looking for */. 
2970: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2980: 61 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ase     /* Name 
2990: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
29a0: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
29b0: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
29c0: 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
29d0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
29e0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
29f0: 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
2a00: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
2a10: 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
2a20: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
2a30: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
2a40: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
2a50: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
2a60: 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
2a70: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20  n 0;.  }..  p = 
2a80: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2a90: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
2aa0: 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69  me, zDbase);.  i
2ab0: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63  f( p==0 ){.    c
2ac0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20  onst char *zMsg 
2ad0: 3d 20 69 73 56 69 65 77 20 3f 20 22 6e 6f 20 73  = isView ? "no s
2ae0: 75 63 68 20 76 69 65 77 22 20 3a 20 22 6e 6f 20  uch view" : "no 
2af0: 73 75 63 68 20 74 61 62 6c 65 22 3b 0a 20 20 20  such table";.   
2b00: 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20   if( zDbase ){. 
2b10: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2b20: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
2b30: 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73 67 2c 20  : %s.%s", zMsg, 
2b40: 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a  zDbase, zName);.
2b50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b60: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2b70: 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73  (pParse, "%s: %s
2b80: 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65 29 3b  ", zMsg, zName);
2b90: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
2ba0: 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
2bb0: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
2bc0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   p;.}../*.** Loc
2bd0: 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69 64  ate the table id
2be0: 65 6e 74 69 66 69 65 64 20 62 79 20 2a 70 2e 0a  entified by *p..
2bf0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  **.** This is a 
2c00: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
2c10: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
2c20: 65 28 29 2e 20 54 68 65 20 64 69 66 66 65 72 65  e(). The differe
2c30: 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a 2a 20 73  nce between.** s
2c40: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
2c50: 65 28 29 20 61 6e 64 20 74 68 69 73 20 66 75 6e  e() and this fun
2c60: 63 74 69 6f 6e 20 69 73 20 74 68 61 74 20 74 68  ction is that th
2c70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 74  is function rest
2c80: 72 69 63 74 73 0a 2a 2a 20 74 68 65 20 73 65 61  ricts.** the sea
2c90: 72 63 68 20 74 6f 20 73 63 68 65 6d 61 20 28 70  rch to schema (p
2ca0: 2d 3e 70 53 63 68 65 6d 61 29 20 69 66 20 69 74  ->pSchema) if it
2cb0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 70 2d   is not NULL. p-
2cc0: 3e 70 53 63 68 65 6d 61 20 6d 61 79 20 62 65 0a  >pSchema may be.
2cd0: 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 69  ** non-NULL if i
2ce0: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 76  t is part of a v
2cf0: 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 70  iew or trigger p
2d00: 72 6f 67 72 61 6d 20 64 65 66 69 6e 69 74 69 6f  rogram definitio
2d10: 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c 69 74 65  n. See.** sqlite
2d20: 33 46 69 78 53 72 63 4c 69 73 74 28 29 20 66 6f  3FixSrcList() fo
2d30: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 54 61  r details..*/.Ta
2d40: 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  ble *sqlite3Loca
2d50: 74 65 54 61 62 6c 65 49 74 65 6d 28 0a 20 20 50  teTableItem(.  P
2d60: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20  arse *pParse, . 
2d70: 20 69 6e 74 20 69 73 56 69 65 77 2c 20 0a 20 20   int isView, .  
2d80: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2d90: 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e 73  tem *p.){.  cons
2da0: 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 61  t char *zDb;.  a
2db0: 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68 65 6d  ssert( p->pSchem
2dc0: 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74 61  a==0 || p->zData
2dd0: 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28  base==0 );.  if(
2de0: 20 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20   p->pSchema ){. 
2df0: 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
2e00: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
2e10: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d  x(pParse->db, p-
2e20: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7a  >pSchema);.    z
2e30: 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  Db = pParse->db-
2e40: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
2e50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44  .  }else{.    zD
2e60: 62 20 3d 20 70 2d 3e 7a 44 61 74 61 62 61 73 65  b = p->zDatabase
2e70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
2e80: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
2e90: 65 28 70 50 61 72 73 65 2c 20 69 73 56 69 65 77  e(pParse, isView
2ea0: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  , p->zName, zDb)
2eb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
2ec0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
2ed0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
2ee0: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
2ef0: 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
2f00: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
2f10: 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20  f that index.** 
2f20: 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  and the name of 
2f30: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
2f40: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  t contains the i
2f50: 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  ndex..** Return 
2f60: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
2f70: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74  d..**.** If zDat
2f80: 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20  abase is 0, all 
2f90: 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65  databases are se
2fa0: 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a  arched for the.*
2fb0: 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20  * table and the 
2fc0: 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 69  first matching i
2fd0: 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65 64  ndex is returned
2fe0: 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a  .  (No checking.
2ff0: 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ** for duplicate
3000: 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73 20   index names is 
3010: 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72  done.)  The sear
3020: 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54  ch order is.** T
3030: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
3040: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61  MAIN, then any a
3050: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
3060: 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e  es added.** usin
3070: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
3080: 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a  mand..*/.Index *
3090: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
30a0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
30b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
30c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
30d0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
30e0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
30f0: 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  t nName = sqlite
3100: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
3110: 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78  ;.  /* All mutex
3120: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  es are required 
3130: 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73  for schema acces
3140: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77 65  s.  Make sure we
3150: 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20   hold them. */. 
3160: 20 61 73 73 65 72 74 28 20 7a 44 62 21 3d 30 20   assert( zDb!=0 
3170: 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  || sqlite3BtreeH
3180: 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64  oldsAllMutexes(d
3190: 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d  b) );.  for(i=OM
31a0: 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d  IT_TEMPDB; i<db-
31b0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
31c0: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
31d0: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
31e0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
31f0: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65  MAIN */.    Sche
3200: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62  ma *pSchema = db
3210: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
3220: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
3230: 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28  chema );.    if(
3240: 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53   zDb && sqlite3S
3250: 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e  trICmp(zDb, db->
3260: 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20  aDb[j].zName) ) 
3270: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
3280: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
3290: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
32a0: 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20   j, 0) );.    p 
32b0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
32c0: 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  d(&pSchema->idxH
32d0: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ash, zName, nNam
32e0: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20  e);.    if( p ) 
32f0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
3300: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
3310: 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f  Reclaim the memo
3320: 72 79 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e  ry used by an in
3330: 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  dex.*/.static vo
3340: 69 64 20 66 72 65 65 49 6e 64 65 78 28 73 71 6c  id freeIndex(sql
3350: 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20  ite3 *db, Index 
3360: 2a 70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  *p){.#ifndef SQL
3370: 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45  ITE_OMIT_ANALYZE
3380: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  .  sqlite3Delete
3390: 49 6e 64 65 78 53 61 6d 70 6c 65 73 28 64 62 2c  IndexSamples(db,
33a0: 20 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66   p);.#endif.  if
33b0: 28 20 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70  ( db==0 || db->p
33c0: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
33d0: 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
33e0: 6e 72 65 66 28 70 2d 3e 70 4b 65 79 49 6e 66 6f  nref(p->pKeyInfo
33f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
3400: 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50  Delete(db, p->pP
3410: 61 72 74 49 64 78 57 68 65 72 65 29 3b 0a 20 20  artIdxWhere);.  
3420: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3430: 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  , p->zColAff);. 
3440: 20 69 66 28 20 70 2d 3e 69 73 52 65 73 69 7a 65   if( p->isResize
3450: 64 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  d ) sqlite3DbFre
3460: 65 28 64 62 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 29  e(db, p->azColl)
3470: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
3480: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
3490: 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78  ** For the index
34a0: 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65   called zIdxName
34b0: 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20   which is found 
34c0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
34d0: 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74  iDb,.** unlike t
34e0: 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69  hat index from i
34f0: 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65  ts Table then re
3500: 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66  move the index f
3510: 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  rom.** the index
3520: 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20   hash table and 
3530: 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  free all memory 
3540: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
3550: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
3560: 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64  e index..*/.void
3570: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
3580: 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c  dDeleteIndex(sql
3590: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
35a0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
35b0: 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65  IdxName){.  Inde
35c0: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74  x *pIndex;.  int
35d0: 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70 48   len;.  Hash *pH
35e0: 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ash;..  assert( 
35f0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
3600: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
3610: 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20 3d 20  0) );.  pHash = 
3620: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53  &db->aDb[iDb].pS
3630: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a  chema->idxHash;.
3640: 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53    len = sqlite3S
3650: 74 72 6c 65 6e 33 30 28 7a 49 64 78 4e 61 6d 65  trlen30(zIdxName
3660: 29 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  );.  pIndex = sq
3670: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
3680: 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c  pHash, zIdxName,
3690: 20 6c 65 6e 2c 20 30 29 3b 0a 20 20 69 66 28 20   len, 0);.  if( 
36a0: 41 4c 57 41 59 53 28 70 49 6e 64 65 78 29 20 29  ALWAYS(pIndex) )
36b0: 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  {.    if( pIndex
36c0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
36d0: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
36e0: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
36f0: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
3700: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  x->pNext;.    }e
3710: 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
3720: 20 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a 75   *p;.      /* Ju
3730: 73 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 41  stification of A
3740: 4c 57 41 59 53 28 29 3b 20 20 54 68 65 20 69 6e  LWAYS();  The in
3750: 64 65 78 20 6d 75 73 74 20 62 65 20 6f 6e 20 74  dex must be on t
3760: 68 65 20 6c 69 73 74 20 6f 66 0a 20 20 20 20 20  he list of.     
3770: 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a   ** indices. */.
3780: 20 20 20 20 20 20 70 20 3d 20 70 49 6e 64 65 78        p = pIndex
3790: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
37a0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41  ;.      while( A
37b0: 4c 57 41 59 53 28 70 29 20 26 26 20 70 2d 3e 70  LWAYS(p) && p->p
37c0: 4e 65 78 74 21 3d 70 49 6e 64 65 78 20 29 7b 20  Next!=pIndex ){ 
37d0: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a  p = p->pNext; }.
37e0: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
37f0: 28 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d  (p && p->pNext==
3800: 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20  pIndex) ){.     
3810: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49     p->pNext = pI
3820: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ndex->pNext;.   
3830: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
3840: 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  reeIndex(db, pIn
3850: 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  dex);.  }.  db->
3860: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
3870: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d  InternChanges;.}
3880: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72  ../*.** Look thr
3890: 6f 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f 66  ough the list of
38a0: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
38b0: 69 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44 62 5b  iles in db->aDb[
38c0: 5d 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79 20  ] and if.** any 
38d0: 68 61 76 65 20 62 65 65 6e 20 63 6c 6f 73 65 64  have been closed
38e0: 2c 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72  , remove them fr
38f0: 6f 6d 20 74 68 65 20 6c 69 73 74 2e 20 20 52 65  om the list.  Re
3900: 61 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a 20  allocate the.** 
3910: 64 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63 74  db->aDb[] struct
3920: 75 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65 72  ure to a smaller
3930: 20 73 69 7a 65 2c 20 69 66 20 70 6f 73 73 69 62   size, if possib
3940: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20  le..**.** Entry 
3950: 30 20 28 74 68 65 20 22 6d 61 69 6e 22 20 64 61  0 (the "main" da
3960: 74 61 62 61 73 65 29 20 61 6e 64 20 65 6e 74 72  tabase) and entr
3970: 79 20 31 20 28 74 68 65 20 22 74 65 6d 70 22 20  y 1 (the "temp" 
3980: 64 61 74 61 62 61 73 65 29 0a 2a 2a 20 61 72 65  database).** are
3990: 20 6e 65 76 65 72 20 63 61 6e 64 69 64 61 74 65   never candidate
39a0: 73 20 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c 6c  s for being coll
39b0: 61 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  apsed..*/.void s
39c0: 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61  qlite3CollapseDa
39d0: 74 61 62 61 73 65 41 72 72 61 79 28 73 71 6c 69  tabaseArray(sqli
39e0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20  te3 *db){.  int 
39f0: 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  i, j;.  for(i=j=
3a00: 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  2; i<db->nDb; i+
3a10: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44  +){.    struct D
3a20: 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
3a30: 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44  b[i];.    if( pD
3a40: 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  b->pBt==0 ){.   
3a50: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3a60: 28 64 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29  (db, pDb->zName)
3a70: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61  ;.      pDb->zNa
3a80: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  me = 0;.      co
3a90: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
3aa0: 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20    if( j<i ){.   
3ab0: 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20     db->aDb[j] = 
3ac0: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
3ad0: 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  }.    j++;.  }. 
3ae0: 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44 62   memset(&db->aDb
3af0: 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62  [j], 0, (db->nDb
3b00: 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61  -j)*sizeof(db->a
3b10: 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e  Db[j]));.  db->n
3b20: 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62  Db = j;.  if( db
3b30: 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e  ->nDb<=2 && db->
3b40: 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74  aDb!=db->aDbStat
3b50: 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  ic ){.    memcpy
3b60: 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20  (db->aDbStatic, 
3b70: 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f  db->aDb, 2*sizeo
3b80: 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a  f(db->aDb[0]));.
3b90: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
3ba0: 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a  e(db, db->aDb);.
3bb0: 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62      db->aDb = db
3bc0: 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d  ->aDbStatic;.  }
3bd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20  .}../*.** Reset 
3be0: 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74  the schema for t
3bf0: 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 69  he database at i
3c00: 6e 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f 20  ndex iDb.  Also 
3c10: 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45 4d  reset the.** TEM
3c20: 50 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 76 6f 69  P schema..*/.voi
3c30: 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f 6e  d sqlite3ResetOn
3c40: 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20  eSchema(sqlite3 
3c50: 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20  *db, int iDb){. 
3c60: 20 44 62 20 2a 70 44 62 3b 0a 20 20 61 73 73 65   Db *pDb;.  asse
3c70: 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20  rt( iDb<db->nDb 
3c80: 29 3b 0a 0a 20 20 2f 2a 20 43 61 73 65 20 31 3a  );..  /* Case 1:
3c90: 20 20 52 65 73 65 74 20 74 68 65 20 73 69 6e 67    Reset the sing
3ca0: 6c 65 20 73 63 68 65 6d 61 20 69 64 65 6e 74 69  le schema identi
3cb0: 66 69 65 64 20 62 79 20 69 44 62 20 2a 2f 0a 20  fied by iDb */. 
3cc0: 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
3cd0: 69 44 62 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  iDb];.  assert( 
3ce0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
3cf0: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
3d00: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
3d10: 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30 20  pDb->pSchema!=0 
3d20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 68 65  );.  sqlite3Sche
3d30: 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63  maClear(pDb->pSc
3d40: 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  hema);..  /* If 
3d50: 61 6e 79 20 64 61 74 61 62 61 73 65 20 6f 74 68  any database oth
3d60: 65 72 20 74 68 61 6e 20 54 45 4d 50 20 69 73 20  er than TEMP is 
3d70: 72 65 73 65 74 2c 20 74 68 65 6e 20 61 6c 73 6f  reset, then also
3d80: 20 72 65 73 65 74 20 54 45 4d 50 0a 20 20 2a 2a   reset TEMP.  **
3d90: 20 73 69 6e 63 65 20 54 45 4d 50 20 6d 69 67 68   since TEMP migh
3da0: 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 74 72 69  t be holding tri
3db0: 67 67 65 72 73 20 74 68 61 74 20 72 65 66 65 72  ggers that refer
3dc0: 65 6e 63 65 20 74 61 62 6c 65 73 20 69 6e 20 74  ence tables in t
3dd0: 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 64 61  he.  ** other da
3de0: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69  tabase..  */.  i
3df0: 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20  f( iDb!=1 ){.   
3e00: 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
3e10: 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
3e20: 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30 20  pDb->pSchema!=0 
3e30: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63  );.    sqlite3Sc
3e40: 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70  hemaClear(pDb->p
3e50: 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 72  Schema);.  }.  r
3e60: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
3e70: 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61  Erase all schema
3e80: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
3e90: 6d 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  m all attached d
3ea0: 61 74 61 62 61 73 65 73 20 28 69 6e 63 6c 75 64  atabases (includ
3eb0: 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61 6e  ing.** "main" an
3ec0: 64 20 22 74 65 6d 70 22 29 20 66 6f 72 20 61 20  d "temp") for a 
3ed0: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
3ee0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
3ef0: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74  oid sqlite3Reset
3f00: 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e  AllSchemasOfConn
3f10: 65 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a  ection(sqlite3 *
3f20: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  db){.  int i;.  
3f30: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
3f40: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28  rAll(db);.  for(
3f50: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
3f60: 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44  i++){.    Db *pD
3f70: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
3f80: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53  .    if( pDb->pS
3f90: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73  chema ){.      s
3fa0: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
3fb0: 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b  r(pDb->pSchema);
3fc0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d  .    }.  }.  db-
3fd0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
3fe0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
3ff0: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e  .  sqlite3VtabUn
4000: 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20  lockList(db);.  
4010: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
4020: 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69  eAll(db);.  sqli
4030: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
4040: 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 7d 0a  aseArray(db);.}.
4050: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4060: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
4070: 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75  en a commit occu
4080: 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
4090: 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
40a0: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  lChanges(sqlite3
40b0: 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61   *db){.  db->fla
40c0: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
40d0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
40e0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d 65 6d  /*.** Delete mem
40f0: 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ory allocated fo
4100: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
4110: 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  es of a table or
4120: 20 76 69 65 77 20 28 74 68 65 0a 2a 2a 20 54 61   view (the.** Ta
4130: 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72 61 79  ble.aCol[] array
4140: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
4150: 64 20 73 71 6c 69 74 65 44 65 6c 65 74 65 43 6f  d sqliteDeleteCo
4160: 6c 75 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65  lumnNames(sqlite
4170: 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54  3 *db, Table *pT
4180: 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  able){.  int i;.
4190: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
41a0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
41b0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43  !=0 );.  if( (pC
41c0: 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f  ol = pTable->aCo
41d0: 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72  l)!=0 ){.    for
41e0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e  (i=0; i<pTable->
41f0: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
4200: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
4210: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
4220: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
4230: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4240: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c  e(db, pCol->pDfl
4250: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
4260: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
4270: 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->zDflt);.      
4280: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4290: 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a  , pCol->zType);.
42a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
42b0: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43  ree(db, pCol->zC
42c0: 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  oll);.    }.    
42d0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
42e0: 2c 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b  , pTable->aCol);
42f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
4300: 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  move the memory 
4310: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
4320: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4330: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62  the given.** Tab
4340: 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20  le.  No changes 
4350: 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b  are made to disk
4360: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
4370: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
4380: 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65  tine just delete
4390: 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63  s the data struc
43a0: 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e  ture.  It does n
43b0: 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65  ot unlink.** the
43c0: 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75   table data stru
43d0: 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68  cture from the h
43e0: 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20  ash table.  But 
43f0: 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a  it does destroy.
4400: 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ** memory struct
4410: 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69  ures of the indi
4420: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
4430: 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64 20  keys associated 
4440: 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62  with .** the tab
4450: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 62  le..**.** The db
4460: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f 70   parameter is op
4470: 74 69 6f 6e 61 6c 2e 20 20 49 74 20 69 73 20 6e  tional.  It is n
4480: 65 65 64 65 64 20 69 66 20 74 68 65 20 54 61 62  eeded if the Tab
4490: 6c 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  le object .** co
44a0: 6e 74 61 69 6e 73 20 6c 6f 6f 6b 61 73 69 64 65  ntains lookaside
44b0: 20 6d 65 6d 6f 72 79 2e 20 20 28 54 61 62 6c 65   memory.  (Table
44c0: 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20   objects in the 
44d0: 73 63 68 65 6d 61 20 64 6f 20 6e 6f 74 20 75 73  schema do not us
44e0: 65 0a 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20 6d  e.** lookaside m
44f0: 65 6d 6f 72 79 2c 20 62 75 74 20 73 6f 6d 65 20  emory, but some 
4500: 65 70 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20  ephemeral Table 
4510: 6f 62 6a 65 63 74 73 20 64 6f 2e 29 20 20 4f 72  objects do.)  Or
4520: 20 74 68 65 0a 2a 2a 20 64 62 20 70 61 72 61 6d   the.** db param
4530: 65 74 65 72 20 63 61 6e 20 62 65 20 75 73 65 64  eter can be used
4540: 20 77 69 74 68 20 64 62 2d 3e 70 6e 42 79 74 65   with db->pnByte
4550: 73 46 72 65 65 64 20 74 6f 20 6d 65 61 73 75 72  sFreed to measur
4560: 65 20 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  e the memory.** 
4570: 75 73 65 64 20 62 79 20 74 68 65 20 54 61 62 6c  used by the Tabl
4580: 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69  e object..*/.voi
4590: 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54  d sqlite3DeleteT
45a0: 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62  able(sqlite3 *db
45b0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
45c0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  {.  Index *pInde
45d0: 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 54 45 53  x, *pNext;.  TES
45e0: 54 4f 4e 4c 59 28 20 69 6e 74 20 6e 4c 6f 6f 6b  TONLY( int nLook
45f0: 61 73 69 64 65 3b 20 29 20 2f 2a 20 55 73 65 64  aside; ) /* Used
4600: 20 74 6f 20 76 65 72 69 66 79 20 6c 6f 6f 6b 61   to verify looka
4610: 73 69 64 65 20 6e 6f 74 20 75 73 65 64 20 66 6f  side not used fo
4620: 72 20 73 63 68 65 6d 61 20 2a 2f 0a 0a 20 20 61  r schema */..  a
4630: 73 73 65 72 74 28 20 21 70 54 61 62 6c 65 20 7c  ssert( !pTable |
4640: 7c 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e 30  | pTable->nRef>0
4650: 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   );..  /* Do not
4660: 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c   delete the tabl
4670: 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65  e until the refe
4680: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
4690: 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69  hes zero. */.  i
46a0: 66 28 20 21 70 54 61 62 6c 65 20 29 20 72 65 74  f( !pTable ) ret
46b0: 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62  urn;.  if( ((!db
46c0: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
46d0: 72 65 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70  reed==0) && (--p
46e0: 54 61 62 6c 65 2d 3e 6e 52 65 66 29 3e 30 29 20  Table->nRef)>0) 
46f0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
4700: 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65  Record the numbe
4710: 72 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  r of outstanding
4720: 20 6c 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63   lookaside alloc
4730: 61 74 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61  ations in schema
4740: 20 54 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69   Tables.  ** pri
4750: 6f 72 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20  or to doing any 
4760: 66 72 65 65 28 29 20 6f 70 65 72 61 74 69 6f 6e  free() operation
4770: 73 2e 20 20 53 69 6e 63 65 20 73 63 68 65 6d 61  s.  Since schema
4780: 20 54 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75   Tables do not u
4790: 73 65 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64  se.  ** lookasid
47a0: 65 2c 20 74 68 69 73 20 6e 75 6d 62 65 72 20 73  e, this number s
47b0: 68 6f 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65  hould not change
47c0: 2e 20 2a 2f 0a 20 20 54 45 53 54 4f 4e 4c 59 28  . */.  TESTONLY(
47d0: 20 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 28 64   nLookaside = (d
47e0: 62 20 26 26 20 28 70 54 61 62 6c 65 2d 3e 74 61  b && (pTable->ta
47f0: 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65  bFlags & TF_Ephe
4800: 6d 65 72 61 6c 29 3d 3d 30 29 20 3f 0a 20 20 20  meral)==0) ?.   
4810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4820: 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73        db->lookas
4830: 69 64 65 2e 6e 4f 75 74 20 3a 20 30 20 29 3b 0a  ide.nOut : 0 );.
4840: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
4850: 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
4860: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61  ted with this ta
4870: 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49  ble. */.  for(pI
4880: 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70  ndex = pTable->p
4890: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
48a0: 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20  Index=pNext){.  
48b0: 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78    pNext = pIndex
48c0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73  ->pNext;.    ass
48d0: 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63  ert( pIndex->pSc
48e0: 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53  hema==pTable->pS
48f0: 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28  chema );.    if(
4900: 20 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79   !db || db->pnBy
4910: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20  tesFreed==0 ){. 
4920: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
4930: 20 3d 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65   = pIndex->zName
4940: 3b 20 0a 20 20 20 20 20 20 54 45 53 54 4f 4e 4c  ; .      TESTONL
4950: 59 20 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64 20  Y ( Index *pOld 
4960: 3d 20 29 20 73 71 6c 69 74 65 33 48 61 73 68 49  = ) sqlite3HashI
4970: 6e 73 65 72 74 28 0a 20 20 20 20 20 20 20 20 20  nsert(.         
4980: 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61  &pIndex->pSchema
4990: 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65  ->idxHash, zName
49a0: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
49b0: 30 28 7a 4e 61 6d 65 29 2c 20 30 0a 20 20 20 20  0(zName), 0.    
49c0: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72    );.      asser
49d0: 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69  t( db==0 || sqli
49e0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
49f0: 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78  ld(db, 0, pIndex
4a00: 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
4a10: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
4a20: 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64  ==pIndex || pOld
4a30: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
4a40: 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70   freeIndex(db, p
4a50: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Index);.  }..  /
4a60: 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66 6f 72  * Delete any for
4a70: 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61 63 68  eign keys attach
4a80: 65 64 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  ed to this table
4a90: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 6b  . */.  sqlite3Fk
4aa0: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c  Delete(db, pTabl
4ab0: 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  e);..  /* Delete
4ac0: 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
4ad0: 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  ture itself..  *
4ae0: 2f 0a 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65  /.  sqliteDelete
4af0: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20  ColumnNames(db, 
4b00: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
4b10: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
4b20: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  ble->zName);.  s
4b30: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4b40: 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66   pTable->zColAff
4b50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
4b60: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  ctDelete(db, pTa
4b70: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 23  ble->pSelect);.#
4b80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4b90: 49 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c 69 74  IT_CHECK.  sqlit
4ba0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
4bb0: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68  (db, pTable->pCh
4bc0: 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  eck);.#endif.#if
4bd0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4be0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
4bf0: 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72  sqlite3VtabClear
4c00: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 23 65  (db, pTable);.#e
4c10: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62  ndif.  sqlite3Db
4c20: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 29  Free(db, pTable)
4c30: 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74  ;..  /* Verify t
4c40: 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64 65  hat no lookaside
4c50: 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73 65 64   memory was used
4c60: 20 62 79 20 73 63 68 65 6d 61 20 74 61 62 6c 65   by schema table
4c70: 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  s */.  assert( n
4c80: 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c 7c 20  Lookaside==0 || 
4c90: 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64 62 2d 3e  nLookaside==db->
4ca0: 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29  lookaside.nOut )
4cb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
4cc0: 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c  k the given tabl
4cd0: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
4ce0: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64  tables and the d
4cf0: 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62  elete the.** tab
4d00: 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74  le structure wit
4d10: 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  h all its indice
4d20: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
4d30: 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ys..*/.void sqli
4d40: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
4d50: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
4d60: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
4d70: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61  nst char *zTabNa
4d80: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
4d90: 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61  .  Db *pDb;..  a
4da0: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
4db0: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
4dc0: 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
4dd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61  );.  assert( zTa
4de0: 62 4e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72  bName );.  asser
4df0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
4e00: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
4e10: 62 2c 20 30 29 20 29 3b 0a 20 20 74 65 73 74 63  b, 0) );.  testc
4e20: 61 73 65 28 20 7a 54 61 62 4e 61 6d 65 5b 30 5d  ase( zTabName[0]
4e30: 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65 72 6f 2d  ==0 );  /* Zero-
4e40: 6c 65 6e 67 74 68 20 74 61 62 6c 65 20 6e 61 6d  length table nam
4e50: 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 2a  es are allowed *
4e60: 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  /.  pDb = &db->a
4e70: 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73  Db[iDb];.  p = s
4e80: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
4e90: 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  (&pDb->pSchema->
4ea0: 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d  tblHash, zTabNam
4eb0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
4ec0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
4ed0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 61 62 4e  e3Strlen30(zTabN
4ee0: 61 6d 65 29 2c 30 29 3b 0a 20 20 73 71 6c 69 74  ame),0);.  sqlit
4ef0: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
4f00: 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  , p);.  db->flag
4f10: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
4f20: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
4f30: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65  .** Given a toke
4f40: 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69  n, return a stri
4f50: 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ng that consists
4f60: 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66 20   of the text of 
4f70: 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20  that.** token.  
4f80: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
4f90: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
4fa0: 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64  g.** is obtained
4fb0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
4fc0: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
4fd0: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
4fe0: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
4ff0: 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f  n..**.** Any quo
5000: 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65 78  tation marks (ex
5010: 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d 65  :  "name", 'name
5020: 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e  ', [name], or `n
5030: 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73 75  ame`) that.** su
5040: 72 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79 20  rround the body 
5050: 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72 65  of the token are
5060: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20   removed..**.** 
5070: 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e  Tokens are often
5080: 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69   just pointers i
5090: 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
50a0: 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f   SQL text and so
50b0: 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30  .** are not \000
50c0: 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20   terminated and 
50d0: 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65  are not persiste
50e0: 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65  nt.  The returne
50f0: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c  d string.** is \
5100: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61  000 terminated a
5110: 6e 64 20 69 73 20 70 65 72 73 69 73 74 65 6e 74  nd is persistent
5120: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
5130: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
5140: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b  sqlite3 *db, Tok
5150: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
5160: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  ar *zName;.  if(
5170: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
5180: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
5190: 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
51a0: 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  *)pName->z, pNam
51b0: 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  e->n);.    sqlit
51c0: 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
51d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
51e0: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Name = 0;.  }.  
51f0: 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
5200: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
5210: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
5220: 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61  ble stored in da
5230: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44  tabase number iD
5240: 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  b for.** writing
5250: 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f  . The table is o
5260: 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73  pened using curs
5270: 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  or 0..*/.void sq
5280: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
5290: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69  able(Parse *p, i
52a0: 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
52b0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
52c0: 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  dbe(p);.  sqlite
52d0: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44  3TableLock(p, iD
52e0: 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  b, MASTER_ROOT, 
52f0: 31 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  1, SCHEMA_TABLE(
5300: 69 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  iDb));.  sqlite3
5310: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
5320: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30   OP_OpenWrite, 0
5330: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69  , MASTER_ROOT, i
5340: 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70 2d  Db, 5);.  if( p-
5350: 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  >nTab==0 ){.    
5360: 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d  p->nTab = 1;.  }
5370: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
5380: 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73  ter zName points
5390: 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   to a nul-termin
53a0: 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74  ated buffer cont
53b0: 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a  aining the name.
53c0: 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  ** of a database
53d0: 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22   ("main", "temp"
53e0: 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   or the name of 
53f0: 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e  an attached db).
5400: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
5410: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e  n returns the in
5420: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
5430: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
5440: 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31  >aDb[], or.** -1
5450: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62   if the named db
5460: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
5470: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5480: 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74  FindDbName(sqlit
5490: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
54a0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
54b0: 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  t i = -1;       
54c0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
54d0: 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e  mber */.  if( zN
54e0: 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70  ame ){.    Db *p
54f0: 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  Db;.    int n = 
5500: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
5510: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28  zName);.    for(
5520: 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70  i=(db->nDb-1), p
5530: 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20  Db=&db->aDb[i]; 
5540: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d  i>=0; i--, pDb--
5550: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 21 4f  ){.      if( (!O
5560: 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21  MIT_TEMPDB || i!
5570: 3d 31 20 29 20 26 26 20 6e 3d 3d 73 71 6c 69 74  =1 ) && n==sqlit
5580: 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62 2d 3e  e3Strlen30(pDb->
5590: 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20  zName) && .     
55a0: 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53       0==sqlite3S
55b0: 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d  trICmp(pDb->zNam
55c0: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
55d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
55e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
55f0: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a  return i;.}../*.
5600: 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e  ** The token *pN
5610: 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ame contains the
5620: 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62   name of a datab
5630: 61 73 65 20 28 65 69 74 68 65 72 20 22 6d 61 69  ase (either "mai
5640: 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20  n" or.** "temp" 
5650: 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  or the name of a
5660: 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20  n attached db). 
5670: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
5680: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65  urns the.** inde
5690: 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64  x of the named d
56a0: 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61  atabase in db->a
56b0: 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74  Db[], or -1 if t
56c0: 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20  he named db .** 
56d0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
56e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  */.int sqlite3Fi
56f0: 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62  ndDb(sqlite3 *db
5700: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
5710: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
5720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5730: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5740: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
5750: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5770: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20       /* Name we 
5780: 61 72 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f  are searching fo
5790: 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  r */.  zName = s
57a0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
57b0: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
57c0: 20 20 69 20 3d 20 73 71 6c 69 74 65 33 46 69 6e    i = sqlite3Fin
57d0: 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d  dDbName(db, zNam
57e0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
57f0: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
5800: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
5810: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
5820: 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e  iew or trigger n
5830: 61 6d 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  ame is passed to
5840: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
5850: 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d  a tokens.** pNam
5860: 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49  e1 and pName2. I
5870: 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  f the table name
5880: 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69   was fully quali
5890: 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  fied, for exampl
58a0: 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  e:.**.** CREATE 
58b0: 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e  TABLE xxx.yyy (.
58c0: 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e  ..);.** .** Then
58d0: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
58e0: 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d  o "xxx" and pNam
58f0: 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65  e2 "yyy". On the
5900: 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a   other hand if.*
5910: 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
5920: 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75   is not fully qu
5930: 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a  alified, i.e.:.*
5940: 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c  *.** CREATE TABL
5950: 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a  E yyy(...);.**.*
5960: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
5970: 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e   set to "yyy" an
5980: 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a  d pName2 is ""..
5990: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
59a0: 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70 70 55  ne sets the *ppU
59b0: 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f  nqual pointer to
59c0: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f   point at the to
59d0: 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a  ken (pName1 or.*
59e0: 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73  * pName2) that s
59f0: 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c  tores the unqual
5a00: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
5a10: 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20  .  The index of 
5a20: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
5a30: 22 78 78 78 22 20 69 73 20 72 65 74 75 72 6e 65  "xxx" is returne
5a40: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5a50: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20  3TwoPartName(.  
5a60: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5a70: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
5a80: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
5a90: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
5aa0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
5ab0: 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22      /* The "xxx"
5ac0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78   in the name "xx
5ad0: 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22 20  x.yyy" or "xxx" 
5ae0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
5af0: 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e2,      /* The 
5b00: 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d  "yyy" in the nam
5b10: 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20  e "xxx.yyy" */. 
5b20: 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c   Token **pUnqual
5b30: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
5b40: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62  e unqualified ob
5b50: 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a  ject name here *
5b60: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  /.){.  int iDb; 
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b80: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
5b90: 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63  olding the objec
5ba0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
5bb0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
5bc0: 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ..  if( ALWAYS(p
5bd0: 4e 61 6d 65 32 21 3d 30 29 20 26 26 20 70 4e 61  Name2!=0) && pNa
5be0: 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  me2->n>0 ){.    
5bf0: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
5c00: 79 20 29 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  y ) {.      sqli
5c10: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5c20: 73 65 2c 20 22 63 6f 72 72 75 70 74 20 64 61 74  se, "corrupt dat
5c30: 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20 70  abase");.      p
5c40: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
5c50: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
5c60: 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75      }.    *pUnqu
5c70: 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20  al = pName2;.   
5c80: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
5c90: 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29  ndDb(db, pName1)
5ca0: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
5cb0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5cc0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5cd0: 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61   "unknown databa
5ce0: 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b  se %T", pName1);
5cf0: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
5d00: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
5d10: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
5d20: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
5d30: 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  t( db->init.iDb=
5d40: 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62  =0 || db->init.b
5d50: 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d  usy );.    iDb =
5d60: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20   db->init.iDb;. 
5d70: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
5d80: 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame1;.  }.  retu
5d90: 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn iDb;.}../*.**
5da0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5db0: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69   used to check i
5dc0: 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69  f the UTF-8 stri
5dd0: 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65  ng zName is a le
5de0: 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69  gal.** unqualifi
5df0: 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65  ed name for a ne
5e00: 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  w schema object 
5e10: 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76  (table, index, v
5e20: 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65  iew or.** trigge
5e30: 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72  r). All names ar
5e40: 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74  e legal except t
5e50: 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e 20  hose that begin 
5e60: 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a  with the string.
5e70: 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e  ** "sqlite_" (in
5e80: 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72   upper, lower or
5e90: 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54 68   mixed case). Th
5ea0: 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  is portion of th
5eb0: 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  e namespace.** i
5ec0: 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  s reserved for i
5ed0: 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a  nternal use..*/.
5ee0: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
5ef0: 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65  ObjectName(Parse
5f00: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
5f10: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
5f20: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d  if( !pParse->db-
5f30: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50  >init.busy && pP
5f40: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
5f50: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70  .          && (p
5f60: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
5f70: 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53   & SQLITE_WriteS
5f80: 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20  chema)==0.      
5f90: 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
5fa0: 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c  3StrNICmp(zName,
5fb0: 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29   "sqlite_", 7) )
5fc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
5fd0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
5fe0: 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72  bject name reser
5ff0: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
6000: 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65   use: %s", zName
6010: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
6020: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
6030: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6040: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
6050: 75 72 6e 20 74 68 65 20 50 52 49 4d 41 52 59 20  urn the PRIMARY 
6060: 4b 45 59 20 69 6e 64 65 78 20 6f 66 20 61 20 74  KEY index of a t
6070: 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  able.*/.Index *s
6080: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
6090: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
60a0: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a  b){.  Index *p;.
60b0: 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70 49    for(p=pTab->pI
60c0: 6e 64 65 78 3b 20 70 20 26 26 20 21 49 73 50 72  ndex; p && !IsPr
60d0: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 29  imaryKeyIndex(p)
60e0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a  ; p=p->pNext){}.
60f0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
6100: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6110: 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
6120: 70 49 64 78 20 74 68 61 74 20 63 6f 72 72 65 73  pIdx that corres
6130: 70 6f 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a  ponds to table.*
6140: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20  * column iCol.  
6150: 52 65 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74  Return -1 if not
6160: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73   found..*/.i16 s
6170: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
6180: 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78 2c  dex(Index *pIdx,
6190: 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e   i16 iCol){.  in
61a0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
61b0: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
61c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
61d0: 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  Col==pIdx->aiCol
61e0: 75 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e 20  umn[i] ) return 
61f0: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
6200: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  -1;.}../*.** Beg
6210: 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20  in constructing 
6220: 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72  a new table repr
6230: 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65  esentation in me
6240: 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a  mory.  This is.*
6250: 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73  * the first of s
6260: 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f  everal action ro
6270: 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20  utines that get 
6280: 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e  called in respon
6290: 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54  se.** to a CREAT
62a0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
62b0: 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61  t.  In particula
62c0: 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
62d0: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74  is called.** aft
62e0: 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73  er seeing tokens
62f0: 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54   "CREATE" and "T
6300: 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61  ABLE" and the ta
6310: 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73  ble name. The is
6320: 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Temp.** flag is 
6330: 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c  true if the tabl
6340: 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
6350: 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69  ed in the auxili
6360: 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
6370: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
6380: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
6390: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
63a0: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65   is normally the
63b0: 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68   case.** when th
63c0: 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d  e "TEMP" or "TEM
63d0: 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20  PORARY" keyword 
63e0: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
63f0: 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20  n.** CREATE and 
6400: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TABLE..**.** The
6410: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
6420: 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  d is initialized
6430: 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72   and put in pPar
6440: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a  se->pNewTable..*
6450: 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65  * As more of the
6460: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6470: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
6480: 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63  d, additional ac
6490: 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73  tion.** routines
64a0: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
64b0: 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f  to add more info
64c0: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
64d0: 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68  record..** At th
64e0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
64f0: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
6500: 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33  ent, the sqlite3
6510: 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69  EndTable() routi
6520: 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
6530: 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
6540: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20  construction of 
6550: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  the new table re
6560: 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  cord..*/.void sq
6570: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
6580: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6590: 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f  ,   /* Parser co
65a0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
65b0: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46   *pName1,   /* F
65c0: 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65  irst part of the
65d0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
65e0: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
65f0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
6600: 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
6610: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
6620: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
6630: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
6640: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
6650: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
6660: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
6670: 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20  isView,      /* 
6680: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
6690: 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20  a VIEW */.  int 
66a0: 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20  isVirtual,   /* 
66b0: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
66c0: 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20  a VIRTUAL table 
66d0: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20  */.  int noErr  
66e0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
66f0: 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72  ing if table alr
6700: 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
6710: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  {.  Table *pTabl
6720: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  e;.  char *zName
6730: 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d   = 0; /* The nam
6740: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
6750: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  le */.  sqlite3 
6760: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
6770: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
6780: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
6790: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
67a0: 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
67b0: 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54   table in */.  T
67c0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20  oken *pName;    
67d0: 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
67e0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
67f0: 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20   to create */.. 
6800: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72   /* The table or
6810: 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72   view name to cr
6820: 65 61 74 65 20 69 73 20 70 61 73 73 65 64 20 74  eate is passed t
6830: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76  o this routine v
6840: 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70  ia tokens.  ** p
6850: 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32  Name1 and pName2
6860: 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e  . If the table n
6870: 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75  ame was fully qu
6880: 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61  alified, for exa
6890: 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
68a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78  CREATE TABLE xxx
68b0: 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a  .yyy (...);.  **
68c0: 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d   .  ** Then pNam
68d0: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78  e1 is set to "xx
68e0: 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79  x" and pName2 "y
68f0: 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  yy". On the othe
6900: 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74  r hand if.  ** t
6910: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73  he table name is
6920: 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69   not fully quali
6930: 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a  fied, i.e.:.  **
6940: 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42  .  ** CREATE TAB
6950: 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a  LE yyy(...);.  *
6960: 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  *.  ** Then pNam
6970: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79  e1 is set to "yy
6980: 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73  y" and pName2 is
6990: 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   ""..  **.  ** T
69a0: 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65  he call below se
69b0: 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69  ts the pName poi
69c0: 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  nter to point at
69d0: 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d   the token (pNam
69e0: 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65  e1 or.  ** pName
69f0: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
6a00: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
6a10: 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76  able name. The v
6a20: 61 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20  ariable iDb is. 
6a30: 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69   ** set to the i
6a40: 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
6a50: 62 61 73 65 20 74 68 61 74 20 74 68 65 20 74 61  base that the ta
6a60: 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 74  ble or view is t
6a70: 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65  o be.  ** create
6a80: 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62  d in..  */.  iDb
6a90: 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
6aa0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
6ab0: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
6ac0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62  Name);.  if( iDb
6ad0: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  <0 ) return;.  i
6ae0: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
6af0: 26 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61  && isTemp && pNa
6b00: 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21  me2->n>0 && iDb!
6b10: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =1 ){.    /* If 
6b20: 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20  creating a temp 
6b30: 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20  table, the name 
6b40: 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69  may not be quali
6b50: 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20 20  fied. Unless .  
6b60: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
6b70: 65 20 6e 61 6d 65 20 69 73 20 22 74 65 6d 70 22  e name is "temp"
6b80: 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20 20   anyway.  */.   
6b90: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6ba0: 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72  (pParse, "tempor
6bb0: 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d  ary table name m
6bc0: 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69  ust be unqualifi
6bd0: 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
6be0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49  ;.  }.  if( !OMI
6bf0: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
6c00: 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20  mp ) iDb = 1;.. 
6c10: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
6c20: 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20  ken = *pName;.  
6c30: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
6c40: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
6c50: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
6c60: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
6c70: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
6c80: 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
6c90: 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
6ca0: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
6cb0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
6cc0: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  _error;.  }.  if
6cd0: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
6ce0: 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a  1 ) isTemp = 1;.
6cf0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6d00: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
6d10: 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 54  N.  assert( (isT
6d20: 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70  emp & 1)==isTemp
6d30: 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20   );.  {.    int 
6d40: 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  code;.    char *
6d50: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
6d60: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
6d70: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
6d80: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
6d90: 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
6da0: 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20  _TABLE(isTemp), 
6db0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
6dc0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6dd0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6de0: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
6df0: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
6e00: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6e10: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
6e20: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
6e30: 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  E_TEMP_VIEW;.   
6e40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6e50: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
6e60: 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20  CREATE_VIEW;.   
6e70: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
6e80: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
6e90: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
6ea0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
6eb0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
6ec0: 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
6ed0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6ee0: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
6ef0: 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20  CREATE_TABLE;.  
6f00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6f10: 69 66 28 20 21 69 73 56 69 72 74 75 61 6c 20 26  if( !isVirtual &
6f20: 26 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  & sqlite3AuthChe
6f30: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
6f40: 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20   zName, 0, zDb) 
6f50: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
6f60: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6f70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
6f80: 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
6f90: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  e the new table 
6fa0: 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  name does not co
6fb0: 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78  llide with an ex
6fc0: 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  isting.  ** inde
6fd0: 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20  x or table name 
6fe0: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
6ff0: 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20  base.  Issue an 
7000: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66  error message if
7010: 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54  .  ** it does. T
7020: 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  he exception is 
7030: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
7040: 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 77 61   being parsed wa
7050: 73 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f  s passed.  ** to
7060: 20 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c   an sqlite3_decl
7070: 61 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e  are_vtab() call.
7080: 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e   In that case on
7090: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
70a0: 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70  mes.  ** and typ
70b0: 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c  es will be used,
70c0: 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20   so there is no 
70d0: 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72  need to test for
70e0: 20 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20   namespace.  ** 
70f0: 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f  collisions..  */
7100: 0a 20 20 69 66 28 20 21 49 4e 5f 44 45 43 4c 41  .  if( !IN_DECLA
7110: 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 63  RE_VTAB ){.    c
7120: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
7130: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
7140: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
7150: 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
7160: 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
7170: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
7180: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
7190: 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20   }.    pTable = 
71a0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
71b0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29  (db, zName, zDb)
71c0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ;.    if( pTable
71d0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e   ){.      if( !n
71e0: 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20  oErr ){.        
71f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7200: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
7210: 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  T already exists
7220: 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", pName);.     
7230: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7240: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
7250: 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20  t.busy );.      
7260: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
7270: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
7280: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a  , iDb);.      }.
7290: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
72a0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
72b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
72c0: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
72d0: 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20   zName, zDb)!=0 
72e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
72f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7300: 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
7310: 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65  dy an index name
7320: 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
7330: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
7340: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
7350: 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65   }.  }..  pTable
7360: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7370: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
7380: 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28  f(Table));.  if(
7390: 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20   pTable==0 ){.  
73a0: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
73b0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 72  ed = 1;.    pPar
73c0: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
73d0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73  NOMEM;.    pPars
73e0: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
73f0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7400: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61  error;.  }.  pTa
7410: 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  ble->zName = zNa
7420: 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50  me;.  pTable->iP
7430: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62  Key = -1;.  pTab
7440: 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62  le->pSchema = db
7450: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
7460: 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52  ma;.  pTable->nR
7470: 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 6c 65  ef = 1;.  pTable
7480: 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32  ->nRowLogEst = 2
7490: 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d  00; assert( 200=
74a0: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
74b0: 30 34 38 35 37 36 29 20 29 3b 0a 20 20 61 73 73  048576) );.  ass
74c0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65  ert( pParse->pNe
74d0: 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70  wTable==0 );.  p
74e0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
74f0: 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a   = pTable;..  /*
7500: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
7510: 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71  magic sqlite_seq
7520: 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64  uence table used
7530: 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   by autoincremen
7540: 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63  t,.  ** then rec
7550: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
7560: 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74   this table in t
7570: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
7580: 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
7590: 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63  so that INSERT c
75a0: 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c  an find the tabl
75b0: 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23  e easily..  */.#
75c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
75d0: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
75e0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
75f0: 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70  nested && strcmp
7600: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
7610: 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b  sequence")==0 ){
7620: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
7630: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
7640: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
7650: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70  );.    pTable->p
7660: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20  Schema->pSeqTab 
7670: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  = pTable;.  }.#e
7680: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ndif..  /* Begin
7690: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
76a0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
76b0: 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20  nsert the table 
76c0: 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a  record into.  **
76d0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
76e0: 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20  ER table.  Note 
76f0: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68  in particular th
7700: 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68  at we must go ah
7710: 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ead.  ** and all
7720: 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64  ocate the record
7730: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7740: 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e  table entry now.
7750: 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a    Before any.  *
7760: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  * PRIMARY KEY or
7770: 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73   UNIQUE keywords
7780: 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68   are parsed.  Th
7790: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c  ose keywords wil
77a0: 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64  l cause.  ** ind
77b0: 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ices to be creat
77c0: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
77d0: 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d   record must com
77e0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20  e before the .  
77f0: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e  ** indices.  Hen
7800: 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ce, the record n
7810: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
7820: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ble must be allo
7830: 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  cated.  ** now..
7840: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
7850: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20  init.busy && (v 
7860: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
7870: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
7880: 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20 20      int j1;.    
7890: 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a  int fileFormat;.
78a0: 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72 65      int reg1, re
78b0: 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 73 71  g2, reg3;.    sq
78c0: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
78d0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
78e0: 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64   0, iDb);..#ifnd
78f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
7900: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
7910: 69 66 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b  if( isVirtual ){
7920: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7930: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56  beAddOp0(v, OP_V
7940: 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65  Begin);.    }.#e
7950: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
7960: 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  the file format 
7970: 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20  and encoding in 
7980: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 76  the database hav
7990: 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20  e not been set, 
79a0: 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d  .    ** set them
79b0: 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   now..    */.   
79c0: 20 72 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e   reg1 = pParse->
79d0: 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  regRowid = ++pPa
79e0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
79f0: 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65  eg2 = pParse->re
7a00: 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65  gRoot = ++pParse
7a10: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33  ->nMem;.    reg3
7a20: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
7a30: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
7a40: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52  beAddOp3(v, OP_R
7a50: 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  eadCookie, iDb, 
7a60: 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49 4c 45  reg3, BTREE_FILE
7a70: 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73 71  _FORMAT);.    sq
7a80: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
7a90: 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  ee(v, iDb);.    
7aa0: 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
7ab0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
7ac0: 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76 65   reg3); VdbeCove
7ad0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69 6c  rage(v);.    fil
7ae0: 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66  eFormat = (db->f
7af0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65  lags & SQLITE_Le
7b00: 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20  gacyFileFmt)!=0 
7b10: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
7b20: 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d      1 : SQLITE_M
7b30: 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a  AX_FILE_FORMAT;.
7b40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7b50: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
7b60: 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c  ger, fileFormat,
7b70: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
7b80: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7b90: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
7ba0: 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46  Db, BTREE_FILE_F
7bb0: 4f 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a 20 20  ORMAT, reg3);.  
7bc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7bd0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
7be0: 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65 67 33  r, ENC(db), reg3
7bf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7c00: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
7c10: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
7c20: 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49  TREE_TEXT_ENCODI
7c30: 4e 47 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73  NG, reg3);.    s
7c40: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
7c50: 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20  re(v, j1);..    
7c60: 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65  /* This just cre
7c70: 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c  ates a place-hol
7c80: 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68  der record in th
7c90: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
7ca0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68  table..    ** Th
7cb0: 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64  e record created
7cc0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
7cd0: 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20  n anything yet. 
7ce0: 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c   It will be repl
7cf0: 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  aced.    ** by t
7d00: 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e  he real entry in
7d10: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
7d20: 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  at sqlite3EndTab
7d30: 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  le()..    **.   
7d40: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
7d50: 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  r the new entry 
7d60: 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73  is left in regis
7d70: 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52  ter pParse->regR
7d80: 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65  owid..    ** The
7d90: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
7da0: 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  r of the new tab
7db0: 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  le is left in re
7dc0: 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  g pParse->regRoo
7dd0: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  t..    ** The ro
7de0: 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67  wid and root pag
7df0: 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20  e number values 
7e00: 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68  are needed by th
7e10: 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20  e code that.    
7e20: 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  ** sqlite3EndTab
7e30: 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  le will generate
7e40: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65  ..    */.#if !de
7e50: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7e60: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
7e70: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7e80: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
7e90: 20 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20    if( isView || 
7ea0: 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  isVirtual ){.   
7eb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7ec0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
7ed0: 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20  er, 0, reg2);.  
7ee0: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
7ef0: 20 20 20 7b 0a 20 20 20 20 20 20 70 50 61 72 73     {.      pPars
7f00: 65 2d 3e 61 64 64 72 43 72 54 61 62 20 3d 20 73  e->addrCrTab = s
7f10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7f20: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
7f30: 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a  le, iDb, reg2);.
7f40: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7f50: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
7f60: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
7f70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7f80: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
7f90: 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20  wid, 0, reg1);. 
7fa0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7fb0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
7fc0: 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73   0, reg3);.    s
7fd0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7fe0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30  (v, OP_Insert, 0
7ff0: 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20  , reg3, reg1);. 
8000: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
8010: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
8020: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71  _APPEND);.    sq
8030: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
8040: 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20  v, OP_Close);.  
8050: 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28  }..  /* Normal (
8060: 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72  non-error) retur
8070: 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a  n. */.  return;.
8080: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
8090: 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d  r occurs, we jum
80a0: 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f  p here */.begin_
80b0: 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73  table_error:.  s
80c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
80d0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
80e0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  n;.}../*.** This
80f0: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74   macro is used t
8100: 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74  o compare two st
8110: 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d  rings in a case-
8120: 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e  insensitive mann
8130: 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69  er..** It is sli
8140: 67 68 74 6c 79 20 66 61 73 74 65 72 20 74 68 61  ghtly faster tha
8150: 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  n calling sqlite
8160: 33 53 74 72 49 43 6d 70 28 29 20 64 69 72 65 63  3StrICmp() direc
8170: 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64  tly, but.** prod
8180: 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65  uces larger code
8190: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
81a0: 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e   This macro is n
81b0: 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  ot compatible wi
81c0: 74 68 20 74 68 65 20 73 74 72 63 6d 70 28 29 20  th the strcmp() 
81d0: 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65  family. It.** re
81e0: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68  turns true if th
81f0: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72  e two strings ar
8200: 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69  e equal, otherwi
8210: 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65  se false..*/.#de
8220: 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20  fine STRICMP(x, 
8230: 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70  y) (\.sqlite3Upp
8240: 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69  erToLower[*(unsi
8250: 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d  gned char *)(x)]
8260: 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70  ==   \.sqlite3Up
8270: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73  perToLower[*(uns
8280: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29  igned char *)(y)
8290: 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74  ]     \.&& sqlit
82a0: 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c  e3StrICmp((x)+1,
82b0: 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a  (y)+1)==0 )../*.
82c0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c  ** Add a new col
82d0: 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65  umn to the table
82e0: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
82f0: 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a   constructed..**
8300: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
8310: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
8320: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
8330: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
8340: 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  on.** in a CREAT
8350: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
8360: 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  t.  sqlite3Start
8370: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
8380: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
8390: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
83a0: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
83b0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
83c0: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
83d0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
83e0: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  e3AddColumn(Pars
83f0: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
8400: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
8410: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
8420: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75   char *z;.  Colu
8430: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  mn *pCol;.  sqli
8440: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
8450: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d  ->db;.  if( (p =
8460: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
8470: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
8480: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
8490: 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e  COLUMN.  if( p->
84a0: 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69  nCol+1>db->aLimi
84b0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
84c0: 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
84d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
84e0: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
84f0: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20  columns on %s", 
8500: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  p->zName);.    r
8510: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
8520: 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  f.  z = sqlite3N
8530: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
8540: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
8550: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8560: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
8570: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
8580: 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e  ( STRICMP(z, p->
8590: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29  aCol[i].zName) )
85a0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
85b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
85c0: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
85d0: 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b  n name: %s", z);
85e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
85f0: 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
8600: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8610: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
8620: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
8630: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
8640: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
8650: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
8660: 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43  b,p->aCol,(p->nC
8670: 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  ol+8)*sizeof(p->
8680: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aCol[0]));.    i
8690: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
86a0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
86b0: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
86c0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
86d0: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77    p->aCol = aNew
86e0: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26  ;.  }.  pCol = &
86f0: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
8700: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c  ;.  memset(pCol,
8710: 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43   0, sizeof(p->aC
8720: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d  ol[0]));.  pCol-
8730: 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20  >zName = z;. .  
8740: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
8750: 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  o type specified
8760: 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74  , columns have t
8770: 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e  he default affin
8780: 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e  ity.  ** 'NONE'.
8790: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
87a0: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 74  ype specified, t
87b0: 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f  hen sqlite3AddCo
87c0: 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a  lumnType() will.
87d0: 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e    ** be called n
87e0: 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d  ext to set pCol-
87f0: 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63  >affinity correc
8800: 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  tly..  */.  pCol
8810: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
8820: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
8830: 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 31 3b  pCol->szEst = 1;
8840: 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a  .  p->nCol++;.}.
8850: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8860: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
8870: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
8880: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
8890: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
88a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
88b0: 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20  tement.  A "NOT 
88c0: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
88d0: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65   has.** been see
88e0: 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n on a column.  
88f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
8900: 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c  s the notNull fl
8910: 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c  ag on.** the col
8920: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
8930: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
8940: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8950: 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73  3AddNotNull(Pars
8960: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
8970: 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65  nError){.  Table
8980: 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61 72 73   *p;.  p = pPars
8990: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
89a0: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45  if( p==0 || NEVE
89b0: 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72  R(p->nCol<1) ) r
89c0: 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  eturn;.  p->aCol
89d0: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e  [p->nCol-1].notN
89e0: 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ull = (u8)onErro
89f0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e  r;.}../*.** Scan
8a00: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
8a10: 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e   name zType (len
8a20: 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72  gth nType) and r
8a30: 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73  eturn the.** ass
8a40: 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74 79  ociated affinity
8a50: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   type..**.** Thi
8a60: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61  s routine does a
8a70: 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e   case-independen
8a80: 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70  t search of zTyp
8a90: 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75  e for the .** su
8aa0: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
8ab0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e  following table.
8ac0: 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   If one of the s
8ad0: 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20  ubstrings is.** 
8ae0: 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65  found, the corre
8af0: 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74  sponding affinit
8b00: 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  y is returned. I
8b10: 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73  f zType contains
8b20: 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  .** more than on
8b30: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
8b40: 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77  ngs, entries tow
8b50: 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a  ard the top of .
8b60: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b  ** the table tak
8b70: 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20  e priority. For 
8b80: 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70  example, if zTyp
8b90: 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20  e is 'BLOBINT', 
8ba0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  .** SQLITE_AFF_I
8bb0: 4e 54 45 47 45 52 20 69 73 20 72 65 74 75 72 6e  NTEGER is return
8bc0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72  ed..**.** Substr
8bd0: 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69  ing     | Affini
8be0: 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ty.** ----------
8bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8c00: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20  ------.** 'INT' 
8c10: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8c20: 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20  _AFF_INTEGER.** 
8c30: 27 43 48 41 52 27 20 20 20 20 20 20 20 20 7c 20  'CHAR'        | 
8c40: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
8c50: 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20  ** 'CLOB'       
8c60: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
8c70: 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20  XT.** 'TEXT'    
8c80: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8c90: 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20  _TEXT.** 'BLOB' 
8ca0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8cb0: 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41  AFF_NONE.** 'REA
8cc0: 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  L'        | SQLI
8cd0: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27  TE_AFF_REAL.** '
8ce0: 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53  FLOA'        | S
8cf0: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
8d00: 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20 20 20  * 'DOUB'        
8d10: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
8d20: 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20  L.**.** If none 
8d30: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
8d40: 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74  s in the above t
8d50: 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a  able are found,.
8d60: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ** SQLITE_AFF_NU
8d70: 4d 45 52 49 43 20 69 73 20 72 65 74 75 72 6e 65  MERIC is returne
8d80: 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74  d..*/.char sqlit
8d90: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63  e3AffinityType(c
8da0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20  onst char *zIn, 
8db0: 75 38 20 2a 70 73 7a 45 73 74 29 7b 0a 20 20 75  u8 *pszEst){.  u
8dc0: 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72  32 h = 0;.  char
8dd0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8de0: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e  F_NUMERIC;.  con
8df0: 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72 20 3d  st char *zChar =
8e00: 20 30 3b 0a 0a 20 20 69 66 28 20 7a 49 6e 3d 3d   0;..  if( zIn==
8e10: 30 20 29 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  0 ) return aff;.
8e20: 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20    while( zIn[0] 
8e30: 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38  ){.    h = (h<<8
8e40: 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72  ) + sqlite3Upper
8e50: 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26 30  ToLower[(*zIn)&0
8e60: 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b  xff];.    zIn++;
8e70: 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63  .    if( h==(('c
8e80: 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29  '<<24)+('h'<<16)
8e90: 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29  +('a'<<8)+'r') )
8ea0: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {             /*
8eb0: 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61   CHAR */.      a
8ec0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8ed0: 54 45 58 54 3b 0a 20 20 20 20 20 20 7a 43 68 61  TEXT;.      zCha
8ee0: 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c  r = zIn;.    }el
8ef0: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c  se if( h==(('c'<
8f00: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
8f10: 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20  'o'<<8)+'b') ){ 
8f20: 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f        /* CLOB */
8f30: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
8f40: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
8f50: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
8f60: 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c  ('t'<<24)+('e'<<
8f70: 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27  16)+('x'<<8)+'t'
8f80: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45  ) ){       /* TE
8f90: 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  XT */.      aff 
8fa0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
8fb0: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
8fc0: 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28   h==(('b'<<24)+(
8fd0: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
8fe0: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
8ff0: 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20  /* BLOB */.     
9000: 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49     && (aff==SQLI
9010: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c  TE_AFF_NUMERIC |
9020: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
9030: 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20  F_REAL) ){.     
9040: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9050: 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 69 66  F_NONE;.      if
9060: 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20 29 20  ( zIn[0]=='(' ) 
9070: 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23 69 66  zChar = zIn;.#if
9080: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9090: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
90a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
90b0: 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27  =(('r'<<24)+('e'
90c0: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
90d0: 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l')          /* 
90e0: 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20  REAL */.        
90f0: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
9100: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
9110: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9120: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
9130: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66  else if( h==(('f
9140: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
9150: 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20  +('o'<<8)+'a')  
9160: 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20          /* FLOA 
9170: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
9180: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
9190: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
91a0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
91b0: 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  REAL;.    }else 
91c0: 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34  if( h==(('d'<<24
91d0: 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27  )+('o'<<16)+('u'
91e0: 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20  <<8)+'b')       
91f0: 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20     /* DOUB */.  
9200: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
9210: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9220: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
9230: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
9240: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
9250: 65 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46  e if( (h&0x00FFF
9260: 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29  FFF)==(('i'<<16)
9270: 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29  +('n'<<8)+'t') )
9280: 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20  {    /* INT */. 
9290: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
92a0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
92b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
92c0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  }.  }..  /* If p
92d0: 73 7a 45 73 74 20 69 73 20 6e 6f 74 20 4e 55 4c  szEst is not NUL
92e0: 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73 74 69  L, store an esti
92f0: 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69 65 6c  mate of the fiel
9300: 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20 20 2a  d size.  The.  *
9310: 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20 73 63  * estimate is sc
9320: 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  aled so that the
9330: 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74 65   size of an inte
9340: 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20  ger is 1.  */.  
9350: 69 66 28 20 70 73 7a 45 73 74 20 29 7b 0a 20 20  if( pszEst ){.  
9360: 20 20 2a 70 73 7a 45 73 74 20 3d 20 31 3b 20 20    *pszEst = 1;  
9370: 20 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65   /* default size
9380: 20 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74   is approx 4 byt
9390: 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66  es */.    if( af
93a0: 66 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  f<=SQLITE_AFF_NO
93b0: 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  NE ){.      if( 
93c0: 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20 20  zChar ){.       
93d0: 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d   while( zChar[0]
93e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
93f0: 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  ( sqlite3Isdigit
9400: 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20  (zChar[0]) ){.  
9410: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 20            int v 
9420: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
9430: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
9440: 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a 20 20 20  (zChar, &v);.   
9450: 20 20 20 20 20 20 20 20 20 76 20 3d 20 76 2f 34           v = v/4
9460: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   + 1;.          
9470: 20 20 69 66 28 20 76 3e 32 35 35 20 29 20 76 20    if( v>255 ) v 
9480: 3d 20 32 35 35 3b 0a 20 20 20 20 20 20 20 20 20  = 255;.         
9490: 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 76 3b 20     *pszEst = v; 
94a0: 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43  /* BLOB(k), VARC
94b0: 48 41 52 28 6b 29 2c 20 43 48 41 52 28 6b 29 20  HAR(k), CHAR(k) 
94c0: 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a  -> r=(k/4+1) */.
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
94e0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
94f0: 20 20 20 20 20 20 20 20 20 7a 43 68 61 72 2b 2b           zChar++
9500: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9510: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9520: 20 2a 70 73 7a 45 73 74 20 3d 20 35 3b 20 20 20   *pszEst = 5;   
9530: 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43  /* BLOB, TEXT, C
9540: 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70  LOB -> r=5  (app
9550: 72 6f 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a  rox 20 bytes)*/.
9560: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9570: 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  }.  return aff;.
9580: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
9590: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
95a0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
95b0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
95c0: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
95d0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
95e0: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70  tatement.  The p
95f0: 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74  First token is t
9600: 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65  he first.** toke
9610: 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  n in the sequenc
9620: 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74  e of tokens that
9630: 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 79   describe the ty
9640: 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c  pe of the.** col
9650: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
9660: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
9670: 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74 68 65  .   pLast is the
9680: 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69   last token.** i
9690: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20  n the sequence. 
96a0: 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d   Use this inform
96b0: 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75  ation to constru
96c0: 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74  ct a string.** t
96d0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
96e0: 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65   typename of the
96f0: 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72   column and stor
9700: 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a  e that string.**
9710: 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76   in zType..*/ .v
9720: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
9730: 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a  lumnType(Parse *
9740: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
9750: 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Type){.  Table *
9760: 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  p;.  Column *pCo
9770: 6c 3b 0a 0a 20 20 70 20 3d 20 70 50 61 72 73 65  l;..  p = pParse
9780: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
9790: 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52  f( p==0 || NEVER
97a0: 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65  (p->nCol<1) ) re
97b0: 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26  turn;.  pCol = &
97c0: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
97d0: 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
97e0: 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 3b 0a  ol->zType==0 );.
97f0: 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20    pCol->zType = 
9800: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
9810: 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
9820: 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d   pType);.  pCol-
9830: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
9840: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
9850: 70 43 6f 6c 2d 3e 7a 54 79 70 65 2c 20 26 70 43  pCol->zType, &pC
9860: 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 7d 0a 0a 2f  ol->szEst);.}../
9870: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
9880: 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ion is the defau
9890: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
98a0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
98b0: 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  dded column.** o
98c0: 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  f the table curr
98d0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
98e0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
98f0: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78  Default value ex
9900: 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62  pressions must b
9910: 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69  e constant.  Rai
9920: 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  se an exception 
9930: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f  if this.** is no
9940: 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a  t the case..**.*
9950: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9960: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
9970: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
9980: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
9990: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
99a0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
99b0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
99c0: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
99d0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
99e0: 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e   ExprSpan *pSpan
99f0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
9a00: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
9a10: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9a20: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d  Parse->db;.  p =
9a30: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9a40: 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29  le;.  if( p!=0 )
9a50: 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70  {.    pCol = &(p
9a60: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
9a70: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c  ]);.    if( !sql
9a80: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
9a90: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53 70  ntOrFunction(pSp
9aa0: 61 6e 2d 3e 70 45 78 70 72 29 20 29 7b 0a 20 20  an->pExpr) ){.  
9ab0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9ac0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66  Msg(pParse, "def
9ad0: 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f  ault value of co
9ae0: 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74  lumn [%s] is not
9af0: 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20   constant",.    
9b00: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
9b10: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
9b20: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
9b30: 66 20 70 45 78 70 72 20 69 73 20 75 73 65 64 20  f pExpr is used 
9b40: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f  instead of the o
9b50: 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70  riginal, as pExp
9b60: 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  r contains.     
9b70: 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20   ** tokens that 
9b80: 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c  point to volatil
9b90: 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27 73  e memory. The 's
9ba0: 70 61 6e 27 20 6f 66 20 74 68 65 20 65 78 70 72  pan' of the expr
9bb0: 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ession.      ** 
9bc0: 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 70  is required by p
9bd0: 72 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f  ragma table_info
9be0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
9bf0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
9c00: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
9c10: 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  lt);.      pCol-
9c20: 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >pDflt = sqlite3
9c30: 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 70 61  ExprDup(db, pSpa
9c40: 6e 2d 3e 70 45 78 70 72 2c 20 45 58 50 52 44 55  n->pExpr, EXPRDU
9c50: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20  P_REDUCE);.     
9c60: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9c70: 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b  b, pCol->zDflt);
9c80: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 44 66  .      pCol->zDf
9c90: 6c 74 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  lt = sqlite3DbSt
9ca0: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
9cb0: 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a  )pSpan->zStart,.
9cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ce0: 20 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e       (int)(pSpan
9cf0: 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e  ->zEnd - pSpan->
9d00: 7a 53 74 61 72 74 29 29 3b 0a 20 20 20 20 7d 0a  zStart));.    }.
9d10: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
9d20: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 53 70 61  rDelete(db, pSpa
9d30: 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  n->pExpr);.}../*
9d40: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
9d50: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
9d60: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
9d70: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
9d80: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
9d90: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
9da0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
9db0: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
9dc0: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
9dd0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
9de0: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
9df0: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
9e00: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
9e10: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
9e20: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
9e30: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
9e40: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
9e50: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
9e60: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
9e70: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
9e80: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
9e90: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
9ea0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
9eb0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
9ec0: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
9ed0: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
9ee0: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
9ef0: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
9f00: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
9f10: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
9f20: 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62  id.  Set the Tab
9f30: 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c  le.iPKey.** fiel
9f40: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75  d of the table u
9f50: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
9f60: 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65  n to be the inde
9f70: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45  x of the.** INTE
9f80: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
9f90: 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69  column.  Table.i
9fa0: 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d  PKey is set to -
9fb0: 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  1 if there is.**
9fc0: 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d   no INTEGER PRIM
9fd0: 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49  ARY KEY..**.** I
9fe0: 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74  f the key is not
9ff0: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
a000: 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72  ARY KEY, then cr
a010: 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a  eate a unique.**
a020: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b   index for the k
a030: 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73  ey.  No index is
a040: 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54   created for INT
a050: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
a060: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
a070: 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
a080: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a090: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
a0a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
a0b0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f  rList *pList,  /
a0c0: 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20  * List of field 
a0d0: 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65  names to be inde
a0e0: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
a0f0: 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68  rror,      /* Wh
a100: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20  at to do with a 
a110: 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c  uniqueness confl
a120: 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74  ict */.  int aut
a130: 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72  oInc,      /* Tr
a140: 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e  ue if the AUTOIN
a150: 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20  CREMENT keyword 
a160: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
a170: 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20  int sortOrder   
a180: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41    /* SQLITE_SO_A
a190: 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f  SC or SQLITE_SO_
a1a0: 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  DESC */.){.  Tab
a1b0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
a1c0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
a1d0: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b  char *zType = 0;
a1e0: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31  .  int iCol = -1
a1f0: 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d  , i;.  int nTerm
a200: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
a210: 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
a220: 41 42 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72  AB ) goto primar
a230: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66  y_key_exit;.  if
a240: 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73  ( pTab->tabFlags
a250: 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79   & TF_HasPrimary
a260: 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
a270: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
a280: 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65  e, .      "table
a290: 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65   \"%s\" has more
a2a0: 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72   than one primar
a2b0: 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e  y key", pTab->zN
a2c0: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70  ame);.    goto p
a2d0: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
a2e0: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62  .  }.  pTab->tab
a2f0: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50  Flags |= TF_HasP
a300: 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28  rimaryKey;.  if(
a310: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
a320: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   iCol = pTab->nC
a330: 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62  ol - 1;.    pTab
a340: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c  ->aCol[iCol].col
a350: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
a360: 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 7a 54  _PRIMKEY;.    zT
a370: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
a380: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
a390: 20 20 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d    nTerm = 1;.  }
a3a0: 65 6c 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20  else{.    nTerm 
a3b0: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
a3c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
a3d0: 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
a3e0: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
a3f0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
a400: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
a410: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
a420: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
a430: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
a440: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  [iCol].zName)==0
a450: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
a460: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63  ab->aCol[iCol].c
a470: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
a480: 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20  AG_PRIMKEY;.    
a490: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
a4a0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
a4b0: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
a4c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
a4d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a4e0: 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d   }.  if( nTerm==
a4f0: 31 0a 20 20 20 26 26 20 7a 54 79 70 65 20 26 26  1.   && zType &&
a500: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a510: 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22  zType, "INTEGER"
a520: 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72 74 4f  )==0.   && sortO
a530: 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  rder==SQLITE_SO_
a540: 41 53 43 0a 20 20 29 7b 0a 20 20 20 20 70 54 61  ASC.  ){.    pTa
a550: 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b  b->iPKey = iCol;
a560: 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f  .    pTab->keyCo
a570: 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  nf = (u8)onError
a580: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 75  ;.    assert( au
a590: 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f  toInc==0 || auto
a5a0: 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54  Inc==1 );.    pT
a5b0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
a5c0: 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69  autoInc*TF_Autoi
a5d0: 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66  ncrement;.    if
a5e0: 28 20 70 4c 69 73 74 20 29 20 70 50 61 72 73 65  ( pList ) pParse
a5f0: 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d  ->iPkSortOrder =
a600: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72   pList->a[0].sor
a610: 74 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65 20  tOrder;.  }else 
a620: 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23  if( autoInc ){.#
a630: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a640: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
a650: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
a660: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55  rMsg(pParse, "AU
a670: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f  TOINCREMENT is o
a680: 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61  nly allowed on a
a690: 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45  n ".       "INTE
a6a0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
a6b0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
a6c0: 65 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  e{.    Vdbe *v =
a6d0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
a6e0: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
a6f0: 20 20 69 66 28 20 76 20 29 20 70 50 61 72 73 65    if( v ) pParse
a700: 2d 3e 61 64 64 72 53 6b 69 70 50 4b 20 3d 20 73  ->addrSkipPK = s
a710: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
a720: 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20  (v, OP_Noop);.  
a730: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 43 72 65    p = sqlite3Cre
a740: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
a750: 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c   0, 0, 0, pList,
a760: 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20   onError, 0,.   
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a780: 20 20 20 20 20 20 20 20 30 2c 20 73 6f 72 74 4f          0, sortO
a790: 72 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  rder, 0);.    if
a7a0: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ( p ){.      p->
a7b0: 69 64 78 54 79 70 65 20 3d 20 53 51 4c 49 54 45  idxType = SQLITE
a7c0: 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59  _IDXTYPE_PRIMARY
a7d0: 4b 45 59 3b 0a 20 20 20 20 20 20 69 66 28 20 76  KEY;.      if( v
a7e0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
a7f0: 6d 70 48 65 72 65 28 76 2c 20 70 50 61 72 73 65  mpHere(v, pParse
a800: 2d 3e 61 64 64 72 53 6b 69 70 50 4b 29 3b 0a 20  ->addrSkipPK);. 
a810: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d     }.    pList =
a820: 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79   0;.  }..primary
a830: 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c  _key_exit:.  sql
a840: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
a850: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
a860: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b  List);.  return;
a870: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
a880: 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  new CHECK constr
a890: 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c  aint to the tabl
a8a0: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
a8b0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
a8c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
a8d0: 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e  ddCheckConstrain
a8e0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
a8f0: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
a900: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
a910: 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20  xpr *pCheckExpr 
a920: 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78   /* The check ex
a930: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23  pression */.){.#
a940: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a950: 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65  IT_CHECK.  Table
a960: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
a970: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73 71  >pNewTable;.  sq
a980: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a990: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 54  se->db;.  if( pT
a9a0: 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52  ab && !IN_DECLAR
a9b0: 45 5f 56 54 41 42 0a 20 20 20 26 26 20 21 73 71  E_VTAB.   && !sq
a9c0: 6c 69 74 65 33 42 74 72 65 65 49 73 52 65 61 64  lite3BtreeIsRead
a9d0: 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64 62 2d  only(db->aDb[db-
a9e0: 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74 29 0a  >init.iDb].pBt).
a9f0: 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70    ){.    pTab->p
aa00: 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  Check = sqlite3E
aa10: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
aa20: 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65  arse, pTab->pChe
aa30: 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  ck, pCheckExpr);
aa40: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
aa50: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e  >constraintName.
aa60: 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  n ){.      sqlit
aa70: 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
aa80: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  e(pParse, pTab->
aa90: 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73 65 2d  pCheck, &pParse-
aaa0: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2c  >constraintName,
aab0: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   1);.    }.  }el
aac0: 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
aad0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
aae0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
aaf0: 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d  pCheckExpr);.  }
ab00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
ab10: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  e collation func
ab20: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
ab30: 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64   recently parsed
ab40: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a   table column.**
ab50: 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20   to the CollSeq 
ab60: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
ab70: 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65  qlite3AddCollate
ab80: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
ab90: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  se, Token *pToke
aba0: 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  n){.  Table *p;.
abb0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
abc0: 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
abd0: 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64       /* Dequoted
abe0: 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69   name of collati
abf0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20  on sequence */. 
ac00: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
ac10: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
ac20: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
ac30: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
ac40: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20  p->nCol-1;.  db 
ac50: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
ac60: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e  zColl = sqlite3N
ac70: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
ac80: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20   pToken);.  if( 
ac90: 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b  !zColl ) return;
aca0: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c  ..  if( sqlite3L
acb0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
acc0: 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  rse, zColl) ){. 
acd0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
ace0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
acf0: 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d  e(db, p->aCol[i]
ad00: 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e  .zColl);.    p->
ad10: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20  aCol[i].zColl = 
ad20: 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a  zColl;.  .    /*
ad30: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   If the column i
ad40: 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c  s declared as "<
ad50: 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45  name> PRIMARY KE
ad60: 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e  Y COLLATE <type>
ad70: 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61  ",.    ** then a
ad80: 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65  n index may have
ad90: 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e   been created on
ada0: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66   this column bef
adb0: 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  ore the.    ** c
adc0: 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61  ollation type wa
add0: 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74  s added. Correct
ade0: 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74   this if it is t
adf0: 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  he case..    */.
ae00: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e      for(pIdx=p->
ae10: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
ae20: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
ae30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ae40: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20  Idx->nKeyCol==1 
ae50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
ae60: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
ae70: 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64  i ){.        pId
ae80: 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70  x->azColl[0] = p
ae90: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[i].zColl;
aea0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
aeb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
aec0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
aed0: 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  oll);.  }.}../*.
aee0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
aef0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c   returns the col
af00: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
af10: 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74  for database nat
af20: 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f  ive text.** enco
af30: 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20  ding identified 
af40: 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e  by the string zN
af50: 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d  ame, length nNam
af60: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
af70: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
af80: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
af90: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  not available, o
afa0: 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a  r not available.
afb0: 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
afc0: 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69  se native encodi
afd0: 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ng, the collatio
afe0: 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76  n factory is inv
aff0: 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65  oked to.** reque
b000: 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f  st it. If the co
b010: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
b020: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20  does not supply 
b030: 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c  such a sequence,
b040: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75  .** and the sequ
b050: 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  ence is availabl
b060: 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78  e in another tex
b070: 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e  t encoding, then
b080: 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75   that is.** retu
b090: 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  rned instead..**
b0a0: 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f  .** If no versio
b0b0: 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  ns of the reques
b0c0: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73  ted collations s
b0d0: 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69  equence are avai
b0e0: 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f  lable, or.** ano
b0f0: 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72  ther error occur
b100: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
b110: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
b120: 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e   message written
b130: 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e   into.** pParse.
b140: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
b150: 69 6e 65 20 69 73 20 61 20 77 72 61 70 70 65 72  ine is a wrapper
b160: 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46   around sqlite3F
b170: 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54  indCollSeq().  T
b180: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
b190: 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61  nvokes the colla
b1a0: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20  tion factory if 
b1b0: 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74  the named collat
b1c0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ion cannot be fo
b1d0: 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  und.** and gener
b1e0: 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ates an error me
b1f0: 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  ssage..**.** See
b200: 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69   also: sqlite3Fi
b210: 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c  ndCollSeq(), sql
b220: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29  ite3GetCollSeq()
b230: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
b240: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
b250: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
b260: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
b270: 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  me){.  sqlite3 *
b280: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
b290: 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28  .  u8 enc = ENC(
b2a0: 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75  db);.  u8 initbu
b2b0: 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75  sy = db->init.bu
b2c0: 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  sy;.  CollSeq *p
b2d0: 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d  Coll;..  pColl =
b2e0: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
b2f0: 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61  Seq(db, enc, zNa
b300: 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20  me, initbusy);. 
b310: 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26   if( !initbusy &
b320: 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43  & (!pColl || !pC
b330: 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20  oll->xCmp) ){.  
b340: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
b350: 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  3GetCollSeq(pPar
b360: 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20  se, enc, pColl, 
b370: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  zName);.  }..  r
b380: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
b390: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
b3a0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
b3b0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68  ncrement the sch
b3c0: 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a  ema cookie..**.*
b3d0: 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * The schema coo
b3e0: 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  kie is used to d
b3f0: 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68  etermine when th
b400: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
b410: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
b420: 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63  nges.  After eac
b430: 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c  h schema change,
b440: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75   the cookie valu
b450: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57  e.** changes.  W
b460: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69  hen a process fi
b470: 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63  rst reads the sc
b480: 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20  hema it records 
b490: 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20  the.** cookie.  
b4a0: 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e  Thereafter, when
b4b0: 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20  ever it goes to 
b4c0: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
b4d0: 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b  ase,.** it check
b4e0: 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  s the cookie to 
b4f0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  make sure the sc
b500: 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61  hema has not cha
b510: 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74  nged.** since it
b520: 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a   was last read..
b530: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20  **.** This plan 
b540: 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  is not completel
b550: 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20  y bullet-proof. 
b560: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
b570: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  for.** the schem
b580: 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74  a to change mult
b590: 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66  iple times and f
b5a0: 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  or the cookie to
b5b0: 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20   be.** set back 
b5c0: 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20  to prior value. 
b5d0: 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e   But schema chan
b5e0: 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65  ges are infreque
b5f0: 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72  nt.** and the pr
b600: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74  obability of hit
b610: 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f  ting the same co
b620: 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e  okie value is on
b630: 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69  ly.** 1 chance i
b640: 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72  n 2^32.  So we'r
b650: 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a  e safe enough..*
b660: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68  /.void sqlite3Ch
b670: 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73 65  angeCookie(Parse
b680: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44   *pParse, int iD
b690: 62 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  b){.  int r1 = s
b6a0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
b6b0: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
b6c0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b6d0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
b6e0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
b6f0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b700: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
b710: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
b720: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
b730: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
b740: 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  er, db->aDb[iDb]
b750: 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
b760: 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72 31 29 3b 0a  _cookie+1, r1);.
b770: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b780: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
b790: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
b7a0: 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20  SCHEMA_VERSION, 
b7b0: 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  r1);.  sqlite3Re
b7c0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
b7d0: 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a  rse, r1);.}../*.
b7e0: 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e  ** Measure the n
b7f0: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
b800: 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75  ers needed to ou
b810: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a  tput the given.*
b820: 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54  * identifier.  T
b830: 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
b840: 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20  ed includes any 
b850: 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62  quotes used.** b
b860: 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c  ut does not incl
b870: 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72  ude the null ter
b880: 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  minator..**.** T
b890: 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63  he estimate is c
b8a0: 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74  onservative.  It
b8b0: 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
b8c0: 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a   that what is.**
b8d0: 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a   really needed..
b8e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64  */.static int id
b8f0: 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  entLength(const 
b900: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
b910: 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a  n;.  for(n=0; *z
b920: 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20  ; n++, z++){.   
b930: 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20   if( *z=='"' ){ 
b940: 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74  n++; }.  }.  ret
b950: 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a  urn n + 2;.}../*
b960: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61  .** The first pa
b970: 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
b980: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75  nter to an outpu
b990: 74 20 62 75 66 66 65 72 2e 20 54 68 65 20 73 65  t buffer. The se
b9a0: 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74  cond .** paramet
b9b0: 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
b9c0: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68  to an integer th
b9d0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
b9e0: 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68 69  offset at.** whi
b9f0: 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f  ch to write into
ba00: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
ba10: 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
ba20: 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20  n copies the.** 
ba30: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
ba40: 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f  tring pointed to
ba50: 20 62 79 20 74 68 65 20 74 68 69 72 64 20 70 61   by the third pa
ba60: 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65 64  rameter, zSigned
ba70: 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65  Ident,.** to the
ba80: 20 73 70 65 63 69 66 69 65 64 20 6f 66 66 73 65   specified offse
ba90: 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  t in the buffer 
baa0: 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49 64  and updates *pId
bab0: 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f  x to refer.** to
bac0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
bad0: 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 62  after the last b
bae0: 79 74 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f  yte written befo
baf0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
bb00: 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69   .** If the stri
bb10: 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 20  ng zSignedIdent 
bb20: 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
bb30: 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72  y of alpha-numer
bb40: 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  ic.** characters
bb50: 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  , does not begin
bb60: 20 77 69 74 68 20 61 20 64 69 67 69 74 20 61 6e   with a digit an
bb70: 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20  d is not an SQL 
bb80: 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e  keyword,.** then
bb90: 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
bba0: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
bbb0: 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 69 74  er exactly as it
bbc0: 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a   is. Otherwise,.
bbd0: 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64 20  ** it is quoted 
bbe0: 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f  using double-quo
bbf0: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
bc00: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
bc10: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
bc20: 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64   char *zSignedId
bc30: 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ent){.  unsigned
bc40: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20   char *zIdent = 
bc50: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
bc60: 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20  zSignedIdent;.  
bc70: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
bc80: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
bc90: 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ;..  for(j=0; zI
bca0: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
bcb0: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49     if( !sqlite3I
bcc0: 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d  salnum(zIdent[j]
bcd0: 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  ) && zIdent[j]!=
bce0: 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  '_' ) break;.  }
bcf0: 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 73  .  needQuote = s
bd00: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 49  qlite3Isdigit(zI
bd10: 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20  dent[0]).       
bd20: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b       || sqlite3K
bd30: 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e  eywordCode(zIden
bd40: 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20 20 20  t, j)!=TK_ID.   
bd50: 20 20 20 20 20 20 20 20 20 7c 7c 20 7a 49 64 65           || zIde
bd60: 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20 20 20  nt[j]!=0.       
bd70: 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20       || j==0;.. 
bd80: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
bd90: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
bda0: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
bdb0: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  [j]; j++){.    z
bdc0: 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a  [i++] = zIdent[j
bdd0: 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e  ];.    if( zIden
bde0: 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b  t[j]=='"' ) z[i+
bdf0: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20  +] = '"';.  }.  
be00: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
be10: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
be20: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64  z[i] = 0;.  *pId
be30: 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x = i;.}../*.** 
be40: 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54  Generate a CREAT
be50: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
be60: 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  t appropriate fo
be70: 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74  r the given.** t
be80: 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f  able.  Memory to
be90: 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f   hold the text o
bea0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
beb0: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
bec0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
bed0: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
bee0: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
bef0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
bf00: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72  .static char *cr
bf10: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71  eateTableStmt(sq
bf20: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
bf30: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b   *p){.  int i, k
bf40: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  , n;.  char *zSt
bf50: 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70  mt;.  char *zSep
bf60: 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b  , *zSep2, *zEnd;
bf70: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
bf80: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  n = 0;.  for(
bf90: 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20  pCol = p->aCol, 
bfa0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
bfb0: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
bfc0: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
bfd0: 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20  th(pCol->zName) 
bfe0: 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  + 5;.  }.  n += 
bff0: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a  identLength(p->z
c000: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35  Name);.  if( n<5
c010: 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d  0 ){ .    zSep =
c020: 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d   "";.    zSep2 =
c030: 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d   ",";.    zEnd =
c040: 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   ")";.  }else{. 
c050: 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22     zSep = "\n  "
c060: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
c070: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20  \n  ";.    zEnd 
c080: 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e  = "\n)";.  }.  n
c090: 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43   += 35 + 6*p->nC
c0a0: 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71  ol;.  zStmt = sq
c0b0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
c0c0: 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53  (0, n);.  if( zS
c0d0: 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  tmt==0 ){.    db
c0e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
c0f0: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   1;.    return 0
c100: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
c110: 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d  snprintf(n, zStm
c120: 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  t, "CREATE TABLE
c130: 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74   ");.  k = sqlit
c140: 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74  e3Strlen30(zStmt
c150: 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53  );.  identPut(zS
c160: 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d  tmt, &k, p->zNam
c170: 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d  e);.  zStmt[k++]
c180: 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43   = '(';.  for(pC
c190: 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b  ol=p->aCol, i=0;
c1a0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c   i<p->nCol; i++,
c1b0: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74   pCol++){.    st
c1c0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
c1d0: 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d  * const azType[]
c1e0: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20   = {.        /* 
c1f0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
c200: 20 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20     */ " TEXT",. 
c210: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
c220: 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20  _AFF_NONE    */ 
c230: 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  "",.        /* S
c240: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
c250: 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20  C */ " NUM",.   
c260: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
c270: 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20  FF_INTEGER */ " 
c280: 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  INT",.        /*
c290: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
c2a0: 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20      */ " REAL". 
c2b0: 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65     };.    int le
c2c0: 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  n;.    const cha
c2d0: 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73  r *zType;..    s
c2e0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
c2f0: 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20  n-k, &zStmt[k], 
c300: 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20  zSep);.    k += 
c310: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
c320: 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20  &zStmt[k]);.    
c330: 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20  zSep = zSep2;.  
c340: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
c350: 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  , &k, pCol->zNam
c360: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
c370: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53  pCol->affinity-S
c380: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3e  QLITE_AFF_TEXT >
c390: 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  = 0 );.    asser
c3a0: 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  t( pCol->affinit
c3b0: 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  y-SQLITE_AFF_TEX
c3c0: 54 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a  T < ArraySize(az
c3d0: 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73  Type) );.    tes
c3e0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
c3f0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
c400: 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65  F_TEXT );.    te
c410: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
c420: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
c430: 46 46 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 74  FF_NONE );.    t
c440: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
c450: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
c460: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20  AFF_NUMERIC );. 
c470: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
c480: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
c490: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
c4a0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c4b0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
c4c0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
c4d0: 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79   );.    .    zTy
c4e0: 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c  pe = azType[pCol
c4f0: 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c  ->affinity - SQL
c500: 49 54 45 5f 41 46 46 5f 54 45 58 54 5d 3b 0a 20  ITE_AFF_TEXT];. 
c510: 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33     len = sqlite3
c520: 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b  Strlen30(zType);
c530: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f  .    assert( pCo
c540: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
c550: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 0a 20 20  ITE_AFF_NONE .  
c560: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f            || pCo
c570: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c  l->affinity==sql
c580: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
c590: 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a 20 20  (zType, 0) );.  
c5a0: 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b    memcpy(&zStmt[
c5b0: 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b  k], zType, len);
c5c0: 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20  .    k += len;. 
c5d0: 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20     assert( k<=n 
c5e0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
c5f0: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
c600: 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20  zStmt[k], "%s", 
c610: 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  zEnd);.  return 
c620: 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zStmt;.}../*.** 
c630: 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65 78 20  Resize an Index 
c640: 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 4e  object to hold N
c650: 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e 20   columns total. 
c660: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
c670: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
c680: 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  and SQLITE_NOMEM
c690: 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   on an OOM error
c6a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c6b0: 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63  resizeIndexObjec
c6c0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  t(sqlite3 *db, I
c6d0: 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20  ndex *pIdx, int 
c6e0: 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74  N){.  char *zExt
c6f0: 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  ra;.  int nByte;
c700: 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f  .  if( pIdx->nCo
c710: 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72 6e  lumn>=N ) return
c720: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
c730: 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73 52 65  sert( pIdx->isRe
c740: 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 42  sized==0 );.  nB
c750: 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28 63 68  yte = (sizeof(ch
c760: 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 31  ar*) + sizeof(i1
c770: 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45 78  6) + 1)*N;.  zEx
c780: 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tra = sqlite3DbM
c790: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
c7a0: 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45 78 74  yte);.  if( zExt
c7b0: 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ra==0 ) return S
c7c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
c7d0: 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49  emcpy(zExtra, pI
c7e0: 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65  dx->azColl, size
c7f0: 6f 66 28 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e  of(char*)*pIdx->
c800: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78  nColumn);.  pIdx
c810: 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72  ->azColl = (char
c820: 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78  **)zExtra;.  zEx
c830: 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68  tra += sizeof(ch
c840: 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79  ar*)*N;.  memcpy
c850: 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61  (zExtra, pIdx->a
c860: 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28  iColumn, sizeof(
c870: 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75  i16)*pIdx->nColu
c880: 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43  mn);.  pIdx->aiC
c890: 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45  olumn = (i16*)zE
c8a0: 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b  xtra;.  zExtra +
c8b0: 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b  = sizeof(i16)*N;
c8c0: 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61  .  memcpy(zExtra
c8d0: 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  , pIdx->aSortOrd
c8e0: 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  er, pIdx->nColum
c8f0: 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72  n);.  pIdx->aSor
c900: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 7a 45  tOrder = (u8*)zE
c910: 78 74 72 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43  xtra;.  pIdx->nC
c920: 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64  olumn = N;.  pId
c930: 78 2d 3e 69 73 52 65 73 69 7a 65 64 20 3d 20 31  x->isResized = 1
c940: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
c950: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  E_OK;.}../*.** E
c960: 73 74 69 6d 61 74 65 20 74 68 65 20 74 6f 74 61  stimate the tota
c970: 6c 20 72 6f 77 20 77 69 64 74 68 20 66 6f 72 20  l row width for 
c980: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  a table..*/.stat
c990: 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65  ic void estimate
c9a0: 54 61 62 6c 65 57 69 64 74 68 28 54 61 62 6c 65  TableWidth(Table
c9b0: 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e 73 69 67   *pTab){.  unsig
c9c0: 6e 65 64 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a  ned wTable = 0;.
c9d0: 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a    const Column *
c9e0: 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69  pTabCol;.  int i
c9f0: 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e  ;.  for(i=pTab->
ca00: 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54  nCol, pTabCol=pT
ca10: 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69  ab->aCol; i>0; i
ca20: 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a  --, pTabCol++){.
ca30: 20 20 20 20 77 54 61 62 6c 65 20 2b 3d 20 70 54      wTable += pT
ca40: 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20  abCol->szEst;.  
ca50: 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50  }.  if( pTab->iP
ca60: 4b 65 79 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b  Key<0 ) wTable++
ca70: 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52  ;.  pTab->szTabR
ca80: 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
ca90: 73 74 28 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a  st(wTable*4);.}.
caa0: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
cab0: 74 68 65 20 61 76 65 72 61 67 65 20 73 69 7a 65  the average size
cac0: 20 6f 66 20 61 20 72 6f 77 20 66 6f 72 20 61 6e   of a row for an
cad0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
cae0: 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65 49  c void estimateI
caf0: 6e 64 65 78 57 69 64 74 68 28 49 6e 64 65 78 20  ndexWidth(Index 
cb00: 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e  *pIdx){.  unsign
cb10: 65 64 20 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ed wIndex = 0;. 
cb20: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
cb30: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70  Column *aCol = p
cb40: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
cb50: 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  l;.  for(i=0; i<
cb60: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
cb70: 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20 78 20 3d  ++){.    i16 x =
cb80: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
cb90: 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
cba0: 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  x<pIdx->pTable->
cbb0: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64  nCol );.    wInd
cbc0: 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20  ex += x<0 ? 1 : 
cbd0: 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c  aCol[pIdx->aiCol
cbe0: 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20  umn[i]].szEst;. 
cbf0: 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a 49 64 78   }.  pIdx->szIdx
cc00: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
cc10: 45 73 74 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d  Est(wIndex*4);.}
cc20: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65  ../* Return true
cc30: 20 69 66 20 76 61 6c 75 65 20 78 20 69 73 20 66   if value x is f
cc40: 6f 75 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 20  ound any of the 
cc50: 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69  first nCol entri
cc60: 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f  es of aiCol[].*/
cc70: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 43  .static int hasC
cc80: 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20  olumn(const i16 
cc90: 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c  *aiCol, int nCol
cca0: 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c  , int x){.  whil
ccb0: 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20  e( nCol-- > 0 ) 
ccc0: 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b  if( x==*(aiCol++
ccd0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
cce0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
ccf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
cd00: 72 75 6e 73 20 61 74 20 74 68 65 20 65 6e 64 20  runs at the end 
cd10: 6f 66 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  of parsing a CRE
cd20: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
cd30: 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61 73 20  ent that.** has 
cd40: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
cd50: 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6a 6f 62  clause.  The job
cd60: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
cd70: 20 69 73 20 74 6f 20 63 6f 6e 76 65 72 74 20 62   is to convert b
cd80: 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20  oth.** internal 
cd90: 73 63 68 65 6d 61 20 64 61 74 61 20 73 74 72 75  schema data stru
cda0: 63 74 75 72 65 73 20 61 6e 64 20 74 68 65 20 67  ctures and the g
cdb0: 65 6e 65 72 61 74 65 64 20 56 44 42 45 20 63 6f  enerated VDBE co
cdc0: 64 65 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a  de so that they.
cdd0: 2a 2a 20 61 72 65 20 61 70 70 72 6f 70 72 69 61  ** are appropria
cde0: 74 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54  te for a WITHOUT
cdf0: 20 52 4f 57 49 44 20 74 61 62 6c 65 20 69 6e 73   ROWID table ins
ce00: 74 65 61 64 20 6f 66 20 61 20 72 6f 77 69 64 20  tead of a rowid 
ce10: 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65  table..** Change
ce20: 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a  s include:.**.**
ce30: 20 20 20 20 20 28 31 29 20 20 43 6f 6e 76 65 72       (1)  Conver
ce40: 74 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 54  t the OP_CreateT
ce50: 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f  able into an OP_
ce60: 43 72 65 61 74 65 49 6e 64 65 78 2e 20 20 54 68  CreateIndex.  Th
ce70: 65 72 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  ere is.**       
ce80: 20 20 20 6e 6f 20 72 6f 77 69 64 20 62 74 72 65     no rowid btre
ce90: 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  e for a WITHOUT 
cea0: 52 4f 57 49 44 2e 20 20 49 6e 73 74 65 61 64 2c  ROWID.  Instead,
ceb0: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a   the canonical.*
cec0: 2a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20  *          data 
ced0: 73 74 6f 72 61 67 65 20 69 73 20 61 20 63 6f 76  storage is a cov
cee0: 65 72 69 6e 67 20 69 6e 64 65 78 20 62 74 72 65  ering index btre
cef0: 65 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 42  e..**     (2)  B
cf00: 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69  ypass the creati
cf10: 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  on of the sqlite
cf20: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e  _master table en
cf30: 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  try.**          
cf40: 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59 20  for the PRIMARY 
cf50: 4b 45 59 20 61 73 20 74 68 65 20 74 68 65 20 70  KEY as the the p
cf60: 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
cf70: 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20   is now.**      
cf80: 20 20 20 20 69 64 65 6e 74 69 66 69 65 64 20 62      identified b
cf90: 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  y the sqlite_mas
cfa0: 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79 20  ter table entry 
cfb0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  of the table its
cfc0: 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20  elf..**     (3) 
cfd0: 20 53 65 74 20 74 68 65 20 49 6e 64 65 78 2e 74   Set the Index.t
cfe0: 6e 75 6d 20 6f 66 20 74 68 65 20 50 52 49 4d 41  num of the PRIMA
cff0: 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a  RY KEY Index obj
d000: 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  ect in the.**   
d010: 20 20 20 20 20 20 20 73 63 68 65 6d 61 20 74 6f         schema to
d020: 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 72   the rootpage fr
d030: 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  om the main tabl
d040: 65 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53  e..**     (4)  S
d050: 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  et all columns o
d060: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
d070: 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  Y schema object 
d080: 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a  to be NOT NULL..
d090: 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64 64 20  **     (5)  Add 
d0a0: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
d0b0: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
d0c0: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
d0d0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f  t.**          so
d0e0: 20 74 68 61 74 20 74 68 65 20 50 52 49 4d 41 52   that the PRIMAR
d0f0: 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72  Y KEY is a cover
d100: 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20  ing index.  The 
d110: 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20  surplus.**      
d120: 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20      columns are 
d130: 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e  part of KeyInfo.
d140: 6e 58 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20  nXField and are 
d150: 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  not used for.** 
d160: 20 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67           sorting
d170: 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e   or lookup or un
d180: 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e  iqueness checks.
d190: 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65 70  .**     (6)  Rep
d1a0: 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64 20 74  lace the rowid t
d1b0: 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d  ail on all autom
d1c0: 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74  atically generat
d1d0: 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20  ed UNIQUE.**    
d1e0: 20 20 20 20 20 20 69 6e 64 69 63 65 73 20 77 69        indices wi
d1f0: 74 68 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  th the PRIMARY K
d200: 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73  EY columns..*/.s
d210: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 76 65  tatic void conve
d220: 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64  rtToWithoutRowid
d230: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
d240: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
d250: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  ){.  Index *pIdx
d260: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a  ;.  Index *pPk;.
d270: 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e 74    int nPk;.  int
d280: 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33   i, j;.  sqlite3
d290: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d2a0: 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  b;.  Vdbe *v = p
d2b0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20  Parse->pVdbe;.. 
d2c0: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
d2d0: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 6f  OP_CreateTable o
d2e0: 70 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64  pcode that would
d2f0: 20 6e 6f 72 6d 61 6c 6c 79 20 63 72 65 61 74 65   normally create
d300: 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6f 74 2d 70   the.  ** root-p
d310: 61 67 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c  age for the tabl
d320: 65 20 69 6e 74 6f 20 61 20 4f 50 5f 43 72 65 61  e into a OP_Crea
d330: 74 65 49 6e 64 65 78 20 6f 70 63 6f 64 65 2e 20  teIndex opcode. 
d340: 20 54 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   The index.  ** 
d350: 63 72 65 61 74 65 64 20 77 69 6c 6c 20 62 65 63  created will bec
d360: 6f 6d 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ome the PRIMARY 
d370: 4b 45 59 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a  KEY index..  */.
d380: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64    if( pParse->ad
d390: 64 72 43 72 54 61 62 20 29 7b 0a 20 20 20 20 61  drCrTab ){.    a
d3a0: 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 20 20  ssert( v );.    
d3b0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
d3c0: 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72  (v, pParse->addr
d3d0: 43 72 54 61 62 29 2d 3e 6f 70 63 6f 64 65 20 3d  CrTab)->opcode =
d3e0: 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 3b   OP_CreateIndex;
d3f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 79 70 61 73  .  }..  /* Bypas
d400: 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  s the creation o
d410: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
d420: 59 20 62 74 72 65 65 20 61 6e 64 20 74 68 65 20  Y btree and the 
d430: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
d440: 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a  ** table entry..
d450: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
d460: 65 2d 3e 61 64 64 72 53 6b 69 70 50 4b 20 29 7b  e->addrSkipPK ){
d470: 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 20 29  .    assert( v )
d480: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d490: 65 47 65 74 4f 70 28 76 2c 20 70 50 61 72 73 65  eGetOp(v, pParse
d4a0: 2d 3e 61 64 64 72 53 6b 69 70 50 4b 29 2d 3e 6f  ->addrSkipPK)->o
d4b0: 70 63 6f 64 65 20 3d 20 4f 50 5f 47 6f 74 6f 3b  pcode = OP_Goto;
d4c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
d4d0: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
d4e0: 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66  Y index.  Or, if
d4f0: 20 74 68 69 73 20 74 61 62 6c 65 20 77 61 73 20   this table was 
d500: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
d510: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
d520: 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63 72  RY KEY table, cr
d530: 65 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d 41  eate a new PRIMA
d540: 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20  RY KEY index. . 
d550: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   */.  if( pTab->
d560: 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20  iPKey>=0 ){.    
d570: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
d580: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
d590: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
d5a0: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29  nd(pParse, 0, 0)
d5b0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
d5c0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
d5d0: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61   pList->a[0].zNa
d5e0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
d5f0: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
d600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d620: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61           pTab->a
d630: 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d  Col[pTab->iPKey]
d640: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69  .zName);.    pLi
d650: 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  st->a[0].sortOrd
d660: 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b  er = pParse->iPk
d670: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 61  SortOrder;.    a
d680: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
d690: 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62 20 29  NewTable==pTab )
d6a0: 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69  ;.    pPk = sqli
d6b0: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
d6c0: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
d6d0: 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79  pList, pTab->key
d6e0: 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Conf, 0, 0, 0, 0
d6f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 6b 3d 3d  );.    if( pPk==
d700: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
d710: 70 50 6b 2d 3e 69 64 78 54 79 70 65 20 3d 20 53  pPk->idxType = S
d720: 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52  QLITE_IDXTYPE_PR
d730: 49 4d 41 52 59 4b 45 59 3b 0a 20 20 20 20 70 54  IMARYKEY;.    pT
d740: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
d750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b    }else{.    pPk
d760: 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
d770: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
d780: 0a 20 20 7d 0a 20 20 70 50 6b 2d 3e 69 73 43 6f  .  }.  pPk->isCo
d790: 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 61 73  vering = 1;.  as
d7a0: 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a  sert( pPk!=0 );.
d7b0: 20 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65    nPk = pPk->nKe
d7c0: 79 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  yCol;..  /* Make
d7d0: 20 73 75 72 65 20 65 76 65 72 79 20 63 6f 6c 75   sure every colu
d7e0: 6d 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  mn of the PRIMAR
d7f0: 59 20 4b 45 59 20 69 73 20 4e 4f 54 20 4e 55 4c  Y KEY is NOT NUL
d800: 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  L */.  for(i=0; 
d810: 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nPk; i++){.   
d820: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d   pTab->aCol[pPk-
d830: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f  >aiColumn[i]].no
d840: 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 7d 0a 20  tNull = 1;.  }. 
d850: 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c   pPk->uniqNotNul
d860: 6c 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65  l = 1;..  /* The
d870: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
d880: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
d890: 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 20   the table root 
d8a0: 70 61 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74  page */.  pPk->t
d8b0: 6e 75 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  num = pTab->tnum
d8c0: 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
d8d0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
d8e0: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  resentation of a
d8f0: 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64 69 63 65  ll UNIQUE indice
d900: 73 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a  s by converting.
d910: 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 72    ** the final r
d920: 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f  owid column into
d930: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c   one or more col
d940: 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d  umns of the PRIM
d950: 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20  ARY KEY..  */.  
d960: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
d970: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
d980: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
d990: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69      int n;.    i
d9a0: 66 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49  f( IsPrimaryKeyI
d9b0: 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e  ndex(pIdx) ) con
d9c0: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
d9d0: 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b  =n=0; i<nPk; i++
d9e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61  ){.      if( !ha
d9f0: 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69  sColumn(pIdx->ai
da00: 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b  Column, pIdx->nK
da10: 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f  eyCol, pPk->aiCo
da20: 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a  lumn[i]) ) n++;.
da30: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d      }.    if( n=
da40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
da50: 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 20 73  his index is a s
da60: 75 70 65 72 73 65 74 20 6f 66 20 74 68 65 20 70  uperset of the p
da70: 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
da80: 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d      pIdx->nColum
da90: 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  n = pIdx->nKeyCo
daa0: 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  l;.      continu
dab0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
dac0: 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65   resizeIndexObje
dad0: 63 74 28 64 62 2c 20 70 49 64 78 2c 20 70 49 64  ct(db, pIdx, pId
dae0: 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20  x->nKeyCol+n) ) 
daf0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28  return;.    for(
db00: 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65  i=0, j=pIdx->nKe
db10: 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b  yCol; i<nPk; i++
db20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61  ){.      if( !ha
db30: 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69  sColumn(pIdx->ai
db40: 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b  Column, pIdx->nK
db50: 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f  eyCol, pPk->aiCo
db60: 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20  lumn[i]) ){.    
db70: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
db80: 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43  mn[j] = pPk->aiC
db90: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
dba0: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a    pIdx->azColl[j
dbb0: 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b  ] = pPk->azColl[
dbc0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b  i];.        j++;
dbd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
dbe0: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
dbf0: 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e  >nColumn>=pIdx->
dc00: 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20  nKeyCol+n );.   
dc10: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
dc20: 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d  Column>=j );.  }
dc30: 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74  ..  /* Add all t
dc40: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  able columns to 
dc50: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
dc60: 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28  index.  */.  if(
dc70: 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20   nPk<pTab->nCol 
dc80: 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a  ){.    if( resiz
dc90: 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c  eIndexObject(db,
dca0: 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c   pPk, pTab->nCol
dcb0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ) ) return;.    
dcc0: 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20  for(i=0, j=nPk; 
dcd0: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
dce0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
dcf0: 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69  asColumn(pPk->ai
dd00: 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b  Column, j, i) ){
dd10: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
dd20: 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20   j<pPk->nColumn 
dd30: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e  );.        pPk->
dd40: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b  aiColumn[j] = i;
dd50: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a  .        pPk->az
dd60: 43 6f 6c 6c 5b 6a 5d 20 3d 20 22 42 49 4e 41 52  Coll[j] = "BINAR
dd70: 59 22 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b  Y";.        j++;
dd80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
dd90: 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e     assert( pPk->
dda0: 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20  nColumn==j );.  
ddb0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
ddc0: 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c  nCol==j );.  }el
ddd0: 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43 6f  se{.    pPk->nCo
dde0: 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  lumn = pTab->nCo
ddf0: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
de00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
de10: 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74  called to report
de20: 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74   the final ")" t
de30: 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a  hat terminates.*
de40: 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  * a CREATE TABLE
de50: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
de60: 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75  * The table stru
de70: 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72  cture that other
de80: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
de90: 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64   have been build
dea0: 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ing.** is added 
deb0: 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
dec0: 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73  hash tables, ass
ded0: 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20  uming no errors 
dee0: 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64  have.** occurred
def0: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79  ..**.** An entry
df00: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69   for the table i
df10: 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61  s made in the ma
df20: 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69  ster table on di
df30: 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68  sk, unless.** th
df40: 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
df50: 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69  y table or db->i
df60: 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68  nit.busy==1.  Wh
df70: 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  en db->init.busy
df80: 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20  ==1.** it means 
df90: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
dfa0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
dfb0: 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77   table because w
dfc0: 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63  e just.** connec
dfd0: 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ted to the datab
dfe0: 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74  ase or because t
dff0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
e000: 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65   table has.** re
e010: 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20  cently changed, 
e020: 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  so the entry for
e030: 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65   this table alre
e040: 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a  ady exists in.**
e050: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
e060: 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f  er table.  We do
e070: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65   not want to cre
e080: 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a  ate it again..**
e090: 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65  .** If the pSele
e0a0: 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ct argument is n
e0b0: 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ot NULL, it mean
e0c0: 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
e0d0: 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65  ine.** was calle
e0e0: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61  d to create a ta
e0f0: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72  ble generated fr
e100: 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45  om a .** "CREATE
e110: 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45   TABLE ... AS SE
e120: 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d  LECT ..." statem
e130: 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ent.  The column
e140: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
e150: 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20   new table will 
e160: 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74  match the result
e170: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
e180: 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
e190: 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50  te3EndTable(.  P
e1a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
e1b0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
e1c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
e1d0: 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20  en *pCons,      
e1e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20       /* The ',' 
e1f0: 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20  token after the 
e200: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e  last column defn
e210: 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  . */.  Token *pE
e220: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd,            /
e230: 2a 20 54 68 65 20 27 29 27 20 62 65 66 6f 72 65  * The ')' before
e240: 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20   options in the 
e250: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a  CREATE TABLE */.
e260: 20 20 75 38 20 74 61 62 4f 70 74 73 2c 20 20 20    u8 tabOpts,   
e270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
e280: 72 61 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73  ra table options
e290: 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a  . Usually 0. */.
e2a0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
e2b0: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c  t         /* Sel
e2c0: 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41  ect from a "CREA
e2d0: 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  TE ... AS SELECT
e2e0: 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  " */.){.  Table 
e2f0: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
e300: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74      /* The new t
e310: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
e320: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
e330: 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62  db; /* The datab
e340: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
e350: 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e370: 20 44 61 74 61 62 61 73 65 20 69 6e 20 77 68 69   Database in whi
e380: 63 68 20 74 68 65 20 74 61 62 6c 65 20 6c 69 76  ch the table liv
e390: 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  es */.  Index *p
e3a0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
e3b0: 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20    /* An implied 
e3c0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  index of the tab
e3d0: 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 45  le */..  if( (pE
e3e0: 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
e3f0: 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  ==0) || db->mall
e400: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
e410: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20  return;.  }.  p 
e420: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
e430: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
e440: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
e450: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
e460: 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20  usy || !pSelect 
e470: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
e480: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
e490: 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61   1 it means we a
e4a0: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53  re reading the S
e4b0: 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20  QL off the.  ** 
e4c0: 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20  "sqlite_master" 
e4d0: 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  or "sqlite_temp_
e4e0: 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
e4f0: 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20   the disk..  ** 
e500: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
e510: 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69  to the disk agai
e520: 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
e530: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
e540: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  .  ** for the ta
e550: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ble from the db-
e560: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69  >init.newTnum fi
e570: 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20  eld.  (The page 
e580: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75  number.  ** shou
e590: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74  ld have been put
e5a0: 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71   there by the sq
e5b0: 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69  liteOpenCb routi
e5c0: 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ne.).  */.  if( 
e5d0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
e5e0: 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64  .    p->tnum = d
e5f0: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
e600: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69  .  }..  /* Speci
e610: 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  al processing fo
e620: 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
e630: 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20  Tables */.  if( 
e640: 74 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69 74  tabOpts & TF_Wit
e650: 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20 20  houtRowid ){.   
e660: 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67   if( (p->tabFlag
e670: 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
e680: 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 73  ment) ){.      s
e690: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e6a0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
e6b0: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
e6c0: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 57  not allowed on W
e6d0: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
e6e0: 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74  les");.      ret
e6f0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
e700: 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20  f( (p->tabFlags 
e710: 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b  & TF_HasPrimaryK
e720: 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ey)==0 ){.      
e730: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e740: 70 50 61 72 73 65 2c 20 22 50 52 49 4d 41 52 59  pParse, "PRIMARY
e750: 20 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e 20   KEY missing on 
e760: 74 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e  table %s", p->zN
e770: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
e780: 0a 20 20 20 20 20 20 70 2d 3e 74 61 62 46 6c 61  .      p->tabFla
e790: 67 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74  gs |= TF_Without
e7a0: 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e  Rowid;.      con
e7b0: 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77  vertToWithoutRow
e7c0: 69 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  idTable(pParse, 
e7d0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
e7e0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
e7f0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
e800: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  p->pSchema);..#i
e810: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e820: 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73  T_CHECK.  /* Res
e830: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c  olve names in al
e840: 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  l CHECK constrai
e850: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  nt expressions..
e860: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43    */.  if( p->pC
e870: 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  heck ){.    sqli
e880: 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65  te3ResolveSelfRe
e890: 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20  ference(pParse, 
e8a0: 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30  p, NC_IsCheck, 0
e8b0: 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20  , p->pCheck);.  
e8c0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
e8d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
e8e0: 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a  _CHECK) */..  /*
e8f0: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76   Estimate the av
e900: 65 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66  erage row size f
e910: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  or the table and
e920: 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64   for all implied
e930: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73   indices */.  es
e940: 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68  timateTableWidth
e950: 28 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  (p);.  for(pIdx=
e960: 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
e970: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
e980: 74 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65  t){.    estimate
e990: 49 6e 64 65 78 57 69 64 74 68 28 70 49 64 78 29  IndexWidth(pIdx)
e9a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
e9b0: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
e9c0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
e9d0: 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
e9e0: 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
e9f0: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
ea00: 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
ea10: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  atabase..  **.  
ea20: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
ea30: 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
ea40: 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
ea50: 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
ea60: 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
ea70: 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
ea80: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
ea90: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
eaa0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
eab0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
eac0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
ead0: 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f  har *zType;    /
eae0: 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62  * "view" or "tab
eaf0: 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  le" */.    char 
eb00: 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56  *zType2;   /* "V
eb10: 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20  IEW" or "TABLE" 
eb20: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
eb30: 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  mt;    /* Text o
eb40: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
eb50: 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45  LE or CREATE VIE
eb60: 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  W statement */..
eb70: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
eb80: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
eb90: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d      if( NEVER(v=
eba0: 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  =0) ) return;.. 
ebb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ebc0: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
ebd0: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20  , 0);..    /* . 
ebe0: 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65     ** Initialize
ebf0: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e   zType for the n
ec00: 65 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65  ew view or table
ec10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ec20: 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
ec30: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
ec40: 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
ec50: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62      zType = "tab
ec60: 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  le";.      zType
ec70: 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66  2 = "TABLE";.#if
ec80: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ec90: 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b  _VIEW.    }else{
eca0: 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
ecb0: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
ecc0: 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20  = "view";.      
ecd0: 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b  zType2 = "VIEW";
ece0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
ecf0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
ed00: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
ed10: 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
ed20: 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
ed30: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
ed40: 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
ed50: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
ed60: 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
ed70: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
ed80: 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
ed90: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  s in register pP
eda0: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20  arse->regRoot.. 
edb0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63     **.    ** Onc
edc0: 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  e the SELECT has
edd0: 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73   been coded by s
ede0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20  qlite3Select(), 
edf0: 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a  it is in a.    *
ee00: 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65  * suitable state
ee10: 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68   to query for th
ee20: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
ee30: 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75  nd types to be u
ee40: 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  sed.    ** by th
ee50: 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20  e new table..   
ee60: 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61   **.    ** A sha
ee70: 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d  red-cache write-
ee80: 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
ee90: 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ired to write to
eea0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a   the new table,.
eeb0: 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65      ** as a sche
eec0: 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76  ma-lock must hav
eed0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  e already been o
eee0: 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74  btained to creat
eef0: 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20  e it. Since.    
ef00: 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  ** a schema-lock
ef10: 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74   excludes all ot
ef20: 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65  her database use
ef30: 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  rs, the write-lo
ef40: 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20  ck would.    ** 
ef50: 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20  be redundant..  
ef60: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
ef70: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65  lect ){.      Se
ef80: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
ef90: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c       Table *pSel
efa0: 54 61 62 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  Tab;..      asse
efb0: 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d  rt(pParse->nTab=
efc0: 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  =1);.      sqlit
efd0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
efe0: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
eff0: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
f000: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
f010: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
f020: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53  5(v, OPFLAG_P2IS
f030: 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61 72  REG);.      pPar
f040: 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
f050: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
f060: 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
f070: 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a   SRT_Table, 1);.
f080: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
f090: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
f0a0: 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ect, &dest);.   
f0b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
f0c0: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
f0d0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
f0e0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
f0f0: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  ){.        pSelT
f100: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
f110: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
f120: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a  arse, pSelect);.
f130: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c          if( pSel
f140: 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Tab==0 ) return;
f150: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f160: 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20   p->aCol==0 );. 
f170: 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d         p->nCol =
f180: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
f190: 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20          p->aCol 
f1a0: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
f1b0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
f1c0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
f1d0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
f1e0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  l = 0;.        s
f1f0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
f200: 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a  e(db, pSelTab);.
f210: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
f220: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
f230: 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
f240: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74  of the CREATE st
f250: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
f260: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
f270: 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61      zStmt = crea
f280: 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20  teTableStmt(db, 
f290: 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
f2a0: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64       Token *pEnd
f2b0: 32 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26 70  2 = tabOpts ? &p
f2c0: 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
f2d0: 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  n : pEnd;.      
f2e0: 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32 2d  n = (int)(pEnd2-
f2f0: 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61  >z - pParse->sNa
f300: 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20  meToken.z);.    
f310: 20 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b 30    if( pEnd2->z[0
f320: 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70 45  ]!=';' ) n += pE
f330: 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 53  nd2->n;.      zS
f340: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
f350: 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20  intf(db, .      
f360: 20 20 20 20 22 43 52 45 41 54 45 20 25 73 20 25      "CREATE %s %
f370: 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c  .*s", zType2, n,
f380: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
f390: 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20  ken.z.      );. 
f3a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73     }..    /* A s
f3b0: 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f  lot for the reco
f3c0: 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  rd has already b
f3d0: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  een allocated in
f3e0: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c   the .    ** SQL
f3f0: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
f400: 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20  .  We just need 
f410: 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73  to update that s
f420: 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20  lot with all.   
f430: 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   ** the informat
f440: 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63  ion we've collec
f450: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
f460: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
f470: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
f480: 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22   "UPDATE %Q.%s "
f490: 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74  .         "SET t
f4a0: 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25  ype='%s', name=%
f4b0: 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20  Q, tbl_name=%Q, 
f4c0: 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71  rootpage=#%d, sq
f4d0: 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57  l=%Q ".       "W
f4e0: 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c  HERE rowid=#%d",
f4f0: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
f500: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
f510: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
f520: 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20      zType,.     
f530: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
f540: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
f550: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
f560: 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20  ,.      zStmt,. 
f570: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67       pParse->reg
f580: 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20  Rowid.    );.   
f590: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f5a0: 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73  b, zStmt);.    s
f5b0: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
f5c0: 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
f5d0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f5e0: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
f5f0: 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ENT.    /* Check
f600: 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
f610: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
f620: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
f630: 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  table for.    **
f640: 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f   keeping track o
f650: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
f660: 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  keys..    */.   
f670: 20 69 66 28 20 70 2d 3e 74 61 62 46 6c 61 67 73   if( p->tabFlags
f680: 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
f690: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 44 62 20  ent ){.      Db 
f6a0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
f6b0: 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  iDb];.      asse
f6c0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
f6d0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
f6e0: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20  Db, 0) );.      
f6f0: 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
f700: 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a  ->pSeqTab==0 ){.
f710: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e          sqlite3N
f720: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
f730: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  e,.          "CR
f740: 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71  EATE TABLE %Q.sq
f750: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61  lite_sequence(na
f760: 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20  me,seq)",.      
f770: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20      pDb->zName. 
f780: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
f790: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
f7a0: 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65      /* Reparse e
f7b0: 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64  verything to upd
f7c0: 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
f7d0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
f7e0: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
f7f0: 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
f800: 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20  aOp(v, iDb,.    
f810: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
f820: 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e  rintf(db, "tbl_n
f830: 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70  ame='%q' AND typ
f840: 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20 70  e!='trigger'", p
f850: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a  ->zName));.  }..
f860: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61  .  /* Add the ta
f870: 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65  ble to the in-me
f880: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
f890: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
f8a0: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
f8b0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
f8c0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  .    Table *pOld
f8d0: 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  ;.    Schema *pS
f8e0: 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65  chema = p->pSche
f8f0: 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
f900: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
f910: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
f920: 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  0) );.    pOld =
f930: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
f940: 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  rt(&pSchema->tbl
f950: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a  Hash, p->zName,.
f960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f970: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
f980: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
f990: 7a 4e 61 6d 65 29 2c 70 29 3b 0a 20 20 20 20 69  zName),p);.    i
f9a0: 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20  f( pOld ){.     
f9b0: 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64   assert( p==pOld
f9c0: 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
f9d0: 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
f9e0: 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72  inside HashInser
f9f0: 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d  t() */.      db-
fa00: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
fa10: 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  1;.      return;
fa20: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
fa30: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
fa40: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
fa50: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
fa60: 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65  Changes;..#ifnde
fa70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
fa80: 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28  TERTABLE.    if(
fa90: 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a   !p->pSelect ){.
faa0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
fab0: 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
fac0: 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e   char *)pParse->
fad0: 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20  sNameToken.z;.  
fae0: 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20      int nName;. 
faf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
fb00: 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26  elect && pCons &
fb10: 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  & pEnd );.      
fb20: 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20  if( pCons->z==0 
fb30: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73  ){.        pCons
fb40: 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d   = pEnd;.      }
fb50: 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28  .      nName = (
fb60: 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72  int)((const char
fb70: 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e   *)pCons->z - zN
fb80: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  ame);.      p->a
fb90: 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33  ddColOffset = 13
fba0: 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68   + sqlite3Utf8Ch
fbb0: 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61  arLen(zName, nNa
fbc0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  me);.    }.#endi
fbd0: 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  f.  }.}..#ifndef
fbe0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
fbf0: 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  W./*.** The pars
fc00: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
fc10: 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
fc20: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
fc30: 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
fc40: 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20  te3CreateView(. 
fc50: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
fc60: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
fc70: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
fc80: 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20  Token *pBegin,  
fc90: 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
fca0: 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
fcb0: 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ns the statement
fcc0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
fcd0: 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me1,     /* The 
fce0: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
fcf0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
fd00: 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
fd10: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
fd20: 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
fd30: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
fd40: 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
fd50: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
fd60: 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
fd70: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
fd80: 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
fd90: 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  w view */.  int 
fda0: 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  isTemp,        /
fdb0: 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d  * TRUE for a TEM
fdc0: 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20  PORARY view */. 
fdd0: 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20   int noErr      
fde0: 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20      /* Suppress 
fdf0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
fe00: 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65  f VIEW already e
fe10: 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  xists */.){.  Ta
fe20: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  ble *p;.  int n;
fe30: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
fe40: 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
fe50: 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a    DbFixer sFix;.
fe60: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
fe70: 20 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20   0;.  int iDb;. 
fe80: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
fe90: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
fea0: 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30  ( pParse->nVar>0
feb0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
fec0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
fed0: 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20  "parameters are 
fee0: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76  not allowed in v
fef0: 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c 69  iews");.    sqli
ff00: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
ff10: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
ff20: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
ff30: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
ff40: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
ff50: 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70  , pName2, isTemp
ff60: 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a  , 1, 0, noErr);.
ff70: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
ff80: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
ff90: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
ffa0: 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
ffb0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
ffc0: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b, pSelect);.   
ffd0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
ffe0: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
fff0: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
10000 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
10010 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  );.  iDb = sqlit
10020 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
10030 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
10040 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  .  sqlite3FixIni
10050 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
10060 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e   iDb, "view", pN
10070 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ame);.  if( sqli
10080 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
10090 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a  ix, pSelect) ){.
100a0 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
100b0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
100c0 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
100d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
100e0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
100f0 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61  ntire SELECT sta
10100 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
10110 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
10120 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72  ** This will for
10130 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e  ce all the Expr.
10140 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74  token.z values t
10150 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
10160 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
10170 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e  rather than poin
10180 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73  t to the input s
10190 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65  tring - which me
101a0 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ans that.  ** th
101b0 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20  ey will persist 
101c0 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
101d0 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  t sqlite3_exec()
101e0 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20   call returns.. 
101f0 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74   */.  p->pSelect
10200 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
10210 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c  Dup(db, pSelect,
10220 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
10230 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
10240 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
10250 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ect);.  if( db->
10260 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
10270 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
10280 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
10290 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  busy ){.    sqli
102a0 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
102b0 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
102c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
102d0 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
102e0 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
102f0 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
10300 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
10310 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
10320 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
10330 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69  >sLastToken;.  i
10340 66 28 20 41 4c 57 41 59 53 28 73 45 6e 64 2e 7a  f( ALWAYS(sEnd.z
10350 5b 30 5d 21 3d 30 29 20 26 26 20 73 45 6e 64 2e  [0]!=0) && sEnd.
10360 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
10370 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
10380 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
10390 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  = 0;.  n = (int)
103a0 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e  (sEnd.z - pBegin
103b0 2d 3e 7a 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67  ->z);.  z = pBeg
103c0 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
103d0 41 4c 57 41 59 53 28 6e 3e 30 29 20 26 26 20 73  ALWAYS(n>0) && s
103e0 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
103f0 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  n-1]) ){ n--; }.
10400 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d    sEnd.z = &z[n-
10410 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31  1];.  sEnd.n = 1
10420 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69  ;..  /* Use sqli
10430 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f  te3EndTable() to
10440 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f   add the view to
10450 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
10460 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ER table */.  sq
10470 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50  lite3EndTable(pP
10480 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20  arse, 0, &sEnd, 
10490 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b  0, 0);.  return;
104a0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
104b0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
104c0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
104d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
104e0 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
104f0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
10500 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65  TABLE)./*.** The
10510 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
10520 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c   pTable is reall
10530 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20  y a VIEW.  Fill 
10540 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  in the names of.
10550 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  ** the columns o
10560 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68  f the view in th
10570 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75  e pTable structu
10580 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  re.  Return the 
10590 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72  number.** of err
105a0 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  ors.  If an erro
105b0 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20  r is seen leave 
105c0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
105d0 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
105e0 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
105f0 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
10600 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61  Names(Parse *pPa
10610 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
10620 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53  le){.  Table *pS
10630 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61  elTab;   /* A fa
10640 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68  ke table from wh
10650 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20 72  ich we get the r
10660 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53  esult set */.  S
10670 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20  elect *pSel;    
10680 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20   /* Copy of the 
10690 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c  SELECT that impl
106a0 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 20  ements the view 
106b0 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  */.  int nErr = 
106c0 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  0;     /* Number
106d0 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75   of errors encou
106e0 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ntered */.  int 
106f0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
10700 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c   Temporarily hol
10710 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ds the number of
10720 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65   cursors assigne
10730 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
10740 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10750 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
10760 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c  nnection for mal
10770 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  loc errors */.  
10780 69 6e 74 20 28 2a 78 41 75 74 68 29 28 76 6f 69  int (*xAuth)(voi
10790 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61  d*,int,const cha
107a0 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  r*,const char*,c
107b0 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
107c0 20 63 68 61 72 2a 29 3b 0a 0a 20 20 61 73 73 65   char*);..  asse
107d0 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23  rt( pTable );..#
107e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
107f0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
10800 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 74 61    if( sqlite3Vta
10810 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61  bCallConnect(pPa
10820 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a  rse, pTable) ){.
10830 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10840 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
10850 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
10860 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ble) ) return 0;
10870 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
10880 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
10890 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76  W.  /* A positiv
108a0 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65  e nCol means the
108b0 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66   columns names f
108c0 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65  or this view are
108d0 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e  .  ** already kn
108e0 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  own..  */.  if( 
108f0 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29  pTable->nCol>0 )
10900 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
10910 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   A negative nCol
10920 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61   is a special ma
10930 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61  rker meaning tha
10940 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  t we are current
10950 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  ly.  ** trying t
10960 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
10970 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20  lumn names.  If 
10980 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f  we enter this ro
10990 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20  utine with.  ** 
109a0 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c  a negative nCol,
109b0 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72   it means two or
109c0 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d   more views form
109d0 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68   a loop, like th
109e0 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
109f0 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e    CREATE VIEW on
10a00 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  e AS SELECT * FR
10a10 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20  OM two;.  **    
10a20 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f   CREATE VIEW two
10a30 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
10a40 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  M one;.  **.  **
10a50 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65   Actually, the e
10a60 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f  rror above is no
10a70 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74  w caught prior t
10a80 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20  o reaching this 
10a90 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20  point..  ** But 
10aa0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  the following te
10ab0 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f  st is still impo
10ac0 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73  rtant as it does
10ad0 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e   come up.  ** in
10ae0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
10af0 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43    ** .  **     C
10b00 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e  REATE TABLE main
10b10 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20  .ex1(a);.  **   
10b20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 56 49    CREATE TEMP VI
10b30 45 57 20 65 78 31 20 41 53 20 53 45 4c 45 43 54  EW ex1 AS SELECT
10b40 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a   a FROM ex1;.  *
10b50 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  *     SELECT * F
10b60 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20  ROM temp.ex1;.  
10b70 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
10b80 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73  >nCol<0 ){.    s
10b90 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
10ba0 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20  Parse, "view %s 
10bb0 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65  is circularly de
10bc0 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e  fined", pTable->
10bd0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
10be0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 1;.  }.  asse
10bf0 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  rt( pTable->nCol
10c00 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  >=0 );..  /* If 
10c10 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
10c20 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65   it means we nee
10c30 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
10c40 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20   table names..  
10c50 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
10c60 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
10c70 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
10c80 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  t() will expand 
10c90 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65  any.  ** "*" ele
10ca0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73  ments in the res
10cb0 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20  ults set of the 
10cc0 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73  view and will as
10cd0 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a  sign cursors.  *
10ce0 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74  * to the element
10cf0 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  s of the FROM cl
10d00 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f  ause.  But we do
10d10 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20   not want these 
10d20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20  changes.  ** to 
10d30 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53  be permanent.  S
10d40 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  o the computatio
10d50 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63  n is done on a c
10d60 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
10d70 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  T.  ** statement
10d80 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
10d90 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61  e view..  */.  a
10da0 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70  ssert( pTable->p
10db0 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c  Select );.  pSel
10dc0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
10dd0 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  Dup(db, pTable->
10de0 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69  pSelect, 0);.  i
10df0 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 75  f( pSel ){.    u
10e00 38 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64  8 enableLookasid
10e10 65 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  e = db->lookasid
10e20 65 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20  e.bEnabled;.    
10e30 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  n = pParse->nTab
10e40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63  ;.    sqlite3Src
10e50 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
10e60 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  s(pParse, pSel->
10e70 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c  pSrc);.    pTabl
10e80 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  e->nCol = -1;.  
10e90 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
10ea0 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 23 69  bEnabled = 0;.#i
10eb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10ec0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
10ed0 20 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e      xAuth = db->
10ee0 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78  xAuth;.    db->x
10ef0 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53  Auth = 0;.    pS
10f00 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
10f10 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
10f20 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a  (pParse, pSel);.
10f30 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20      db->xAuth = 
10f40 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20  xAuth;.#else.   
10f50 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
10f60 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
10f70 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
10f80 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 62  );.#endif.    db
10f90 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
10fa0 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65 4c 6f 6f  bled = enableLoo
10fb0 6b 61 73 69 64 65 3b 0a 20 20 20 20 70 50 61 72  kaside;.    pPar
10fc0 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20  se->nTab = n;.  
10fd0 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b    if( pSelTab ){
10fe0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10ff0 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29  Table->aCol==0 )
11000 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
11010 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  nCol = pSelTab->
11020 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62  nCol;.      pTab
11030 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54  le->aCol = pSelT
11040 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
11050 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
11060 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  0;.      pSelTab
11070 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
11080 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
11090 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62  able(db, pSelTab
110a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
110b0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
110c0 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
110d0 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20  Table->pSchema) 
110e0 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  );.      pTable-
110f0 3e 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 20  >pSchema->flags 
11100 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  |= DB_UnresetVie
11110 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ws;.    }else{. 
11120 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f       pTable->nCo
11130 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72  l = 0;.      nEr
11140 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  r++;.    }.    s
11150 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
11160 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20  te(db, pSel);.  
11170 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72  } else {.    nEr
11180 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  r++;.  }.#endif 
11190 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
111a0 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  IEW */.  return 
111b0 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66  nErr;  .}.#endif
111c0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
111d0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
111e0 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
111f0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
11200 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  BLE) */..#ifndef
11210 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
11220 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  W./*.** Clear th
11230 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
11240 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69  rom every VIEW i
11250 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a  n database idx..
11260 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
11270 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
11280 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  l(sqlite3 *db, i
11290 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45  nt idx){.  HashE
112a0 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74  lem *i;.  assert
112b0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
112c0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78  utexHeld(db, idx
112d0 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44  , 0) );.  if( !D
112e0 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
112f0 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
11300 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b  Views) ) return;
11310 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
11320 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44  ashFirst(&db->aD
11330 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[idx].pSchema->
11340 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71  tblHash); i;i=sq
11350 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
11360 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
11370 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
11380 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
11390 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
113a0 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65        sqliteDele
113b0 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
113c0 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70  , pTab);.      p
113d0 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
113e0 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20       pTab->nCol 
113f0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
11400 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79   DbClearProperty
11410 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
11420 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65  esetViews);.}.#e
11430 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c  lse.# define sql
11440 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
11450 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  A,B).#endif /* S
11460 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
11470 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
11480 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
11490 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f  d by the VDBE to
114a0 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65   adjust the inte
114b0 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75  rnal schema.** u
114c0 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68  sed by SQLite wh
114d0 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  en the btree lay
114e0 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65  er moves a table
114f0 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a   root page. The.
11500 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20  ** root-page of 
11510 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
11520 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
11530 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f   has changed fro
11540 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54  m iFrom.** to iT
11550 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20  o..**.** Ticket 
11560 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62  #1728:  The symb
11570 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73  ol table might s
11580 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66  till contain inf
11590 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74  ormation.** on t
115a0 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64  ables and/or ind
115b0 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68  ices that are th
115c0 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  e process of bei
115d0 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49  ng deleted..** I
115e0 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b  f you are unluck
115f0 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  y, one of those 
11600 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20  deleted indices 
11610 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a  or tables might.
11620 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ** have the same
11630 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72   rootpage number
11640 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62   as the real tab
11650 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74  le or index that
11660 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76   is.** being mov
11670 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f  ed.  So we canno
11680 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67  t stop searching
11690 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74   after the first
116a0 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75   match .** becau
116b0 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  se the first mat
116c0 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20  ch might be for 
116d0 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74  one of the delet
116e0 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72  ed indices.** or
116f0 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20   tables and not 
11700 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  the table/index 
11710 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79  that is actually
11720 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a   being moved..**
11730 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75   We must continu
11740 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  e looping until 
11750 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69  all tables and i
11760 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72  ndices with.** r
11770 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68  ootpage==iFrom h
11780 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74  ave been convert
11790 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f  ed to have a roo
117a0 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20  tpage of iTo.** 
117b0 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
117c0 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67  ertain that we g
117d0 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65  ot the right one
117e0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
117f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
11800 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  UUM.void sqlite3
11810 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71  RootPageMoved(sq
11820 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
11830 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  Db, int iFrom, i
11840 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45  nt iTo){.  HashE
11850 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61  lem *pElem;.  Ha
11860 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20  sh *pHash;.  Db 
11870 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
11880 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
11890 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
118a0 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26   0) );.  pDb = &
118b0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
118c0 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53  pHash = &pDb->pS
118d0 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a  chema->tblHash;.
118e0 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
118f0 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73  teHashFirst(pHas
11900 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
11910 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
11920 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62  pElem)){.    Tab
11930 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
11940 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
11950 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
11960 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
11970 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20       pTab->tnum 
11980 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  = iTo;.    }.  }
11990 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d  .  pHash = &pDb-
119a0 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
119b0 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  h;.  for(pElem=s
119c0 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
119d0 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
119e0 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
119f0 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
11a00 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71  Index *pIdx = sq
11a10 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
11a20 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  em);.    if( pId
11a30 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  x->tnum==iFrom )
11a40 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e  {.      pIdx->tn
11a50 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a  um = iTo;.    }.
11a60 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
11a70 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74  .** Write code t
11a80 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c  o erase the tabl
11a90 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
11aa0 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74   iTable from dat
11ab0 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c  abase iDb..** Al
11ac0 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f  so write code to
11ad0 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69   modify the sqli
11ae0 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
11af0 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  and internal sch
11b00 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74  ema.** if a root
11b10 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72  -page of another
11b20 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20   table is moved 
11b30 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79  by the btree-lay
11b40 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61  er whilst.** era
11b50 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69  sing iTable (thi
11b60 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
11b70 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
11b80 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a   database)..*/ .
11b90 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
11ba0 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73  royRootPage(Pars
11bb0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
11bc0 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b  Table, int iDb){
11bd0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
11be0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
11bf0 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20  se);.  int r1 = 
11c00 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
11c10 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
11c20 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11c30 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54  , OP_Destroy, iT
11c40 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a  able, r1, iDb);.
11c50 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
11c60 74 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64  t(pParse);.#ifnd
11c70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11c80 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f  UTOVACUUM.  /* O
11c90 50 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73  P_Destroy stores
11ca0 20 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72   an in integer r
11cb0 31 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67  1. If this integ
11cc0 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  er.  ** is non-z
11cd0 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ero, then it is 
11ce0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
11cf0 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20  mber of a table 
11d00 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f  moved to.  ** lo
11d10 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54  cation iTable. T
11d20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
11d30 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73  e modifies the s
11d40 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
11d50 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65  le to.  ** refle
11d60 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20  ct this..  **.  
11d70 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e  ** The "#NNN" in
11d80 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70   the SQL is a sp
11d90 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74  ecial constant t
11da0 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76  hat means whatev
11db0 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73  er value.  ** is
11dc0 20 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e   in register NNN
11dd0 2e 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72  .  See grammar r
11de0 75 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ules associated 
11df0 77 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49  with the TK_REGI
11e00 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20  STER.  ** token 
11e10 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
11e20 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f  nformation..  */
11e30 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
11e40 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
11e50 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
11e60 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25  s SET rootpage=%
11e70 64 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20  d WHERE #%d AND 
11e80 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20  rootpage=#%d",. 
11e90 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
11ea0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
11eb0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
11ec0 29 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72  ), iTable, r1, r
11ed0 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  1);.#endif.  sql
11ee0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
11ef0 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
11f00 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56  }../*.** Write V
11f10 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73  DBE code to eras
11f20 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  e table pTab and
11f30 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
11f40 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e  indices on disk.
11f50 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61  .** Code to upda
11f60 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  te the sqlite_ma
11f70 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20  ster tables and 
11f80 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
11f90 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69  definitions.** i
11fa0 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61  n case a root-pa
11fb0 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
11fc0 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
11fd0 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
11fe0 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20  ree layer.** is 
11ff0 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73  also added (this
12000 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
12010 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
12020 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74  database)..*/.st
12030 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
12040 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  yTable(Parse *pP
12050 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
12060 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
12070 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
12080 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  M.  Index *pIdx;
12090 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
120a0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
120b0 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
120c0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
120d0 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
120e0 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e  pParse, pTab->tn
120f0 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28  um, iDb);.  for(
12100 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
12110 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
12120 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
12130 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
12140 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e  pParse, pIdx->tn
12150 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65  um, iDb);.  }.#e
12160 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  lse.  /* If the 
12170 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20  database may be 
12180 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
12190 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f  ble (if SQLITE_O
121a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
121b0 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e   ** is not defin
121c0 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ed), then it is 
121d0 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c  important to cal
121e0 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20  l OP_Destroy on 
121f0 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61  the.  ** table a
12200 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61  nd index root-pa
12210 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74  ges in order, st
12220 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
12230 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a  numerically .  *
12240 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  * largest root-p
12250 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  age number. This
12260 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
12270 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f   none of the roo
12280 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20  t-pages.  ** to 
12290 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20  be destroyed is 
122a0 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20  relocated by an 
122b0 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72  earlier OP_Destr
122c0 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a  oy. i.e. if the.
122d0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
122e0 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a  ere coded:.  **.
122f0 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
12300 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a  4 0.  ** ....  *
12310 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30  * OP_Destroy 5 0
12320 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72  .  **.  ** and r
12330 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65  oot page 5 happe
12340 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  ned to be the la
12350 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
12360 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20  number in the.  
12370 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
12380 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f  n root page 5 wo
12390 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20  uld be moved to 
123a0 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20  page 4 by the . 
123b0 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20   ** "OP_Destroy 
123c0 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65  4 0" opcode. The
123d0 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f   subsequent "OP_
123e0 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75  Destroy 5 0" wou
123f0 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72  ld hit.  ** a fr
12400 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20  ee-list page..  
12410 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
12420 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e  pTab->tnum;.  in
12430 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30  t iDestroyed = 0
12440 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
12450 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
12460 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65  ;.    int iLarge
12470 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  st = 0;..    if(
12480 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c   iDestroyed==0 |
12490 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65  | iTab<iDestroye
124a0 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67  d ){.      iLarg
124b0 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  est = iTab;.    
124c0 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  }.    for(pIdx=p
124d0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
124e0 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
124f0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
12500 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75  iIdx = pIdx->tnu
12510 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
12520 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
12530 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
12540 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73  .      if( (iDes
12550 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49  troyed==0 || (iI
12560 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20  dx<iDestroyed)) 
12570 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74  && iIdx>iLargest
12580 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72   ){.        iLar
12590 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20  gest = iIdx;.   
125a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
125b0 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29  f( iLargest==0 )
125c0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
125d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
125e0 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
125f0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
12600 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
12610 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
12620 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
12630 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e   && iDb<pParse->
12640 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20  db->nDb );.     
12650 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
12660 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73  (pParse, iLarges
12670 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69  t, iDb);.      i
12680 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72  Destroyed = iLar
12690 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gest;.    }.  }.
126a0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
126b0 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  Remove entries f
126c0 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73  rom the sqlite_s
126d0 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f 72  tatN tables (for
126e0 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a   N in (1,2,3)).*
126f0 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50 20 49  * after a DROP I
12700 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41 42  NDEX or DROP TAB
12710 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  LE command..*/.s
12720 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
12730 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
12740 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
12750 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
12760 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
12770 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
12780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12790 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6e  * The database n
127a0 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  umber */.  const
127b0 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20   char *zType,   
127c0 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22 74    /* "idx" or "t
127d0 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  bl" */.  const c
127e0 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20  har *zName      
127f0 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78  /* Name of index
12800 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a   or table */.){.
12810 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
12820 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d   char *zDbName =
12830 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
12840 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 66  [iDb].zName;.  f
12850 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b  or(i=1; i<=4; i+
12860 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61  +){.    char zTa
12870 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74  b[24];.    sqlit
12880 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
12890 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73  of(zTab),zTab,"s
128a0 71 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29  qlite_stat%d",i)
128b0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
128c0 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
128d0 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62  e->db, zTab, zDb
128e0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
128f0 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
12900 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
12910 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
12920 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25 51  Q.%s WHERE %s=%Q
12930 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61  ",.        zDbNa
12940 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c  me, zTab, zType,
12950 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a   zName.      );.
12960 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
12970 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
12980 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65   to drop a table
12990 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
129a0 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50  3CodeDropTable(P
129b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
129c0 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69  ble *pTab, int i
129d0 44 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b  Db, int isView){
129e0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
129f0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
12a00 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65  se->db;.  Trigge
12a10 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44  r *pTrigger;.  D
12a20 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
12a30 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73  b[iDb];..  v = s
12a40 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
12a50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
12a60 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
12a70 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
12a80 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
12a90 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
12aa0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
12ab0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
12ac0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
12ad0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12ae0 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42  eAddOp0(v, OP_VB
12af0 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  egin);.  }.#endi
12b00 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  f..  /* Drop all
12b10 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
12b20 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
12b30 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
12b40 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20  d. Code.  ** is 
12b50 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d  generated to rem
12b60 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
12b70 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61   sqlite_master a
12b80 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74  nd/or.  ** sqlit
12b90 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66  e_temp_master if
12ba0 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
12bb0 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c    pTrigger = sql
12bc0 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28  ite3TriggerList(
12bd0 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
12be0 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
12bf0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12c00 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
12c10 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
12c20 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72   || .        pTr
12c30 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
12c40 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
12c50 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ma );.    sqlite
12c60 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28  3DropTriggerPtr(
12c70 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
12c80 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 20  );.    pTrigger 
12c90 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
12ca0 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  t;.  }..#ifndef 
12cb0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
12cc0 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52  INCREMENT.  /* R
12cd0 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65  emove any entrie
12ce0 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  s of the sqlite_
12cf0 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61  sequence table a
12d00 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20  ssociated with. 
12d10 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
12d20 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69  ing dropped. Thi
12d30 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
12d40 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72   the table is dr
12d50 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68  opped.  ** at th
12d60 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69  e btree level, i
12d70 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74  n case the sqlit
12d80 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
12d90 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d   needs to.  ** m
12da0 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  ove as a result 
12db0 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e  of the drop (can
12dc0 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
12dd0 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20  vacuum mode)..  
12de0 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  */.  if( pTab->t
12df0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
12e00 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20  oincrement ){.  
12e10 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
12e20 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
12e30 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
12e40 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
12e50 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ce WHERE name=%Q
12e60 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  ",.      pDb->zN
12e70 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
12e80 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  .    );.  }.#end
12e90 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c  if..  /* Drop al
12ea0 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
12eb0 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
12ec0 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
12ed0 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74  er to the.  ** t
12ee0 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61  able. The progra
12ef0 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72  m name loops thr
12f00 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20  ough the master 
12f10 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65  table and delete
12f20 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77  s.  ** every row
12f30 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
12f40 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
12f50 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
12f60 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64  one being.  ** d
12f70 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
12f80 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
12f90 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  arately because 
12fa0 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
12fb0 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e  .  ** created in
12fc0 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
12fd0 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74  se that refers t
12fe0 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f  o a table in ano
12ff0 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61  ther.  ** databa
13000 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  se..  */.  sqlit
13010 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
13020 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45  arse, .      "DE
13030 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
13040 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
13050 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
13060 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44  gger'",.      pD
13070 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b->zName, SCHEMA
13080 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61  _TABLE(iDb), pTa
13090 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b->zName);.  if(
130a0 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56   !isView && !IsV
130b0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
130c0 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65      destroyTable
130d0 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
130e0 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65    }..  /* Remove
130f0 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
13100 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69   from SQLite's i
13110 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61  nternal schema a
13120 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74  nd modify.  ** t
13130 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
13140 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
13150 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
13160 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13170 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73  ddOp4(v, OP_VDes
13180 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c  troy, iDb, 0, 0,
13190 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
131a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
131b0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
131c0 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20  DropTable, iDb, 
131d0 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
131e0 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  e, 0);.  sqlite3
131f0 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
13200 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  rse, iDb);.  sql
13210 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
13220 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  db, iDb);.}../*.
13230 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13240 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
13250 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
13260 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
13270 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20  nt..** pName is 
13280 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
13290 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70  table to be drop
132a0 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ped..*/.void sql
132b0 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61  ite3DropTable(Pa
132c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
132d0 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
132e0 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45   isView, int noE
132f0 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  rr){.  Table *pT
13300 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ab;.  Vdbe *v;. 
13310 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
13320 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
13330 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d   iDb;..  if( db-
13340 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
13350 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
13360 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
13370 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
13380 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73  >nErr==0 );.  as
13390 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
133a0 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e 6f  c==1 );.  if( no
133b0 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
133c0 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54 61 62 20  ssErr++;.  pTab 
133d0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
133e0 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
133f0 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d   isView, &pName-
13400 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f  >a[0]);.  if( no
13410 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
13420 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20  ssErr--;..  if( 
13430 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69  pTab==0 ){.    i
13440 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74  f( noErr ) sqlit
13450 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
13460 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  dSchema(pParse, 
13470 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
13480 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f  abase);.    goto
13490 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
134a0 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
134b0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
134c0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
134d0 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
134e0 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
134f0 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20  b->nDb );..  /* 
13500 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72  If pTab is a vir
13510 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c  tual table, call
13520 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61   ViewGetColumnNa
13530 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a  mes() to ensure.
13540 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69    ** it is initi
13550 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  alized..  */.  i
13560 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
13570 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65  b) && sqlite3Vie
13580 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
13590 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
135a0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
135b0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23  rop_table;.  }.#
135c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
135d0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
135e0 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
135f0 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
13600 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
13610 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
13620 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
13630 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
13640 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
13650 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30   char *zArg2 = 0
13660 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
13670 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
13680 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
13690 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29  , zTab, 0, zDb))
136a0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
136b0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
136c0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
136d0 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
136e0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
136f0 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
13700 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
13710 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  DROP_TEMP_VIEW;.
13720 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13730 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
13740 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20  TE_DROP_VIEW;.  
13750 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
13760 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
13770 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
13780 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
13790 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  Tab) ){.      co
137a0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
137b0 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a  _VTABLE;.      z
137c0 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65  Arg2 = sqlite3Ge
137d0 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
137e0 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a  )->pMod->zName;.
137f0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
13800 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
13810 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
13820 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
13830 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
13840 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
13850 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13860 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
13870 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  DROP_TABLE;.    
13880 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13890 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
138a0 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
138b0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41   pTab->zName, zA
138c0 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  rg2, zDb) ){.   
138d0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
138e0 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
138f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
13900 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
13910 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70  SQLITE_DELETE, p
13920 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
13930 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
13940 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
13950 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  e;.    }.  }.#en
13960 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65  dif.  if( sqlite
13970 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
13980 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
13990 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20  , 7)==0 .    && 
139a0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
139b0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
139c0 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21  lite_stat", 11)!
139d0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
139e0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
139f0 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
13a00 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
13a10 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
13a20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
13a30 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69  p_table;.  }..#i
13a40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13a50 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75  T_VIEW.  /* Ensu
13a60 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73  re DROP TABLE is
13a70 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76   not used on a v
13a80 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49  iew, and DROP VI
13a90 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20  EW is not used. 
13aa0 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a   ** on a table..
13ab0 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65    */.  if( isVie
13ac0 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
13ad0 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
13ae0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13af0 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54  rse, "use DROP T
13b00 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
13b10 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e  able %s", pTab->
13b20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
13b30 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
13b40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56  ;.  }.  if( !isV
13b50 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
13b60 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
13b70 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13b80 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49  se, "use DROP VI
13b90 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65  EW to delete vie
13ba0 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  w %s", pTab->zNa
13bb0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
13bc0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
13bd0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
13be0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
13bf0 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
13c00 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
13c10 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
13c20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
13c30 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
13c40 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
13c50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
13c60 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
13c70 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
13c80 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  b);.    sqlite3C
13c90 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
13ca0 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62 6c  Parse, iDb, "tbl
13cb0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
13cc0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72  .    sqlite3FkDr
13cd0 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
13ce0 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20  pName, pTab);.  
13cf0 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f    sqlite3CodeDro
13d00 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  pTable(pParse, p
13d10 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77  Tab, iDb, isView
13d20 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
13d30 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
13d40 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
13d50 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
13d60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13d70 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
13d80 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
13d90 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
13da0 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
13db0 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
13dc0 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
13dd0 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
13de0 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
13df0 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
13e00 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
13e10 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
13e20 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
13e30 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
13e40 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
13e50 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
13e60 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
13e70 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
13e80 20 72 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e   referred to (a.
13e90 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74 22  k.a the "parent"
13ea0 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c   table).  pToCol
13eb0 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66   is a list.** of
13ec0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
13ed0 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e  arent pTo table.
13ee0 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
13ef0 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
13f00 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
13f10 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
13f20 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
13f30 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
13f40 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
13f50 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
13f60 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
13f70 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
13f80 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
13f90 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
13fa0 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
13fb0 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
13fc0 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
13fd0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
13fe0 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  field..**.** The
13ff0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
14000 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
14010 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
14020 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
14030 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
14040 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
14050 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
14060 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
14070 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
14080 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
14090 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
140a0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
140b0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
140c0 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
140d0 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
140e0 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
140f0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
14100 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
14110 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
14120 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
14130 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
14140 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
14150 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
14160 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
14170 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
14180 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
14190 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
141a0 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
141b0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
141c0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
141d0 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
141e0 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
141f0 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
14200 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e   = 0;.  FKey *pN
14210 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a  extTo;.  Table *
14220 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
14230 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
14240 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
14250 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
14260 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
14270 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
14280 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
14290 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b  E_VTAB ) goto fk
142a0 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
142b0 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
142c0 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
142d0 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  l-1;.    if( NEV
142e0 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74  ER(iCol<0) ) got
142f0 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
14300 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
14310 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
14320 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
14330 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
14340 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
14350 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
14360 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
14370 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
14380 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
14390 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
143a0 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
143b0 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
143c0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
143d0 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
143e0 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
143f0 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
14400 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
14410 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14420 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
14430 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
14440 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
14450 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
14460 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
14470 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
14480 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
14490 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
144a0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
144b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
144c0 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
144d0 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
144e0 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
144f0 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  y) + (nCol-1)*si
14500 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
14510 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
14520 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
14530 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
14540 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
14550 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
14560 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
14570 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
14580 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
14590 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
145a0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
145b0 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
145c0 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
145d0 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  =0 ){.    goto f
145e0 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b  k_end;.  }.  pFK
145f0 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
14600 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
14610 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
14620 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
14630 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20  y->aCol[nCol];. 
14640 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
14650 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
14660 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
14670 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
14680 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
14690 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e  z);.  z += pTo->
146a0 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  n+1;.  pFKey->nC
146b0 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
146c0 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
146d0 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
146e0 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
146f0 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
14700 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
14710 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
14720 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
14730 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
14740 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
14750 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
14760 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
14770 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
14780 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
14790 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
147a0 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
147b0 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
147c0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
147d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
147e0 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
147f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
14800 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
14810 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
14820 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
14830 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
14840 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
14850 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
14860 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
14870 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
14880 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
14890 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
148a0 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
148b0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
148c0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
148d0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
148e0 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
148f0 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
14900 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
14910 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
14920 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
14930 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
14940 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
14950 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
14960 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
14970 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
14980 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30  pFKey->aAction[0
14990 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26  ] = (u8)(flags &
149a0 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20   0xff);         
149b0 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20     /* ON DELETE 
149c0 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65  action */.  pFKe
149d0 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20  y->aAction[1] = 
149e0 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38  (u8)((flags >> 8
149f0 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f   ) & 0xff);    /
14a00 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69  * ON UPDATE acti
14a10 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  on */..  assert(
14a20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
14a30 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
14a40 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
14a50 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20  pNextTo = (FKey 
14a60 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  *)sqlite3HashIns
14a70 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d  ert(&p->pSchema-
14a80 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20  >fkeyHash, .    
14a90 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 71    pFKey->zTo, sq
14aa0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 46  lite3Strlen30(pF
14ab0 4b 65 79 2d 3e 7a 54 6f 29 2c 20 28 76 6f 69 64  Key->zTo), (void
14ac0 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20   *)pFKey.  );.  
14ad0 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b  if( pNextTo==pFK
14ae0 65 79 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  ey ){.    db->ma
14af0 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
14b00 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
14b10 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 78 74  .  }.  if( pNext
14b20 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  To ){.    assert
14b30 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76  ( pNextTo->pPrev
14b40 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b  To==0 );.    pFK
14b50 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e  ey->pNextTo = pN
14b60 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74  extTo;.    pNext
14b70 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70 46  To->pPrevTo = pF
14b80 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  Key;.  }..  /* L
14b90 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20  ink the foreign 
14ba0 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65  key to the table
14bb0 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65   as the last ste
14bc0 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b  p..  */.  p->pFK
14bd0 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46  ey = pFKey;.  pF
14be0 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64  Key = 0;..fk_end
14bf0 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
14c00 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65  e(db, pFKey);.#e
14c10 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
14c20 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52  (SQLITE_OMIT_FOR
14c30 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73  EIGN_KEY) */.  s
14c40 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
14c50 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f  lete(db, pFromCo
14c60 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
14c70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
14c80 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pToCol);.}../*.*
14c90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
14ca0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
14cb0 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
14cc0 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c  IATE or INITIALL
14cd0 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c  Y DEFERRED.** cl
14ce0 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20  ause is seen as 
14cf0 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67  part of a foreig
14d00 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
14d10 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65  .  The isDeferre
14d20 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
14d30 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  s 1 for INITIALL
14d40 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30  Y DEFERRED and 0
14d50 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49   for INITIALLY I
14d60 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65  MMEDIATE..** The
14d70 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
14d80 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
14d90 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b  reated foreign k
14da0 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ey is adjusted.*
14db0 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  * accordingly..*
14dc0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
14dd0 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61  ferForeignKey(Pa
14de0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
14df0 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69   isDeferred){.#i
14e00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14e10 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
14e20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46  Table *pTab;.  F
14e30 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66  Key *pFKey;.  if
14e40 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65  ( (pTab = pParse
14e50 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
14e60 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62  || (pFKey = pTab
14e70 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65  ->pFKey)==0 ) re
14e80 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
14e90 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c  isDeferred==0 ||
14ea0 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29   isDeferred==1 )
14eb0 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32 33  ; /* EV: R-30323
14ec0 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65  -21917 */.  pFKe
14ed0 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
14ee0 28 75 38 29 69 73 44 65 66 65 72 72 65 64 3b 0a  (u8)isDeferred;.
14ef0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
14f00 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
14f10 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e  at will erase an
14f20 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a  d refill index *
14f30 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a  pIdx.  This is.*
14f40 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61  * used to initia
14f50 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65  lize a newly cre
14f60 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f  ated index or to
14f70 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a   recompute the.*
14f80 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  * content of an 
14f90 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73  index in respons
14fa0 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63  e to a REINDEX c
14fb0 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66  ommand..**.** if
14fc0 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
14fd0 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74  not negative, it
14fe0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
14ff0 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a  index is newly.*
15000 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  * created.  The 
15010 72 65 67 69 73 74 65 72 20 73 70 65 63 69 66 69  register specifi
15020 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67  ed by memRootPag
15030 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a  e contains the.*
15040 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  * root page numb
15050 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  er of the index.
15060 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65    If memRootPage
15070 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
15080 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  en.** the index 
15090 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
150a0 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72  nd must be clear
150b0 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
150c0 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20  refilled and.** 
150d0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
150e0 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
150f0 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  x is taken from 
15100 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f  pIndex->tnum..*/
15110 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
15120 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
15130 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
15140 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e  ndex *pIndex, in
15150 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a  t memRootPage){.
15160 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
15170 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20  pIndex->pTable; 
15180 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68   /* The table th
15190 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f  at is indexed */
151a0 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
151b0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
151c0 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
151d0 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20  r used for pTab 
151e0 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  */.  int iIdx = 
151f0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
15200 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
15210 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e  sor used for pIn
15220 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f  dex */.  int iSo
15230 72 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  rter;           
15240 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
15250 72 20 6f 70 65 6e 65 64 20 62 79 20 4f 70 65 6e  r opened by Open
15260 53 6f 72 74 65 72 20 28 69 66 20 69 6e 20 75 73  Sorter (if in us
15270 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  e) */.  int addr
15280 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
15290 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
152a0 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70  s of top of loop
152b0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 32 3b   */.  int addr2;
152c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152d0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
152e0 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e  to jump to for n
152f0 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ext iteration */
15300 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20  .  int tnum;    
15310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15320 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
15330 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
15340 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 3b 20   iPartIdxLabel; 
15350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
15360 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61 62 65  ump to this labe
15370 6c 20 74 6f 20 73 6b 69 70 20 61 20 72 6f 77 20  l to skip a row 
15380 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153a0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
153b0 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76  code into this v
153c0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a  irtual machine *
153d0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
153e0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
153f0 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f     /* KeyInfo fo
15400 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  r index */.  int
15410 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20   regRecord;     
15420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
15430 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
15440 61 73 73 65 6d 62 6c 69 65 64 20 69 6e 64 65 78  assemblied index
15450 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c   record */.  sql
15460 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
15470 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54  e->db;      /* T
15480 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
15490 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
154a0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
154b0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
154c0 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
154d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
154e0 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
154f0 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ION.  if( sqlite
15500 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
15510 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  e, SQLITE_REINDE
15520 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  X, pIndex->zName
15530 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61  , 0,.      db->a
15540 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20  Db[iDb].zName ) 
15550 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
15560 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
15570 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Require a write-
15580 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
15590 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69  e to perform thi
155a0 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  s operation */. 
155b0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
155c0 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
155d0 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54  Tab->tnum, 1, pT
155e0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76  ab->zName);..  v
155f0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
15600 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
15610 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
15620 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
15630 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d  e>=0 ){.    tnum
15640 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a   = memRootPage;.
15650 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75    }else{.    tnu
15660 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  m = pIndex->tnum
15670 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73  ;.  }.  pKey = s
15680 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
15690 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
156a0 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  dex);..  /* Open
156b0 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73   the sorter curs
156c0 6f 72 20 69 66 20 77 65 20 61 72 65 20 74 6f 20  or if we are to 
156d0 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53  use one. */.  iS
156e0 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  orter = pParse->
156f0 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  nTab++;.  sqlite
15700 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
15710 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53  P_SorterOpen, iS
15720 6f 72 74 65 72 2c 20 30 2c 20 30 2c 20 28 63 68  orter, 0, 0, (ch
15730 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20  ar*).           
15740 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15750 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 29  KeyInfoRef(pKey)
15760 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a  , P4_KEYINFO);..
15770 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74 61    /* Open the ta
15780 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ble. Loop throug
15790 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68  h all rows of th
157a0 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72 74 69  e table, inserti
157b0 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65  ng index.  ** re
157c0 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20 73  cords into the s
157d0 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69  orter. */.  sqli
157e0 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
157f0 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
15800 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
15810 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  d);.  addr1 = sq
15820 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15830 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
15840 61 62 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  ab, 0); VdbeCove
15850 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67 52 65  rage(v);.  regRe
15860 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
15870 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
15880 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  ;..  sqlite3Gene
15890 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
158a0 72 73 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c  rse,pIndex,iTab,
158b0 72 65 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61  regRecord,0,&iPa
158c0 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b  rtIdxLabel,0,0);
158d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
158e0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
158f0 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72  rInsert, iSorter
15900 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
15910 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61  sqlite3ResolvePa
15920 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73  rtIdxLabel(pPars
15930 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c  e, iPartIdxLabel
15940 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15950 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
15960 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31  t, iTab, addr1+1
15970 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15980 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
15990 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
159a0 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  r1);.  if( memRo
159b0 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74  otPage<0 ) sqlit
159c0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
159d0 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20  OP_Clear, tnum, 
159e0 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  iDb);.  sqlite3V
159f0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
15a00 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c  OpenWrite, iIdx,
15a10 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20   tnum, iDb, .   
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a30 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50   (char *)pKey, P
15a40 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  4_KEYINFO);.  sq
15a50 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
15a60 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b  5(v, OPFLAG_BULK
15a70 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67  CSR|((memRootPag
15a80 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49  e>=0)?OPFLAG_P2I
15a90 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64  SREG:0));..  add
15aa0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
15ab0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
15ac0 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72  terSort, iSorter
15ad0 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
15ae0 67 65 28 76 29 3b 0a 20 20 61 73 73 65 72 74 28  ge(v);.  assert(
15af0 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e   pKey!=0 || db->
15b00 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
15b10 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a  pParse->nErr );.
15b20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e    if( pIndex->on
15b30 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26  Error!=OE_None &
15b40 26 20 70 4b 65 79 21 3d 30 20 29 7b 0a 20 20 20  & pKey!=0 ){.   
15b50 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74 65   int j2 = sqlite
15b60 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
15b70 28 76 29 20 2b 20 33 3b 0a 20 20 20 20 73 71 6c  (v) + 3;.    sql
15b80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15b90 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 6a 32  , OP_Goto, 0, j2
15ba0 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73  );.    addr2 = s
15bb0 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
15bc0 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
15bd0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
15be0 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43  nt(v, OP_SorterC
15bf0 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74 65 72 2c  ompare, iSorter,
15c00 20 6a 32 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a   j2, regRecord,.
15c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c20 20 20 20 20 20 20 20 20 20 70 4b 65 79 2d 3e 6e           pKey->n
15c30 46 69 65 6c 64 20 2d 20 70 49 6e 64 65 78 2d 3e  Field - pIndex->
15c40 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f  nKeyCol); VdbeCo
15c50 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
15c60 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73  qlite3UniqueCons
15c70 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f  traint(pParse, O
15c80 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29  E_Abort, pIndex)
15c90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
15ca0 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
15cb0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
15cc0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
15cd0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15ce0 53 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72  SorterData, iSor
15cf0 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  ter, regRecord);
15d00 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15d10 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp3(v, OP_IdxIn
15d20 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52  sert, iIdx, regR
15d30 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c  ecord, 1);.  sql
15d40 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
15d50 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45  (v, OPFLAG_USESE
15d60 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c  EKRESULT);.  sql
15d70 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
15d80 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65  eg(pParse, regRe
15d90 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
15da0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15db0 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53 6f  _SorterNext, iSo
15dc0 72 74 65 72 2c 20 61 64 64 72 32 29 3b 20 56 64  rter, addr2); Vd
15dd0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
15de0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
15df0 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a  Here(v, addr1);.
15e00 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15e10 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
15e20 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74  , iTab);.  sqlit
15e30 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
15e40 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b  OP_Close, iIdx);
15e50 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15e60 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
15e70 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f  , iSorter);.}../
15e80 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68 65  *.** Allocate he
15e90 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64  ap space to hold
15ea0 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74   an Index object
15eb0 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d   with nCol colum
15ec0 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61  ns..**.** Increa
15ed0 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  se the allocatio
15ee0 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69 64  n size to provid
15ef0 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74 72  e an extra nExtr
15f00 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38 2d  a bytes.** of 8-
15f10 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70 61  byte aligned spa
15f20 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64  ce after the Ind
15f30 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65  ex object and re
15f40 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65  turn a.** pointe
15f50 72 20 74 6f 20 74 68 69 73 20 65 78 74 72 61 20  r to this extra 
15f60 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74 72  space in *ppExtr
15f70 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  a..*/.Index *sql
15f80 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65  ite3AllocateInde
15f90 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69 74  xObject(.  sqlit
15fa0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
15fb0 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
15fc0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20  ection */.  i16 
15fd0 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
15fe0 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
15ff0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
16000 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  he index */.  in
16010 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
16020 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16030 62 79 74 65 73 20 6f 66 20 65 78 74 72 61 20 73  bytes of extra s
16040 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f  pace to alloc */
16050 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74 72  .  char **ppExtr
16060 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  a       /* Point
16070 65 72 20 74 6f 20 74 68 65 20 22 65 78 74 72 61  er to the "extra
16080 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20 20  " space */.){.  
16090 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20  Index *p;       
160a0 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
160b0 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  d index object *
160c0 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
160d0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
160e0 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 49  s of space for I
160f0 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61 72  ndex object + ar
16100 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74 65  rays */..  nByte
16110 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
16120 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20  (Index)) +      
16130 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
16140 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20   structure  */. 
16150 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28           ROUND8(
16160 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43  sizeof(char*)*nC
16170 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a  ol) +         /*
16180 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20   Index.azColl   
16190 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52    */.          R
161a0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f 67  OUND8(sizeof(Log
161b0 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20  Est)*(nCol+1) + 
161c0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52      /* Index.aiR
161d0 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20 20  owLogEst   */.  
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
161f0 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 20  izeof(i16)*nCol 
16200 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  +            /* 
16210 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20  Index.aiColumn  
16220 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
16230 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a       sizeof(u8)*
16240 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20 20  nCol);          
16250 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72     /* Index.aSor
16260 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d 20  tOrder */.  p = 
16270 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
16280 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b 20  ero(db, nByte + 
16290 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70  nExtra);.  if( p
162a0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 45   ){.    char *pE
162b0 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70  xtra = ((char*)p
162c0 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )+ROUND8(sizeof(
162d0 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d 3e  Index));.    p->
162e0 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a  azColl = (char**
162f0 29 70 45 78 74 72 61 3b 20 20 20 20 20 20 20 70  )pExtra;       p
16300 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38 28  Extra += ROUND8(
16310 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43  sizeof(char*)*nC
16320 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52 6f  ol);.    p->aiRo
16330 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45 73  wLogEst = (LogEs
16340 74 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74 72  t*)pExtra; pExtr
16350 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45  a += sizeof(LogE
16360 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20  st)*(nCol+1);.  
16370 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20    p->aiColumn = 
16380 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20 20  (i16*)pExtra;   
16390 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73 69      pExtra += si
163a0 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a  zeof(i16)*nCol;.
163b0 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65      p->aSortOrde
163c0 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61 3b  r = (u8*)pExtra;
163d0 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20  .    p->nColumn 
163e0 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e  = nCol;.    p->n
163f0 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20  KeyCol = nCol - 
16400 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61 20  1;.    *ppExtra 
16410 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20 6e  = ((char*)p) + n
16420 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Byte;.  }.  retu
16430 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn p;.}../*.** C
16440 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
16450 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
16460 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d  le.  pName1.pNam
16470 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  e2 is the name o
16480 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
16490 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20  and pTblList is 
164a0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
164b0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
164c0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
164d0 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
164e0 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
164f0 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
16500 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
16510 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
16520 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
16530 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
16540 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
16550 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
16560 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
16570 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
16580 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
16590 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
165a0 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
165b0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
165c0 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
165d0 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
165e0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
165f0 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
16600 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
16610 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
16620 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
16630 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
16640 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
16650 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
16660 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
16670 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
16680 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
16690 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
166a0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
166b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
166c0 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20 73  dex is created s
166d0 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 72 65 74  uccessfully, ret
166e0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
166f0 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 0a 2a   the new Index.*
16700 2a 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 69  * structure. Thi
16710 73 20 69 73 20 75 73 65 64 20 62 79 20 73 71 6c  s is used by sql
16720 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65  ite3AddPrimaryKe
16730 79 28 29 20 74 6f 20 6d 61 72 6b 20 74 68 65 20  y() to mark the 
16740 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68 65 20  index.** as the 
16750 74 61 62 6c 65 73 20 70 72 69 6d 61 72 79 20 6b  tables primary k
16760 65 79 20 28 49 6e 64 65 78 2e 69 64 78 54 79 70  ey (Index.idxTyp
16770 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e==SQLITE_IDXTYP
16780 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 0a 2a 2f  E_PRIMARYKEY).*/
16790 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 43  .Index *sqlite3C
167a0 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61  reateIndex(.  Pa
167b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
167c0 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74   /* All informat
167d0 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70  ion about this p
167e0 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  arse */.  Token 
167f0 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
16800 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e  First part of in
16810 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
16820 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
16830 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
16840 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
16850 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
16860 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63  be NULL */.  Src
16870 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20  List *pTblName, 
16880 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65  /* Table to inde
16890 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70  x. Use pParse->p
168a0 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f  NewTable if 0 */
168b0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
168c0 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  st,   /* A list 
168d0 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
168e0 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
168f0 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
16900 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45   /* OE_Abort, OE
16910 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c  _Ignore, OE_Repl
16920 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20  ace, or OE_None 
16930 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61  */.  Token *pSta
16940 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  rt,     /* The C
16950 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
16960 20 62 65 67 69 6e 73 20 74 68 69 73 20 73 74 61   begins this sta
16970 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72  tement */.  Expr
16980 20 2a 70 50 49 57 68 65 72 65 2c 20 20 20 20 2f   *pPIWhere,    /
16990 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 66  * WHERE clause f
169a0 6f 72 20 70 61 72 74 69 61 6c 20 69 6e 64 69 63  or partial indic
169b0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  es */.  int sort
169c0 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f  Order,     /* So
169d0 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69 6d  rt order of prim
169e0 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c 69  ary key when pLi
169f0 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e  st==NULL */.  in
16a00 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20 20  t ifNotExist    
16a10 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20 69   /* Omit error i
16a20 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  f index already 
16a30 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 49  exists */.){.  I
16a40 6e 64 65 78 20 2a 70 52 65 74 20 3d 20 30 3b 20  ndex *pRet = 0; 
16a50 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
16a60 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 54 61  o return */.  Ta
16a70 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
16a80 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
16a90 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49  e indexed */.  I
16aa0 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30  ndex *pIndex = 0
16ab0 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ;   /* The index
16ac0 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a   to be created *
16ad0 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  /.  char *zName 
16ae0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  = 0;     /* Name
16af0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   of the index */
16b00 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
16b10 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
16b20 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
16b30 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e  in zName */.  in
16b40 74 20 69 2c 20 6a 3b 0a 20 20 44 62 46 69 78 65  t i, j;.  DbFixe
16b50 72 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f  r sFix;        /
16b60 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20  * For assigning 
16b70 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74  database names t
16b80 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  o pTable */.  in
16b90 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b  t sortOrderMask;
16ba0 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72     /* 1 to honor
16bb0 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20   DESC in index. 
16bc0 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f   0 to ignore. */
16bd0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
16be0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44   pParse->db;.  D
16bf0 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
16c00 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69      /* The speci
16c10 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  fic table contai
16c20 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64  ning the indexed
16c30 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
16c40 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
16c50 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
16c60 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
16c70 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  t is being writt
16c80 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
16c90 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Name = 0;    /* 
16ca0 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
16cb0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
16cc0 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72   create */.  str
16cd0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
16ce0 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a  m *pListItem; /*
16cf0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
16d00 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 63 6f 6e  r pList */.  con
16d10 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43  st Column *pTabC
16d20 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ol;           /*
16d30 20 41 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   A column in the
16d40 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
16d50 6e 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20  nExtra = 0;     
16d60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16d70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  Space allocated 
16d80 66 6f 72 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a  for zExtra[] */.
16d90 20 20 69 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b    int nExtraCol;
16da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16db0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
16dc0 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65  extra columns ne
16dd0 65 64 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  eded */.  char *
16de0 7a 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20  zExtra = 0;     
16df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
16e00 74 72 61 20 73 70 61 63 65 20 61 66 74 65 72 20  tra space after 
16e10 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
16e20 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b   */.  Index *pPk
16e30 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 52   = 0;      /* PR
16e40 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20  IMARY KEY index 
16e50 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
16e60 44 20 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 61  D tables */..  a
16e70 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
16e80 45 72 72 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f  Err==0 );      /
16e90 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77  * Never called w
16ea0 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73  ith prior errors
16eb0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61   */.  if( db->ma
16ec0 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e  llocFailed || IN
16ed0 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b  _DECLARE_VTAB ){
16ee0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
16ef0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
16f00 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
16f10 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
16f20 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
16f30 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
16f40 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
16f50 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
16f60 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
16f70 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
16f80 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
16f90 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
16fa0 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
16fb0 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73  =0 ){..    /* Us
16fc0 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69  e the two-part i
16fd0 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74  ndex name to det
16fe0 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62  ermine the datab
16ff0 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73  ase .    ** to s
17000 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61  earch for the ta
17010 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74  ble. 'Fix' the t
17020 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69  able name to thi
17030 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f  s db.    ** befo
17040 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  re looking up th
17050 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
17060 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
17070 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a  e1 && pName2 );.
17080 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
17090 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
170a0 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
170b0 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
170c0 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f    if( iDb<0 ) go
170d0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
170e0 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
170f0 28 20 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65  ( pName && pName
17100 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ->z );..#ifndef 
17110 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50  SQLITE_OMIT_TEMP
17120 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  DB.    /* If the
17130 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20   index name was 
17140 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65  unqualified, che
17150 63 6b 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a  ck if the table.
17160 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70      ** is a temp
17170 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73   table. If so, s
17180 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
17190 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20  to 1. Do not do 
171a0 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  this.    ** if i
171b0 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61  nitialising a da
171c0 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20  tabase schema.. 
171d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64     */.    if( !d
171e0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
171f0 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c        pTab = sql
17200 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
17210 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  p(pParse, pTblNa
17220 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
17230 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70  Name2->n==0 && p
17240 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63  Tab && pTab->pSc
17250 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
17260 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
17270 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20      iDb = 1;.   
17280 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
17290 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  f..    sqlite3Fi
172a0 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
172b0 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78  rse, iDb, "index
172c0 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  ", pName);.    i
172d0 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  f( sqlite3FixSrc
172e0 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c  List(&sFix, pTbl
172f0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Name) ){.      /
17300 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61  * Because the pa
17310 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20  rser constructs 
17320 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20  pTblName from a 
17330 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65  single identifie
17340 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  r,.      ** sqli
17350 74 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61  te3FixSrcList ca
17360 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f  n never fail. */
17370 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
17380 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
17390 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
173a0 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
173b0 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e  , 0, &pTblName->
173c0 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[0]);.    asser
173d0 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
173e0 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d  led==0 || pTab==
173f0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  0 );.    if( pTa
17400 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  b==0 ) goto exit
17410 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
17420 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26     if( iDb==1 &&
17430 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
17440 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63  chema!=pTab->pSc
17450 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71  hema ){.      sq
17460 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
17470 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
17480 20 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65    "cannot create
17490 20 61 20 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e   a TEMP index on
174a0 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20   non-TEMP table 
174b0 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%s\"",.       
174c0 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29      pTab->zName)
174d0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
174e0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
174f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48      }.    if( !H
17500 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
17510 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
17520 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
17530 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
17540 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
17550 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
17560 20 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20   pStart==0 );.  
17570 20 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d    pTab = pParse-
17580 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >pNewTable;.    
17590 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
175a0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
175b0 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ex;.    iDb = sq
175c0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
175d0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
175e0 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62  hema);.  }.  pDb
175f0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
17600 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
17610 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
17620 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
17630 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
17640 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
17650 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
17660 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20  ", 7)==0 .      
17670 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
17680 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65  Cmp(&pTab->zName
17690 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c  [7],"altertab_",
176a0 39 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  9)!=0 ){.    sql
176b0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
176c0 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
176d0 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
176e0 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
176f0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
17700 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
17710 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
17720 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28  _OMIT_VIEW.  if(
17730 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
17740 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
17750 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
17760 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  iews may not be 
17770 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
17780 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
17790 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
177a0 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
177b0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
177c0 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
177d0 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
177e0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
177f0 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c  pParse, "virtual
17800 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20   tables may not 
17810 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
17820 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
17830 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
17840 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
17850 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
17860 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
17870 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
17880 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
17890 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
178a0 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
178b0 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
178c0 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
178d0 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
178e0 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
178f0 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
17900 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
17910 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
17920 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
17930 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
17940 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
17950 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
17960 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
17970 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
17980 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
17990 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
179a0 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
179b0 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
179c0 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
179d0 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
179e0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
179f0 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
17a00 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
17a10 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
17a20 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
17a30 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
17a40 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
17a50 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
17a60 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
17a70 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
17a80 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
17a90 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
17aa0 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  Name);.    if( z
17ab0 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
17ac0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
17ad0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
17ae0 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  ame->z!=0 );.   
17af0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
17b00 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
17b10 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
17b20 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67  Name) ){.      g
17b30 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
17b40 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
17b50 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
17b60 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  usy ){.      if(
17b70 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
17b80 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21  e(db, zName, 0)!
17b90 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
17ba0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
17bb0 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
17bc0 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20  already a table 
17bd0 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
17be0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
17bf0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
17c00 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
17c10 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
17c20 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
17c30 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29  ame, pDb->zName)
17c40 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
17c50 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a   !ifNotExist ){.
17c60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17c70 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
17c80 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64  "index %s alread
17c90 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65  y exists", zName
17ca0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
17cb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17cc0 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
17cd0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17ce0 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
17cf0 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
17d00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
17d10 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
17d20 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ndex;.    }.  }e
17d30 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  lse{.    int n;.
17d40 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70      Index *pLoop
17d50 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ;.    for(pLoop=
17d60 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d  pTab->pIndex, n=
17d70 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  1; pLoop; pLoop=
17d80 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b  pLoop->pNext, n+
17d90 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  +){}.    zName =
17da0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
17db0 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f  db, "sqlite_auto
17dc0 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54  index_%s_%d", pT
17dd0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  ab->zName, n);. 
17de0 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
17df0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
17e00 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
17e10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
17e20 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f   Check for autho
17e30 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61  rization to crea
17e40 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a  te an index..  *
17e50 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
17e60 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
17e70 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73  ION.  {.    cons
17e80 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44  t char *zDb = pD
17e90 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b->zName;.    if
17ea0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
17eb0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
17ec0 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
17ed0 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20  _TABLE(iDb), 0, 
17ee0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
17ef0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
17f00 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
17f10 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
17f20 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  E_INDEX;.    if(
17f30 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
17f40 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51   iDb==1 ) i = SQ
17f50 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
17f60 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
17f70 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
17f80 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d  (pParse, i, zNam
17f90 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
17fa0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
17fb0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
17fc0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
17fd0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
17fe0 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61  pList==0, it mea
17ff0 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ns this routine 
18000 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61  was called to ma
18010 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a  ke a primary.  *
18020 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65  * key out of the
18030 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
18040 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
18050 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
18060 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61  on..  ** So crea
18070 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74  te a fake list t
18080 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e  o simulate this.
18090 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73  .  */.  if( pLis
180a0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
180b0 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
180c0 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
180d0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
180e0 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f   pList==0 ) goto
180f0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18100 65 78 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  ex;.    pList->a
18110 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [0].zName = sqli
18120 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61 72  te3DbStrDup(pPar
18130 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->db,.        
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18160 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
18170 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b  >nCol-1].zName);
18180 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  .    pList->a[0]
18190 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  .sortOrder = (u8
181a0 29 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  )sortOrder;.  }.
181b0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
181c0 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20   how many bytes 
181d0 6f 66 20 73 70 61 63 65 20 61 72 65 20 72 65 71  of space are req
181e0 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65  uired to store e
181f0 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73  xplicitly.  ** s
18200 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69  pecified collati
18210 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
18220 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
18230 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
18240 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
18250 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74  r *pExpr = pList
18260 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
18270 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20    if( pExpr ){. 
18280 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
18290 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pr->op==TK_COLLA
182a0 54 45 20 29 3b 0a 20 20 20 20 20 20 6e 45 78 74  TE );.      nExt
182b0 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74  ra += (1 + sqlit
182c0 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72  e3Strlen30(pExpr
182d0 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20  ->u.zToken));.  
182e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20    }.  }..  /* . 
182f0 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   ** Allocate the
18300 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
18310 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20  . .  */.  nName 
18320 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
18330 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74  0(zName);.  nExt
18340 72 61 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50  raCol = pPk ? pP
18350 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a  k->nKeyCol : 1;.
18360 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
18370 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f  e3AllocateIndexO
18380 62 6a 65 63 74 28 64 62 2c 20 70 4c 69 73 74 2d  bject(db, pList-
18390 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74 72 61 43  >nExpr + nExtraC
183a0 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
183b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183c0 20 20 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20            nName 
183d0 2b 20 6e 45 78 74 72 61 20 2b 20 31 2c 20 26 7a  + nExtra + 1, &z
183e0 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 64 62  Extra);.  if( db
183f0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
18400 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
18410 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18420 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  }.  assert( EIGH
18430 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
18440 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f  (pIndex->aiRowLo
18450 67 45 73 74 29 20 29 3b 0a 20 20 61 73 73 65 72  gEst) );.  asser
18460 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
18470 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e  IGNMENT(pIndex->
18480 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e  azColl) );.  pIn
18490 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78  dex->zName = zEx
184a0 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d  tra;.  zExtra +=
184b0 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65   nName + 1;.  me
184c0 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  mcpy(pIndex->zNa
184d0 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  me, zName, nName
184e0 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70  +1);.  pIndex->p
184f0 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20  Table = pTab;.  
18500 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
18510 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20  = (u8)onError;. 
18520 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74   pIndex->uniqNot
18530 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d  Null = onError!=
18540 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65  OE_None;.  pInde
18550 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 70 4e 61  x->idxType = pNa
18560 6d 65 20 3f 20 53 51 4c 49 54 45 5f 49 44 58 54  me ? SQLITE_IDXT
18570 59 50 45 5f 41 50 50 44 45 46 20 3a 20 53 51 4c  YPE_APPDEF : SQL
18580 49 54 45 5f 49 44 58 54 59 50 45 5f 55 4e 49 51  ITE_IDXTYPE_UNIQ
18590 55 45 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53  UE;.  pIndex->pS
185a0 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
185b0 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
185c0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20  pIndex->nKeyCol 
185d0 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
185e0 20 20 69 66 28 20 70 50 49 57 68 65 72 65 20 29    if( pPIWhere )
185f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
18600 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
18610 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
18620 4e 43 5f 50 61 72 74 49 64 78 2c 20 70 50 49 57  NC_PartIdx, pPIW
18630 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 70 49  here, 0);.    pI
18640 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68  ndex->pPartIdxWh
18650 65 72 65 20 3d 20 70 50 49 57 68 65 72 65 3b 0a  ere = pPIWhere;.
18660 20 20 20 20 70 50 49 57 68 65 72 65 20 3d 20 30      pPIWhere = 0
18670 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
18680 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
18690 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
186a0 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  0) );..  /* Chec
186b0 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73  k to see if we s
186c0 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43  hould honor DESC
186d0 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64   requests on ind
186e0 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ex columns.  */.
186f0 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
18700 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  ma->file_format>
18710 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72  =4 ){.    sortOr
18720 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20  derMask = -1;   
18730 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f  /* Honor DESC */
18740 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f  .  }else{.    so
18750 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b  rtOrderMask = 0;
18760 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45      /* Ignore DE
18770 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  SC */.  }..  /* 
18780 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f  Scan the names o
18790 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  f the columns of
187a0 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
187b0 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a   indexed and.  *
187c0 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d  * load the colum
187d0 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74  n indices into t
187e0 68 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  he Index structu
187f0 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  re.  Report an e
18800 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79  rror.  ** if any
18810 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66   column is not f
18820 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ound..  **.  ** 
18830 54 4f 44 4f 3a 20 20 41 64 64 20 61 20 74 65 73  TODO:  Add a tes
18840 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  t to make sure t
18850 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  hat the same col
18860 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64  umn is not named
18870 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20  .  ** more than 
18880 6f 6e 63 65 20 77 69 74 68 69 6e 20 74 68 65 20  once within the 
18890 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c  same index.  Onl
188a0 79 20 74 68 65 20 66 69 72 73 74 20 69 6e 73 74  y the first inst
188b0 61 6e 63 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65  ance of.  ** the
188c0 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65   column will eve
188d0 72 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65  r be used by the
188e0 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74   optimizer.  Not
188f0 65 20 74 68 61 74 20 75 73 69 6e 67 20 74 68 65  e that using the
18900 0a 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d  .  ** same colum
18910 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  n more than once
18920 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72   cannot be an er
18930 72 6f 72 20 62 65 63 61 75 73 65 20 74 68 61 74  ror because that
18940 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65   would .  ** bre
18950 61 6b 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  ak backwards com
18960 70 61 74 69 62 69 6c 69 74 79 20 2d 20 69 74 20  patibility - it 
18970 6e 65 65 64 73 20 74 6f 20 62 65 20 61 20 77 61  needs to be a wa
18980 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rning..  */.  fo
18990 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d  r(i=0, pListItem
189a0 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69  =pList->a; i<pLi
189b0 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
189c0 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20  pListItem++){.  
189d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
189e0 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49 74  olName = pListIt
189f0 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  em->zName;.    i
18a00 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74  nt requestedSort
18a10 4f 72 64 65 72 3b 0a 20 20 20 20 63 68 61 72 20  Order;.    char 
18a20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
18a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
18a40 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
18a50 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72  name */..    for
18a60 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54  (j=0, pTabCol=pT
18a70 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62  ab->aCol; j<pTab
18a80 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61  ->nCol; j++, pTa
18a90 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69  bCol++){.      i
18aa0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
18ab0 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62  p(zColName, pTab
18ac0 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29  Col->zName)==0 )
18ad0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
18ae0 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e    if( j>=pTab->n
18af0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Col ){.      sql
18b00 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18b10 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68  rse, "table %s h
18b20 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  as no column nam
18b30 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  ed %s",.        
18b40 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pTab->zName, zCo
18b50 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 50  lName);.      pP
18b60 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
18b70 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  a = 1;.      got
18b80 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18b90 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  dex;.    }.    a
18ba0 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
18bb0 6c 3c 3d 30 78 37 66 66 66 20 26 26 20 6a 3c 3d  l<=0x7fff && j<=
18bc0 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20 70 49  0x7fff );.    pI
18bd0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
18be0 5d 20 3d 20 28 69 31 36 29 6a 3b 0a 20 20 20 20  ] = (i16)j;.    
18bf0 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  if( pListItem->p
18c00 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 69 6e  Expr ){.      in
18c10 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 61  t nColl;.      a
18c20 73 73 65 72 74 28 20 70 4c 69 73 74 49 74 65 6d  ssert( pListItem
18c30 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ->pExpr->op==TK_
18c40 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20  COLLATE );.     
18c50 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74   zColl = pListIt
18c60 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  em->pExpr->u.zTo
18c70 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c  ken;.      nColl
18c80 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
18c90 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20  30(zColl) + 1;. 
18ca0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78       assert( nEx
18cb0 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20  tra>=nColl );.  
18cc0 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72      memcpy(zExtr
18cd0 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29  a, zColl, nColl)
18ce0 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
18cf0 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45  zExtra;.      zE
18d00 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20  xtra += nColl;. 
18d10 20 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e       nExtra -= n
18d20 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Coll;.    }else{
18d30 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
18d40 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f  Tab->aCol[j].zCo
18d50 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  ll;.      if( !z
18d60 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 22  Coll ) zColl = "
18d70 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 7d 0a 20  BINARY";.    }. 
18d80 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
18d90 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65  .busy && !sqlite
18da0 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70  3LocateCollSeq(p
18db0 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b  Parse, zColl) ){
18dc0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
18dd0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18de0 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d     }.    pIndex-
18df0 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f  >azColl[i] = zCo
18e00 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65  ll;.    requeste
18e10 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69  dSortOrder = pLi
18e20 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65  stItem->sortOrde
18e30 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73  r & sortOrderMas
18e40 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  k;.    pIndex->a
18e50 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28  SortOrder[i] = (
18e60 75 38 29 72 65 71 75 65 73 74 65 64 53 6f 72 74  u8)requestedSort
18e70 4f 72 64 65 72 3b 0a 20 20 20 20 69 66 28 20 70  Order;.    if( p
18e80 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f 74  Tab->aCol[j].not
18e90 4e 75 6c 6c 3d 3d 30 20 29 20 70 49 6e 64 65 78  Null==0 ) pIndex
18ea0 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20  ->uniqNotNull = 
18eb0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 6b  0;.  }.  if( pPk
18ec0 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   ){.    for(j=0;
18ed0 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   j<pPk->nKeyCol;
18ee0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   j++){.      int
18ef0 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75   x = pPk->aiColu
18f00 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  mn[j];.      if(
18f10 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49 6e 64 65   hasColumn(pInde
18f20 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 6e  x->aiColumn, pIn
18f30 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 78 29  dex->nKeyCol, x)
18f40 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   ){.        pInd
18f50 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 20 0a  ex->nColumn--; .
18f60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18f70 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43       pIndex->aiC
18f80 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a 20 20  olumn[i] = x;.  
18f90 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a        pIndex->az
18fa0 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61  Coll[i] = pPk->a
18fb0 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  zColl[j];.      
18fc0 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f    pIndex->aSortO
18fd0 72 64 65 72 5b 69 5d 20 3d 20 70 50 6b 2d 3e 61  rder[i] = pPk->a
18fe0 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20  SortOrder[j];.  
18ff0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
19000 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
19010 65 72 74 28 20 69 3d 3d 70 49 6e 64 65 78 2d 3e  ert( i==pIndex->
19020 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d 65 6c  nColumn );.  }el
19030 73 65 7b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  se{.    pIndex->
19040 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 2d 31  aiColumn[i] = -1
19050 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a  ;.    pIndex->az
19060 43 6f 6c 6c 5b 69 5d 20 3d 20 22 42 49 4e 41 52  Coll[i] = "BINAR
19070 59 22 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  Y";.  }.  sqlite
19080 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70  3DefaultRowEst(p
19090 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20 70 50  Index);.  if( pP
190a0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
190b0 3d 30 20 29 20 65 73 74 69 6d 61 74 65 49 6e 64  =0 ) estimateInd
190c0 65 78 57 69 64 74 68 28 70 49 6e 64 65 78 29 3b  exWidth(pIndex);
190d0 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50  ..  if( pTab==pP
190e0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
190f0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72  ){.    /* This r
19100 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20  outine has been 
19110 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
19120 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
19130 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20  dex as a.    ** 
19140 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d  result of a PRIM
19150 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
19160 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f  E clause on a co
19170 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c  lumn definition,
19180 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49   or.    ** a PRI
19190 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
191a0 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77  UE clause follow
191b0 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64  ing the column d
191c0 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20  efinitions..    
191d0 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a  ** i.e. one of:.
191e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52      **.    ** CR
191f0 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 20 50  EATE TABLE t(x P
19200 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a  RIMARY KEY, y);.
19210 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
19220 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51  BLE t(x, y, UNIQ
19230 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a  UE(x, y));.    *
19240 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20  *.    ** Either 
19250 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  way, check to se
19260 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61  e if the table a
19270 6c 72 65 61 64 79 20 68 61 73 20 73 75 63 68 20  lready has such 
19280 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20  an index. If.   
19290 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f   ** so, don't bo
192a0 74 68 65 72 20 63 72 65 61 74 69 6e 67 20 74 68  ther creating th
192b0 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c  is one. This onl
192c0 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20  y applies to.   
192d0 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
192e0 79 20 63 72 65 61 74 65 64 20 69 6e 64 69 63 65  y created indice
192f0 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20  s. Users can do 
19300 61 73 20 74 68 65 79 20 77 69 73 68 20 77 69 74  as they wish wit
19310 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69  h.    ** explici
19320 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  t indices..    *
19330 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49  *.    ** Two UNI
19340 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  QUE or PRIMARY K
19350 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  EY constraints a
19360 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71  re considered eq
19370 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20  uivalent.    ** 
19380 28 61 6e 64 20 74 68 75 73 20 73 75 70 70 72 65  (and thus suppre
19390 73 73 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64  ssing the second
193a0 20 6f 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68   one) even if th
193b0 65 79 20 68 61 76 65 20 64 69 66 66 65 72 65 6e  ey have differen
193c0 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72  t.    ** sort or
193d0 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ders..    **.   
193e0 20 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   ** If there are
193f0 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61   different colla
19400 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f  ting sequences o
19410 72 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  r if the columns
19420 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   of.    ** the c
19430 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20  onstraint occur 
19440 69 6e 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64  in different ord
19450 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ers, then the co
19460 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20  nstraints are.  
19470 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20    ** considered 
19480 64 69 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74  distinct and bot
19490 68 20 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61  h result in sepa
194a0 72 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20  rate indices..  
194b0 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a    */.    Index *
194c0 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
194d0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
194e0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
194f0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
19500 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73  int k;.      ass
19510 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72  ert( pIdx->onErr
19520 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20  or!=OE_None );. 
19530 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
19540 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49  x->idxType!=SQLI
19550 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45  TE_IDXTYPE_APPDE
19560 46 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  F );.      asser
19570 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  t( pIndex->onErr
19580 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a  or!=OE_None );..
19590 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
195a0 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d  nKeyCol!=pIndex-
195b0 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69  >nKeyCol ) conti
195c0 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  nue;.      for(k
195d0 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; k<pIdx->nKey
195e0 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  Col; k++){.     
195f0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
19600 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  1;.        const
19610 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20   char *z2;.     
19620 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43     if( pIdx->aiC
19630 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78  olumn[k]!=pIndex
19640 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20  ->aiColumn[k] ) 
19650 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a  break;.        z
19660 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  1 = pIdx->azColl
19670 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a 32 20  [k];.        z2 
19680 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
19690 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [k];.        if(
196a0 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69 74   z1!=z2 && sqlit
196b0 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
196c0 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
196d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d   }.      if( k==
196e0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b  pIdx->nKeyCol ){
196f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
19700 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64  x->onError!=pInd
19710 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ex->onError ){. 
19720 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
19730 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61   constraint crea
19740 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64  tes the same ind
19750 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73  ex as a previous
19760 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
19770 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69  nstraint specifi
19780 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20  ed somewhere in 
19790 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
197a0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
197b0 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
197c0 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   the ON CONFLICT
197d0 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66   clauses are dif
197e0 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20  ferent. If both 
197f0 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
19800 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  ** constraint an
19810 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  d the previous e
19820 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72  quivalent constr
19830 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63  aint have explic
19840 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  it.          ** 
19850 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
19860 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65  ses this is an e
19870 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c  rror. Otherwise,
19880 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20   use the.       
19890 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79     ** explicitly
198a0 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76   specified behav
198b0 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  ior for the inde
198c0 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  x..          */.
198d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28            if( !(
198e0 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  pIdx->onError==O
198f0 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e  E_Default || pIn
19900 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
19910 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20 20  _Default) ){.   
19920 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
19930 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
19940 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
19950 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f    "conflicting O
19960 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73  N CONFLICT claus
19970 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20 30  es specified", 0
19980 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
19990 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
199a0 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
199b0 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
199c0 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72        pIdx->onEr
199d0 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e  ror = pIndex->on
199e0 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  Error;.         
199f0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
19a00 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
19a10 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
19a20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
19a30 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65    /* Link the ne
19a40 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  w Index structur
19a50 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61  e to its table a
19a60 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a  nd to the other.
19a70 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64    ** in-memory d
19a80 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
19a90 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20  es. .  */.  if( 
19aa0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
19ab0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
19ac0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
19ad0 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
19ae0 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d  d(db, 0, pIndex-
19af0 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
19b00 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
19b10 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e  Insert(&pIndex->
19b20 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
19b30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
19b40 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
19b50 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 71 6c 69  dex->zName, sqli
19b60 74 65 33 53 74 72 6c 65 6e 33 30 28 70 49 6e 64  te3Strlen30(pInd
19b70 65 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20  ex->zName),.    
19b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b90 20 20 20 20 20 20 70 49 6e 64 65 78 29 3b 0a 20        pIndex);. 
19ba0 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
19bb0 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e    assert( p==pIn
19bc0 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f  dex );  /* Mallo
19bd0 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c  c must have fail
19be0 65 64 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e  ed */.      db->
19bf0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
19c00 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
19c10 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
19c20 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c      }.    db->fl
19c30 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
19c40 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20  ternChanges;.   
19c50 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
19c60 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78   ){.      pIndex
19c70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
19c80 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d  t.newTnum;.    }
19c90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
19ca0 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  is is the initia
19cb0 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  l CREATE INDEX s
19cc0 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45  tatement (or CRE
19cd0 41 54 45 20 54 41 42 4c 45 20 69 66 20 74 68 65  ATE TABLE if the
19ce0 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61  .  ** index is a
19cf0 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20  n implied index 
19d00 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20  for a UNIQUE or 
19d10 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
19d20 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 2a  traint) then.  *
19d30 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f 20 61  * emit code to a
19d40 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
19d50 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69  x rootpage on di
19d60 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65  sk and make an e
19d70 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 74 68  ntry for.  ** th
19d80 65 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73  e index in the s
19d90 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
19da0 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  le and populate 
19db0 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 0a 20  the index with. 
19dc0 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75   ** content.  Bu
19dd0 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  t, do not do thi
19de0 73 20 69 66 20 77 65 20 61 72 65 20 73 69 6d 70  s if we are simp
19df0 6c 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  ly reading the s
19e00 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a  qlite_master.  *
19e10 2a 20 74 61 62 6c 65 20 74 6f 20 70 61 72 73 65  * table to parse
19e20 20 74 68 65 20 73 63 68 65 6d 61 2c 20 6f 72 20   the schema, or 
19e30 69 66 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  if this index is
19e40 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
19e50 20 69 6e 64 65 78 0a 20 20 2a 2a 20 6f 66 20 61   index.  ** of a
19e60 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
19e70 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
19e80 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69  If pTblName==0 i
19e90 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64  t means this ind
19ea0 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ex is generated 
19eb0 61 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52  as an implied PR
19ec0 49 4d 41 52 59 20 4b 45 59 0a 20 20 2a 2a 20 6f  IMARY KEY.  ** o
19ed0 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69  r UNIQUE index i
19ee0 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
19ef0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e   statement.  Sin
19f00 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a  ce the table.  *
19f10 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  * has just been 
19f20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74  created, it cont
19f30 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64  ains no data and
19f40 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69   the index initi
19f50 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73  alization.  ** s
19f60 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70  tep can be skipp
19f70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  ed..  */.  else 
19f80 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
19f90 3d 3d 30 20 26 26 20 28 48 61 73 52 6f 77 69 64  ==0 && (HasRowid
19fa0 28 70 54 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61  (pTab) || pTblNa
19fb0 6d 65 21 3d 30 29 20 29 7b 0a 20 20 20 20 56 64  me!=0) ){.    Vd
19fc0 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20  be *v;.    char 
19fd0 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20  *zStmt;.    int 
19fe0 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d  iMem = ++pParse-
19ff0 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20  >nMem;..    v = 
1a000 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1a010 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Parse);.    if( 
1a020 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  v==0 ) goto exit
1a030 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a  _create_index;..
1a040 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74  .    /* Create t
1a050 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20  he rootpage for 
1a060 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  the index.    */
1a070 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
1a080 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
1a090 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
1a0a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a0b0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65  AddOp2(v, OP_Cre
1a0c0 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 69  ateIndex, iDb, i
1a0d0 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61  Mem);..    /* Ga
1a0e0 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  ther the complet
1a0f0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
1a100 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1a110 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a  ment into.    **
1a120 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61   the zStmt varia
1a130 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ble.    */.    i
1a140 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
1a150 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29     int n = (int)
1a160 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f  (pParse->sLastTo
1a170 6b 65 6e 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a  ken.z - pName->z
1a180 29 20 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61 73  ) + pParse->sLas
1a190 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20  tToken.n;.      
1a1a0 69 66 28 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31  if( pName->z[n-1
1a1b0 5d 3d 3d 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20  ]==';' ) n--;.  
1a1c0 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69      /* A named i
1a1d0 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70  ndex with an exp
1a1e0 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44  licit CREATE IND
1a1f0 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
1a200 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
1a210 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1a220 20 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58   "CREATE%s INDEX
1a230 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20   %.*s",.        
1a240 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
1a250 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45   ? "" : " UNIQUE
1a260 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b  ", n, pName->z);
1a270 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a280 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69    /* An automati
1a290 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20  c index created 
1a2a0 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  by a PRIMARY KEY
1a2b0 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
1a2c0 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f  raint */.      /
1a2d0 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  * zStmt = sqlite
1a2e0 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f  3MPrintf(""); */
1a2f0 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30  .      zStmt = 0
1a300 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1a310 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  Add an entry in 
1a320 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f  sqlite_master fo
1a330 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20  r this index.   
1a340 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
1a350 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
1a360 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53  e, .        "INS
1a370 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56  ERT INTO %Q.%s V
1a380 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51  ALUES('index',%Q
1a390 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20  ,%Q,#%d,%Q);",. 
1a3a0 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
1a3b0 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
1a3c0 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
1a3d0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
1a3e0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61  ame,.        pTa
1a3f0 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
1a400 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20    iMem,.        
1a410 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20  zStmt.    );.   
1a420 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1a430 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20  b, zStmt);..    
1a440 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65  /* Fill the inde
1a450 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20  x with data and 
1a460 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65  reparse the sche
1a470 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45  ma. Code an OP_E
1a480 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20  xpire.    ** to 
1a490 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  invalidate all p
1a4a0 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  re-compiled stat
1a4b0 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  ements..    */. 
1a4c0 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20     if( pTblName 
1a4d0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a4e0 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
1a4f0 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d  se, pIndex, iMem
1a500 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a510 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
1a520 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
1a530 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
1a540 61 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20  arseSchemaOp(v, 
1a550 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 73 71  iDb,.         sq
1a560 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
1a570 20 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20   "name='%q' AND 
1a580 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 70  type='index'", p
1a590 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Index->zName));.
1a5a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1a5b0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 78  eAddOp1(v, OP_Ex
1a5c0 70 69 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  pire, 0);.    }.
1a5d0 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61    }..  /* When a
1a5e0 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74  dding an index t
1a5f0 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
1a600 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c  dices for a tabl
1a610 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  e, make.  ** sur
1a620 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61  e all indices la
1a630 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65  beled OE_Replace
1a640 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20   come after all 
1a650 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20  those labeled.  
1a660 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54  ** OE_Ignore.  T
1a670 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
1a680 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74   for the correct
1a690 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63   constraint chec
1a6a0 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e  k.  ** processin
1a6b0 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e  g (in sqlite3Gen
1a6c0 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  erateConstraintC
1a6d0 68 65 63 6b 73 28 29 29 20 61 73 20 70 61 72 74  hecks()) as part
1a6e0 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20   of.  ** UPDATE 
1a6f0 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74 65  and INSERT state
1a700 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20  ments.  .  */.  
1a710 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
1a720 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  y || pTblName==0
1a730 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72   ){.    if( onEr
1a740 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
1a750 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d  || pTab->pIndex=
1a760 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
1a770 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
1a780 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
1a790 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
1a7a0 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
1a7b0 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61  Index;.      pTa
1a7c0 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  b->pIndex = pInd
1a7d0 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ex;.    }else{. 
1a7e0 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68       Index *pOth
1a7f0 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  er = pTab->pInde
1a800 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
1a810 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26  pOther->pNext &&
1a820 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e   pOther->pNext->
1a830 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
1a840 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ace ){.        p
1a850 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e  Other = pOther->
1a860 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
1a870 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
1a880 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
1a890 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72  xt;.      pOther
1a8a0 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
1a8b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 74  ;.    }.    pRet
1a8c0 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70   = pIndex;.    p
1a8d0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Index = 0;.  }..
1a8e0 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65    /* Clean up be
1a8f0 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
1a900 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1a910 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  x:.  if( pIndex 
1a920 29 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20  ) freeIndex(db, 
1a930 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74  pIndex);.  sqlit
1a940 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1a950 20 70 50 49 57 68 65 72 65 29 3b 0a 20 20 73 71   pPIWhere);.  sq
1a960 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
1a970 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
1a980 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1a990 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c 4e  Delete(db, pTblN
1a9a0 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
1a9b0 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
1a9c0 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
1a9d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74  .}../*.** Fill t
1a9e0 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  he Index.aiRowEs
1a9f0 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64  t[] array with d
1aa00 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69  efault informati
1aa10 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  on - information
1aa20 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77  .** to be used w
1aa30 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20  hen we have not 
1aa40 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20  run the ANALYZE 
1aa50 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61  command..**.** a
1aa60 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75  iRowEst[0] is su
1aa70 70 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e  ppose to contain
1aa80 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1aa90 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69  lements in the i
1aaa0 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77  ndex..** Since w
1aab0 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67  e do not know, g
1aac0 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20  uess 1 million. 
1aad0 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20   aiRowEst[1] is 
1aae0 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
1aaf0 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
1ab00 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1ab10 65 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79  e that match any
1ab20 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75   particular valu
1ab30 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73  e of the.** firs
1ab40 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
1ab50 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74  index.  aiRowEst
1ab60 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [2] is an estima
1ab70 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
1ab80 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74  .** of rows that
1ab90 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69   match any parti
1aba0 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69 6f  cular combinatio
1abb0 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 32  n of the first 2
1abc0 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74   columns.** of t
1abd0 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73  he index.  And s
1abe0 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73  o forth.  It mus
1abf0 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  t always be the 
1ac00 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20  case that.*.**  
1ac10 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
1ac20 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e  t[N]<=aiRowEst[N
1ac30 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  -1].**          
1ac40 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a   aiRowEst[N]>=1.
1ac50 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d  **.** Apart from
1ac60 20 74 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c   that, we have l
1ac70 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62  ittle to go on b
1ac80 65 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e  esides intuition
1ac90 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69   as to.** how ai
1aca0 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20  RowEst[] should 
1acb0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
1acc0 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e   The numbers gen
1acd0 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61  erated here.** a
1ace0 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69  re based on typi
1acf0 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64  cal values found
1ad00 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63   in actual indic
1ad10 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
1ad20 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
1ad30 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
1ad40 20 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   /*             
1ad50 20 20 20 31 30 2c 20 20 39 2c 20 20 38 2c 20 20     10,  9,  8,  
1ad60 37 2c 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45 73  7,  6 */.  LogEs
1ad70 74 20 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33 2c  t aVal[] = { 33,
1ad80 20 33 32 2c 20 33 30 2c 20 32 38 2c 20 32 36 20   32, 30, 28, 26 
1ad90 7d 3b 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20 3d  };.  LogEst *a =
1ada0 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45   pIdx->aiRowLogE
1adb0 73 74 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79 20  st;.  int nCopy 
1adc0 3d 20 4d 49 4e 28 41 72 72 61 79 53 69 7a 65 28  = MIN(ArraySize(
1add0 61 56 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b 65  aVal), pIdx->nKe
1ade0 79 43 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b 0a  yCol);.  int i;.
1adf0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66 69  .  /* Set the fi
1ae00 72 73 74 20 65 6e 74 72 79 20 28 6e 75 6d 62 65  rst entry (numbe
1ae10 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
1ae20 20 69 6e 64 65 78 29 20 74 6f 20 74 68 65 20 65   index) to the e
1ae30 73 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e  stimated .  ** n
1ae40 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1ae50 20 74 68 65 20 74 61 62 6c 65 2e 20 4f 72 20 31   the table. Or 1
1ae60 30 2c 20 69 66 20 74 68 65 20 65 73 74 69 6d 61  0, if the estima
1ae70 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  ted number of ro
1ae80 77 73 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ws .  ** in the 
1ae90 74 61 62 6c 65 20 69 73 20 6c 65 73 73 20 74 68  table is less th
1aea0 61 6e 20 74 68 61 74 2e 20 20 2a 2f 0a 20 20 61  an that.  */.  a
1aeb0 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  [0] = pIdx->pTab
1aec0 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a  le->nRowLogEst;.
1aed0 20 20 69 66 28 20 61 5b 30 5d 3c 33 33 20 29 20    if( a[0]<33 ) 
1aee0 61 5b 30 5d 20 3d 20 33 33 3b 20 20 20 20 20 20  a[0] = 33;      
1aef0 20 20 61 73 73 65 72 74 28 20 33 33 3d 3d 73 71    assert( 33==sq
1af00 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20  lite3LogEst(10) 
1af10 29 3b 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74  );..  /* Estimat
1af20 65 20 74 68 61 74 20 61 5b 31 5d 20 69 73 20 31  e that a[1] is 1
1af30 30 2c 20 61 5b 32 5d 20 69 73 20 39 2c 20 61 5b  0, a[2] is 9, a[
1af40 33 5d 20 69 73 20 38 2c 20 61 5b 34 5d 20 69 73  3] is 8, a[4] is
1af50 20 37 2c 20 61 5b 35 5d 20 69 73 0a 20 20 2a 2a   7, a[5] is.  **
1af60 20 36 20 61 6e 64 20 65 61 63 68 20 73 75 62 73   6 and each subs
1af70 65 71 75 65 6e 74 20 76 61 6c 75 65 20 28 69 66  equent value (if
1af80 20 61 6e 79 29 20 69 73 20 35 2e 20 20 2a 2f 0a   any) is 5.  */.
1af90 20 20 6d 65 6d 63 70 79 28 26 61 5b 31 5d 2c 20    memcpy(&a[1], 
1afa0 61 56 61 6c 2c 20 6e 43 6f 70 79 2a 73 69 7a 65  aVal, nCopy*size
1afb0 6f 66 28 4c 6f 67 45 73 74 29 29 3b 0a 20 20 66  of(LogEst));.  f
1afc0 6f 72 28 69 3d 6e 43 6f 70 79 2b 31 3b 20 69 3c  or(i=nCopy+1; i<
1afd0 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  =pIdx->nKeyCol; 
1afe0 69 2b 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d  i++){.    a[i] =
1aff0 20 32 33 3b 20 20 20 20 20 20 20 20 20 20 20 20   23;            
1b000 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1b010 32 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  23==sqlite3LogEs
1b020 74 28 35 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 61  t(5) );.  }..  a
1b030 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
1b040 33 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20 20  3LogEst(1) );.  
1b050 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
1b060 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 20 61 5b 70  r!=OE_None ) a[p
1b070 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20  Idx->nKeyCol] = 
1b080 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
1b090 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72   routine will dr
1b0a0 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e  op an existing n
1b0b0 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69  amed index.  Thi
1b0c0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70  s routine.** imp
1b0d0 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50  lements the DROP
1b0e0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
1b0f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1b100 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65  3DropIndex(Parse
1b110 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
1b120 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66  t *pName, int if
1b130 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78  Exists){.  Index
1b140 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65   *pIndex;.  Vdbe
1b150 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *v;.  sqlite3 *
1b160 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1b170 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61  .  int iDb;..  a
1b180 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e  ssert( pParse->n
1b190 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e  Err==0 );   /* N
1b1a0 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68  ever called with
1b1b0 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f   prior errors */
1b1c0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
1b1d0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
1b1e0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1b1f0 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  dex;.  }.  asser
1b200 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
1b210 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  1 );.  if( SQLIT
1b220 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
1b230 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
1b240 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
1b250 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
1b260 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
1b270 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
1b280 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61   pName->a[0].zNa
1b290 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  me, pName->a[0].
1b2a0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66  zDatabase);.  if
1b2b0 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20  ( pIndex==0 ){. 
1b2c0 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73     if( !ifExists
1b2d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1b2e0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1b2f0 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78  , "no such index
1b300 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29  : %S", pName, 0)
1b310 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b320 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
1b330 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
1b340 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61  pParse, pName->a
1b350 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
1b360 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65      }.    pParse
1b370 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20  ->checkSchema = 
1b380 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  1;.    goto exit
1b390 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d  _drop_index;.  }
1b3a0 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69  .  if( pIndex->i
1b3b0 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49  dxType!=SQLITE_I
1b3c0 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 29 7b  DXTYPE_APPDEF ){
1b3d0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1b3e0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
1b3f0 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
1b400 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20  ith UNIQUE ".   
1b410 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b     "or PRIMARY K
1b420 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EY constraint ca
1b430 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22  nnot be dropped"
1b440 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  , 0);.    goto e
1b450 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1b460 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
1b470 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
1b480 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  (db, pIndex->pSc
1b490 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53  hema);.#ifndef S
1b4a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
1b4b0 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
1b4c0 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49   int code = SQLI
1b4d0 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20  TE_DROP_INDEX;. 
1b4e0 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
1b4f0 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
1b500 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1b510 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
1b520 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
1b530 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
1b540 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  = SCHEMA_TABLE(i
1b550 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  Db);.    if( sql
1b560 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1b570 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
1b580 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
1b590 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
1b5a0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1b5b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1b5c0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
1b5d0 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
1b5e0 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
1b5f0 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
1b600 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1b610 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
1b620 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
1b630 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
1b640 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1b650 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
1b660 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1b670 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1b680 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
1b690 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
1b6a0 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
1b6b0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
1b6c0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1b6d0 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
1b6e0 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1b6f0 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
1b700 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
1b710 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
1b720 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
1b730 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
1b740 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  .%s WHERE name=%
1b750 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65  Q AND type='inde
1b760 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e  x'",.       db->
1b770 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
1b780 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
1b790 29 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ), pIndex->zName
1b7a0 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
1b7b0 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c  te3ClearStatTabl
1b7c0 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  es(pParse, iDb, 
1b7d0 22 69 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  "idx", pIndex->z
1b7e0 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
1b7f0 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
1b800 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
1b810 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
1b820 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d  (pParse, pIndex-
1b830 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
1b840 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b850 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64  p4(v, OP_DropInd
1b860 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  ex, iDb, 0, 0, p
1b870 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Index->zName, 0)
1b880 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70  ;.  }..exit_drop
1b890 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65  _index:.  sqlite
1b8a0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
1b8b0 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  b, pName);.}../*
1b8c0 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61 20  .** pArray is a 
1b8d0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72  pointer to an ar
1b8e0 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
1b8f0 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74  Each object in t
1b900 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73  he.** array is s
1b910 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20  zEntry bytes in 
1b920 73 69 7a 65 2e 20 54 68 69 73 20 72 6f 75 74 69  size. This routi
1b930 6e 65 20 75 73 65 73 20 73 71 6c 69 74 65 33 44  ne uses sqlite3D
1b940 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f  bRealloc().** to
1b950 20 65 78 74 65 6e 64 20 74 68 65 20 61 72 72 61   extend the arra
1b960 79 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  y so that there 
1b970 69 73 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e  is space for a n
1b980 65 77 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65  ew object at the
1b990 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e   end..**.** When
1b9a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1b9b0 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74  s called, *pnEnt
1b9c0 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ry contains the 
1b9d0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a  current size of.
1b9e0 2a 2a 20 74 68 65 20 61 72 72 61 79 20 28 69 6e  ** the array (in
1b9f0 20 65 6e 74 72 69 65 73 20 2d 20 73 6f 20 74 68   entries - so th
1ba00 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  e allocation is 
1ba10 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73 7a  ((*pnEntry) * sz
1ba20 45 6e 74 72 79 29 20 62 79 74 65 73 0a 2a 2a 20  Entry) bytes.** 
1ba30 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a  in total)..**.**
1ba40 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28   If the realloc(
1ba50 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 20  ) is successful 
1ba60 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20  (i.e. if no OOM 
1ba70 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73  condition occurs
1ba80 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20  ), the.** space 
1ba90 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
1baa0 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20  e new object is 
1bab0 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 79  zeroed, *pnEntry
1bac0 20 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20 72   updated to.** r
1bad0 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77 20 73  eflect the new s
1bae0 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
1baf0 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
1bb00 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61  o the new alloca
1bb10 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 64  tion.** returned
1bb20 2e 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74  . *pIdx is set t
1bb30 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
1bb40 68 65 20 6e 65 77 20 61 72 72 61 79 20 65 6e 74  he new array ent
1bb50 72 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ry in this case.
1bb60 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
1bb70 2c 20 69 66 20 74 68 65 20 72 65 61 6c 6c 6f 63  , if the realloc
1bb80 28 29 20 66 61 69 6c 73 2c 20 2a 70 49 64 78 20  () fails, *pIdx 
1bb90 69 73 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a 70  is set to -1, *p
1bba0 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a 2a  nEntry remains.*
1bbb0 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  * unchanged and 
1bbc0 61 20 63 6f 70 79 20 6f 66 20 70 41 72 72 61 79  a copy of pArray
1bbd0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f   returned..*/.vo
1bbe0 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79  id *sqlite3Array
1bbf0 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69  Allocate(.  sqli
1bc00 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a  te3 *db,      /*
1bc10 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e   Connection to n
1bc20 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20  otify of malloc 
1bc30 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f  failures */.  vo
1bc40 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20  id *pArray,     
1bc50 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65  /* Array of obje
1bc60 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72  cts.  Might be r
1bc70 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20  eallocated */.  
1bc80 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20  int szEntry,    
1bc90 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63    /* Size of eac
1bca0 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20  h object in the 
1bcb0 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  array */.  int *
1bcc0 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20  pnEntry,     /* 
1bcd0 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74  Number of object
1bce0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  s currently in u
1bcf0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64  se */.  int *pId
1bd00 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  x         /* Wri
1bd10 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  te the index of 
1bd20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20  a new slot here 
1bd30 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b  */.){.  char *z;
1bd40 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e  .  int n = *pnEn
1bd50 74 72 79 3b 0a 20 20 69 66 28 20 28 6e 20 26 20  try;.  if( (n & 
1bd60 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20  (n-1))==0 ){.   
1bd70 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d 30 29   int sz = (n==0)
1bd80 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20   ? 1 : 2*n;.    
1bd90 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c  void *pNew = sql
1bda0 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62  ite3DbRealloc(db
1bdb0 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45  , pArray, sz*szE
1bdc0 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70  ntry);.    if( p
1bdd0 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
1bde0 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20  *pIdx = -1;.    
1bdf0 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b    return pArray;
1be00 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72 72 61  .    }.    pArra
1be10 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  y = pNew;.  }.  
1be20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61  z = (char*)pArra
1be30 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e  y;.  memset(&z[n
1be40 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20   * szEntry], 0, 
1be50 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64  szEntry);.  *pId
1be60 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e  x = n;.  ++*pnEn
1be70 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41  try;.  return pA
1be80 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rray;.}../*.** A
1be90 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d  ppend a new elem
1bea0 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ent to the given
1beb0 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65   IdList.  Create
1bec0 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66   a new IdList if
1bed0 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a  .** need be..**.
1bee0 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20  ** A new IdList 
1bef0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
1bf00 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29  NULL if malloc()
1bf10 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73   fails..*/.IdLis
1bf20 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
1bf30 41 70 70 65 6e 64 28 73 71 6c 69 74 65 33 20 2a  Append(sqlite3 *
1bf40 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  db, IdList *pLis
1bf50 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
1bf60 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1bf70 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
1bf80 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1bf90 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
1bfa0 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29  , sizeof(IdList)
1bfb0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
1bfc0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
1bfd0 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20  .  }.  pList->a 
1bfe0 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c  = sqlite3ArrayAl
1bff0 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 64 62  locate(.      db
1c000 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61  ,.      pList->a
1c010 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70  ,.      sizeof(p
1c020 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20  List->a[0]),.   
1c030 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a     &pList->nId,.
1c040 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20        &i.  );.  
1c050 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73  if( i<0 ){.    s
1c060 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1c070 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
1c080 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1c090 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  .  pList->a[i].z
1c0a0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1c0b0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1c0c0 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72  pToken);.  retur
1c0d0 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pList;.}../*.*
1c0e0 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69  * Delete an IdLi
1c0f0 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
1c100 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
1c110 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c  sqlite3 *db, IdL
1c120 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
1c130 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
1c140 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
1c150 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
1c160 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
1c170 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1c180 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  db, pList->a[i].
1c190 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
1c1a0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1c1b0 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c  pList->a);.  sql
1c1c0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1c1d0 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
1c1e0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
1c1f0 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65   in pList of the
1c200 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65   identifier name
1c210 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d  d zId.  Return -
1c220 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e  1.** if not foun
1c230 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1c240 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c  3IdListIndex(IdL
1c250 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73  ist *pList, cons
1c260 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
1c270 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
1c280 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
1c290 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   -1;.  for(i=0; 
1c2a0 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  i<pList->nId; i+
1c2b0 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
1c2c0 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
1c2d0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e  ->a[i].zName, zN
1c2e0 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
1c2f0 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
1c300 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78   -1;.}../*.** Ex
1c310 70 61 6e 64 20 74 68 65 20 73 70 61 63 65 20 61  pand the space a
1c320 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65  llocated for the
1c330 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 20 6f   given SrcList o
1c340 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72 65 61  bject by.** crea
1c350 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65 77 20  ting nExtra new 
1c360 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67 20  slots beginning 
1c370 61 74 20 69 53 74 61 72 74 2e 20 20 69 53 74 61  at iStart.  iSta
1c380 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73 65 64  rt is zero based
1c390 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61  ..** New slots a
1c3a0 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
1c3b0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 75   For example, su
1c3c0 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73 74 20  ppose a SrcList 
1c3d0 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69  initially contai
1c3e0 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73 3a 20  ns two entries: 
1c3f0 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e  A,B..** To appen
1c400 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65 73 20  d 3 new entries 
1c410 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f  onto the end, do
1c420 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1c430 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
1c440 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 6c 69  large(db, pSrcli
1c450 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a  st, 3, 2);.**.**
1c460 20 41 66 74 65 72 20 74 68 65 20 63 61 6c 6c 20   After the call 
1c470 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64 20 63  above it would c
1c480 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e  ontain:  A, B, n
1c490 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a  il, nil, nil..**
1c4a0 20 49 66 20 74 68 65 20 69 53 74 61 72 74 20 61   If the iStart a
1c4b0 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65 65 6e  rgument had been
1c4c0 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20 32 2c   1 instead of 2,
1c4d0 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74   then the result
1c4e0 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62  .** would have b
1c4f0 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69  een:  A, nil, ni
1c500 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70  l, nil, B.  To p
1c510 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73  repend the new s
1c520 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74  lots,.** the iSt
1c530 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c 64 20  art value would 
1c540 62 65 20 30 2e 20 20 54 68 65 20 72 65 73 75 6c  be 0.  The resul
1c550 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20  t then would.** 
1c560 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69  be: nil, nil, ni
1c570 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49  l, A, B..**.** I
1c580 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
1c590 61 74 69 6f 6e 20 66 61 69 6c 73 20 74 68 65 20  ation fails the 
1c5a0 53 72 63 4c 69 73 74 20 69 73 20 75 6e 63 68 61  SrcList is uncha
1c5b0 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62  nged.  The.** db
1c5c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
1c5d0 6c 61 67 20 77 69 6c 6c 20 62 65 20 73 65 74 20  lag will be set 
1c5e0 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c  to true..*/.SrcL
1c5f0 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
1c600 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 73 71  istEnlarge(.  sq
1c610 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
1c620 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
1c630 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66  nection to notif
1c640 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20  y of OOM errors 
1c650 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
1c660 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 53  rc,     /* The S
1c670 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65 6e 6c  rcList to be enl
1c680 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  arged */.  int n
1c690 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 2f 2a  Extra,        /*
1c6a0 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 73   Number of new s
1c6b0 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f 20 70  lots to add to p
1c6c0 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e  Src->a[] */.  in
1c6d0 74 20 69 53 74 61 72 74 20 20 20 20 20 20 20 20  t iStart        
1c6e0 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 53 72   /* Index in pSr
1c6f0 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74 20  c->a[] of first 
1c700 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20  new slot */.){. 
1c710 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61   int i;..  /* Sa
1c720 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
1c730 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74   calling paramet
1c740 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ers */.  assert(
1c750 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20   iStart>=0 );.  
1c760 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d  assert( nExtra>=
1c770 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
1c780 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Src!=0 );.  asse
1c790 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53 72 63  rt( iStart<=pSrc
1c7a0 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20  ->nSrc );..  /* 
1c7b0 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f  Allocate additio
1c7c0 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e 65 65  nal space if nee
1c7d0 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 28 75 33  ded */.  if( (u3
1c7e0 32 29 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78  2)pSrc->nSrc+nEx
1c7f0 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63  tra>pSrc->nAlloc
1c800 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
1c810 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *pNew;.    int n
1c820 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53  Alloc = pSrc->nS
1c830 72 63 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20 69  rc+nExtra;.    i
1c840 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70 4e 65  nt nGot;.    pNe
1c850 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
1c860 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20  lloc(db, pSrc,. 
1c870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
1c880 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e  zeof(*pSrc) + (n
1c890 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28  Alloc-1)*sizeof(
1c8a0 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  pSrc->a[0]) );. 
1c8b0 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
1c8c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1c8d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c8e0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1c8f0 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20   pSrc;.    }.   
1c900 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20   pSrc = pNew;.  
1c910 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69 74 65    nGot = (sqlite
1c920 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62  3DbMallocSize(db
1c930 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66  , pNew) - sizeof
1c940 28 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f 66 28  (*pSrc))/sizeof(
1c950 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20  pSrc->a[0])+1;. 
1c960 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20     pSrc->nAlloc 
1c970 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f  = nGot;.  }..  /
1c980 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67 20  * Move existing 
1c990 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65 20  slots that come 
1c9a0 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79 20  after the newly 
1c9b0 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a 20  inserted slots. 
1c9c0 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 77   ** out of the w
1c9d0 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53  ay */.  for(i=pS
1c9e0 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69  rc->nSrc-1; i>=i
1c9f0 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20  Start; i--){.   
1ca00 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72   pSrc->a[i+nExtr
1ca10 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b  a] = pSrc->a[i];
1ca20 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72  .  }.  pSrc->nSr
1ca30 63 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a 20 20  c += nExtra;..  
1ca40 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c  /* Zero the newl
1ca50 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74  y allocated slot
1ca60 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70  s */.  memset(&p
1ca70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20  Src->a[iStart], 
1ca80 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  0, sizeof(pSrc->
1ca90 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20  a[0])*nExtra);. 
1caa0 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69   for(i=iStart; i
1cab0 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20  <iStart+nExtra; 
1cac0 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e  i++){.    pSrc->
1cad0 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d  a[i].iCursor = -
1cae0 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74  1;.  }..  /* Ret
1caf0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1cb00 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72   the enlarged Sr
1cb10 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72  cList */.  retur
1cb20 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  n pSrc;.}.../*.*
1cb30 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74  * Append a new t
1cb40 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65  able name to the
1cb50 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20   given SrcList. 
1cb60 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72   Create a new Sr
1cb70 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64  cList if.** need
1cb80 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72   be.  A new entr
1cb90 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20  y is created in 
1cba0 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e  the SrcList even
1cbb0 20 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55   if pTable is NU
1cbc0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c  LL..**.** A SrcL
1cbd0 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
1cbe0 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72   or NULL if ther
1cbf0 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  e is an OOM erro
1cc00 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64  r.  The returned
1cc10 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68  .** SrcList migh
1cc20 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
1cc30 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61   the SrcList tha
1cc40 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69  t was input or i
1cc50 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20  t might be.** a 
1cc60 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20  new one.  If an 
1cc70 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f  OOM error does o
1cc80 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20  ccurs, then the 
1cc90 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70  prior value of p
1cca0 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20  List.** that is 
1ccb0 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f  input to this ro
1ccc0 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74  utine is automat
1ccd0 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a  ically freed..**
1cce0 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65  .** If pDatabase
1ccf0 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74   is not null, it
1cd00 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1cd10 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74  table has an opt
1cd20 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ional.** databas
1cd30 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20  e name prefix.  
1cd40 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74  Like this:  "dat
1cd50 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54  abase.table".  T
1cd60 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  he pDatabase.** 
1cd70 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61  points to the ta
1cd80 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
1cd90 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74   pTable points t
1cda0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  o the database n
1cdb0 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c  ame..** The SrcL
1cdc0 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69  ist.a[].zName fi
1cdd0 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69  eld is filled wi
1cde0 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  th the table nam
1cdf0 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a  e which might.**
1ce00 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   come from pTabl
1ce10 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20  e (if pDatabase 
1ce20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d  is NULL) or from
1ce30 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a   pDatabase.  .**
1ce40 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61   SrcList.a[].zDa
1ce50 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64  tabase is filled
1ce60 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
1ce70 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61  se name from pTa
1ce80 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20  ble,.** or with 
1ce90 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62  NULL if no datab
1cea0 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ase is specified
1ceb0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72  ..**.** In other
1cec0 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20   words, if call 
1ced0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1cee0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1cef0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
1cf00 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  A,B,0);.**.** Th
1cf10 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20  en B is a table 
1cf20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
1cf30 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e  abase name is un
1cf40 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63  specified.  If c
1cf50 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68  alled.** like th
1cf60 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
1cf70 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1cf80 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b  Append(D,A,B,C);
1cf90 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73  .**.** Then C is
1cfa0 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
1cfb0 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74  and B is the dat
1cfc0 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20  abase name.  If 
1cfd0 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20  C is defined.** 
1cfe0 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49  then so is B.  I
1cff0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  n other words, w
1d000 65 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 63  e never have a c
1d010 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a  ase where:.**.**
1d020 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1d030 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c  SrcListAppend(D,
1d040 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f  A,0,C);.**.** Bo
1d050 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  th pTable and pD
1d060 61 74 61 62 61 73 65 20 61 72 65 20 61 73 73 75  atabase are assu
1d070 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64  med to be quoted
1d080 2e 20 20 54 68 65 79 20 61 72 65 20 64 65 71 75  .  They are dequ
1d090 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62  oted.** before b
1d0a0 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68  eing added to th
1d0b0 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72  e SrcList..*/.Sr
1d0c0 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
1d0d0 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73  cListAppend(.  s
1d0e0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1d0f0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1d100 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61   to notify of ma
1d110 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f  lloc failures */
1d120 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  .  SrcList *pLis
1d130 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  t,     /* Append
1d140 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74   to this SrcList
1d150 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61  . NULL creates a
1d160 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a   new SrcList */.
1d170 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
1d180 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74        /* Table t
1d190 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f  o append */.  To
1d1a0 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20  ken *pDatabase  
1d1b0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66    /* Database of
1d1c0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b   the table */.){
1d1d0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1d1e0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1d1f0 20 61 73 73 65 72 74 28 20 70 44 61 74 61 62 61   assert( pDataba
1d200 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21  se==0 || pTable!
1d210 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74  =0 );  /* Cannot
1d220 20 68 61 76 65 20 43 20 77 69 74 68 6f 75 74 20   have C without 
1d230 42 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74  B */.  if( pList
1d240 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ==0 ){.    pList
1d250 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
1d260 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
1d270 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20  f(SrcList) );.  
1d280 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1d290 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70   return 0;.    p
1d2a0 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31  List->nAlloc = 1
1d2b0 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20  ;.  }.  pList = 
1d2c0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e  sqlite3SrcListEn
1d2d0 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c  large(db, pList,
1d2e0 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29   1, pList->nSrc)
1d2f0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
1d300 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
1d310 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
1d320 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  lete(db, pList);
1d330 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1d340 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c   }.  pItem = &pL
1d350 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53  ist->a[pList->nS
1d360 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61  rc-1];.  if( pDa
1d370 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62  tabase && pDatab
1d380 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ase->z==0 ){.   
1d390 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a   pDatabase = 0;.
1d3a0 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62    }.  if( pDatab
1d3b0 61 73 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e  ase ){.    Token
1d3c0 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62   *pTemp = pDatab
1d3d0 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61  ase;.    pDataba
1d3e0 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20  se = pTable;.   
1d3f0 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b   pTable = pTemp;
1d400 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e  .  }.  pItem->zN
1d410 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
1d420 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
1d430 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d  Table);.  pItem-
1d440 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
1d450 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1d460 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73 65 29  n(db, pDatabase)
1d470 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
1d480 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67  ;.}../*.** Assig
1d490 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64  n VdbeCursor ind
1d4a0 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c  ex numbers to al
1d4b0 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72  l tables in a Sr
1d4c0 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71  cList.*/.void sq
1d4d0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
1d4e0 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 20  gnCursors(Parse 
1d4f0 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
1d500 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
1d510 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
1d520 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
1d530 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73 74 20  .  assert(pList 
1d540 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
1d550 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1d560 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
1d570 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
1d580 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69  =pList->a; i<pLi
1d590 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
1d5a0 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Item++){.      i
1d5b0 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f  f( pItem->iCurso
1d5c0 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  r>=0 ) break;.  
1d5d0 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73      pItem->iCurs
1d5e0 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61  or = pParse->nTa
1d5f0 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  b++;.      if( p
1d600 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
1d610 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1d620 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72  SrcListAssignCur
1d630 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49 74  sors(pParse, pIt
1d640 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72  em->pSelect->pSr
1d650 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
1d660 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  }.  }.}../*.** D
1d670 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
1d680 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e  SrcList includin
1d690 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72  g all its substr
1d6a0 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20  ucture..*/.void 
1d6b0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
1d6c0 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
1d6d0 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  , SrcList *pList
1d6e0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
1d6f0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1d700 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
1d710 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1d720 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  n;.  for(pItem=p
1d730 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
1d740 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
1d750 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
1d760 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1d770 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  , pItem->zDataba
1d780 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  se);.    sqlite3
1d790 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
1d7a0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  ->zName);.    sq
1d7b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1d7c0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
1d7d0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1d7e0 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e  e(db, pItem->zIn
1d7f0 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dex);.    sqlite
1d800 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
1d810 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20   pItem->pTab);. 
1d820 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
1d830 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
1d840 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  ->pSelect);.    
1d850 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1d860 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e  e(db, pItem->pOn
1d870 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64  );.    sqlite3Id
1d880 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1d890 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20  Item->pUsing);. 
1d8a0 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
1d8b0 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d  ee(db, pList);.}
1d8c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1d8d0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
1d8e0 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  y the parser to 
1d8f0 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74  add a new term t
1d900 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
1d910 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63  a growing FROM c
1d920 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20  lause.  The "p" 
1d930 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
1d940 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
1d950 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74  FROM clause that
1d960 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1d970 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20  n constructed.  
1d980 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69  "p" is NULL.** i
1d990 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1d9a0 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  rst term of the 
1d9b0 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54  FROM clause.  pT
1d9c0 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61  able and pDataba
1d9d0 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61  se.** are the na
1d9e0 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
1d9f0 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d  and database nam
1da00 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ed in the FROM c
1da10 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70  lause term..** p
1da20 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c  Database is NULL
1da30 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1da40 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20   name qualifier 
1da50 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65  is missing - the
1da60 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20  .** usual case. 
1da70 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73   If the term has
1da80 20 61 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70   a alias, then p
1da90 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20  Alias points to 
1daa0 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b  the.** alias tok
1dab0 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d  en.  If the term
1dac0 20 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20   is a subquery, 
1dad0 74 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69  then pSubquery i
1dae0 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20  s the.** SELECT 
1daf0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74  statement that t
1db00 68 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f  he subquery enco
1db10 64 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65  des.  The pTable
1db20 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73   and.** pDatabas
1db30 65 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  e parameters are
1db40 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65   NULL for subque
1db50 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61  ries.  The pOn a
1db60 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72  nd pUsing.** par
1db70 61 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20  ameters are the 
1db80 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f  content of the O
1db90 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75  N and USING clau
1dba0 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ses..**.** Retur
1dbb0 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  n a new SrcList 
1dbc0 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73  which encodes is
1dbd0 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74   the FROM with t
1dbe0 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61  he new.** term a
1dbf0 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  dded..*/.SrcList
1dc00 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
1dc10 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a  AppendFromTerm(.
1dc20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1dc30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
1dc40 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1dc50 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20    SrcList *p,   
1dc60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1dc70 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68   left part of th
1dc80 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c  e FROM clause al
1dc90 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20  ready seen */.  
1dca0 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
1dcb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1dcc0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
1dcd0 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20  add to the FROM 
1dce0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65  clause */.  Toke
1dcf0 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20  n *pDatabase,   
1dd00 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1dd10 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
1dd20 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f  aining pTable */
1dd30 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73  .  Token *pAlias
1dd40 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
1dd50 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
1dd60 65 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65  e of the AS sube
1dd70 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53  xpression */.  S
1dd80 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79  elect *pSubquery
1dd90 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71  ,      /* A subq
1dda0 75 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61  uery used in pla
1ddb0 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61  ce of a table na
1ddc0 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f  me */.  Expr *pO
1ddd0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1dde0 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65  /* The ON clause
1ddf0 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20   of a join */.  
1de00 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20  IdList *pUsing  
1de10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55          /* The U
1de20 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61  SING clause of a
1de30 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74   join */.){.  st
1de40 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1de50 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69  m *pItem;.  sqli
1de60 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1de70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26  ->db;.  if( !p &
1de80 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67  & (pOn || pUsing
1de90 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
1dea0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1deb0 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20   "a JOIN clause 
1dec0 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  is required befo
1ded0 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28  re %s", .      (
1dee0 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53  pOn ? "ON" : "US
1def0 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20  ING").    );.   
1df00 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f   goto append_fro
1df10 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  m_error;.  }.  p
1df20 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
1df30 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70  tAppend(db, p, p
1df40 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65  Table, pDatabase
1df50 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c  );.  if( p==0 ||
1df60 20 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d   NEVER(p->nSrc==
1df70 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61  0) ){.    goto a
1df80 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1df90 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20  ;.  }.  pItem = 
1dfa0 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d  &p->a[p->nSrc-1]
1dfb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c 69  ;.  assert( pAli
1dfc0 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  as!=0 );.  if( p
1dfd0 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20  Alias->n ){.    
1dfe0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20  pItem->zAlias = 
1dff0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1e000 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29  oken(db, pAlias)
1e010 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70  ;.  }.  pItem->p
1e020 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65  Select = pSubque
1e030 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e  ry;.  pItem->pOn
1e040 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d   = pOn;.  pItem-
1e050 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67  >pUsing = pUsing
1e060 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20  ;.  return p;.. 
1e070 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
1e080 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  r:.  assert( p==
1e090 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  0 );.  sqlite3Ex
1e0a0 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e  prDelete(db, pOn
1e0b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69  );.  sqlite3IdLi
1e0c0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73  stDelete(db, pUs
1e0d0 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ing);.  sqlite3S
1e0e0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
1e0f0 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65  pSubquery);.  re
1e100 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1e110 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20   Add an INDEXED 
1e120 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45  BY or NOT INDEXE
1e130 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20  D clause to the 
1e140 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
1e150 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20  ded .** element 
1e160 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69  of the source-li
1e170 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  st passed as the
1e180 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1e190 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1e1a0 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42  3SrcListIndexedB
1e1b0 79 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  y(Parse *pParse,
1e1c0 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b   SrcList *p, Tok
1e1d0 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b  en *pIndexedBy){
1e1e0 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65  .  assert( pInde
1e1f0 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66  xedBy!=0 );.  if
1e200 28 20 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d  ( p && ALWAYS(p-
1e210 3e 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20 20 20  >nSrc>0) ){.    
1e220 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1e230 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
1e240 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20  >a[p->nSrc-1];. 
1e250 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
1e260 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  ->notIndexed==0 
1e270 26 26 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78  && pItem->zIndex
1e280 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
1e290 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20  IndexedBy->n==1 
1e2a0 26 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e  && !pIndexedBy->
1e2b0 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  z ){.      /* A 
1e2c0 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c  "NOT INDEXED" cl
1e2d0 61 75 73 65 20 77 61 73 20 73 75 70 70 6c 69 65  ause was supplie
1e2e0 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a  d. See parse.y .
1e2f0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75        ** constru
1e300 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22  ct "indexed_opt"
1e310 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f   for details. */
1e320 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 6e 6f  .      pItem->no
1e330 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20  tIndexed = 1;.  
1e340 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1e350 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73  Item->zIndex = s
1e360 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1e370 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
1e380 70 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20  pIndexedBy);.   
1e390 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1e3a0 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70  When building up
1e3b0 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69   a FROM clause i
1e3c0 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20 74 68  n the parser, th
1e3d0 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a  e join operator.
1e3e0 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  ** is initially 
1e3f0 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
1e400 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42  left operand.  B
1e410 75 74 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  ut the code gene
1e420 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73  rator.** expects
1e430 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74   the join operat
1e440 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20  or to be on the 
1e450 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20  right operand.  
1e460 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
1e470 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20  Shifts all join 
1e480 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c  operators from l
1e490 65 66 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72  eft to right for
1e4a0 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a   an entire FROM.
1e4b0 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  ** clause..**.**
1e4c0 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73   Example: Suppos
1e4d0 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69  e the join is li
1e4e0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1e4f0 20 20 20 20 20 20 20 20 20 41 20 6e 61 74 75 72           A natur
1e500 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a  al cross join B.
1e510 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74  **.** The operat
1e520 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63  or is "natural c
1e530 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65  ross join".  The
1e540 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64   A and B operand
1e550 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20  s are stored.** 
1e560 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70  in p->a[0] and p
1e570 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69  ->a[1], respecti
1e580 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65  vely.  The parse
1e590 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72  r initially stor
1e5a0 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  es the.** operat
1e5b0 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68 69 73  or with A.  This
1e5c0 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20   routine shifts 
1e5d0 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76  that operator ov
1e5e0 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64  er to B..*/.void
1e5f0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53   sqlite3SrcListS
1e600 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63  hiftJoinType(Src
1e610 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20  List *p){.  if( 
1e620 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p ){.    int i;.
1e630 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
1e640 20 7c 7c 20 70 2d 3e 6e 53 72 63 3d 3d 30 20 29   || p->nSrc==0 )
1e650 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e  ;.    for(i=p->n
1e660 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  Src-1; i>0; i--)
1e670 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e  {.      p->a[i].
1e680 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b  jointype = p->a[
1e690 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20  i-1].jointype;. 
1e6a0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d     }.    p->a[0]
1e6b0 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20  .jointype = 0;. 
1e6c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69   }.}../*.** Begi
1e6d0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
1e6e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1e6f0 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
1e700 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1e710 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69  nt type){.  sqli
1e720 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
1e730 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  *v;.  int i;..  
1e740 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d  assert( pParse!=
1e750 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  0 );.  db = pPar
1e760 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
1e770 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69  ( db!=0 );./*  i
1e780 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  f( db->aDb[0].pB
1e790 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 2a  t==0 ) return; *
1e7a0 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  /.  if( sqlite3A
1e7b0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1e7c0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
1e7d0 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c  ION, "BEGIN", 0,
1e7e0 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
1e7f0 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c  n;.  }.  v = sql
1e800 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1e810 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20  se);.  if( !v ) 
1e820 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79  return;.  if( ty
1e830 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20  pe!=TK_DEFERRED 
1e840 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
1e850 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
1e860 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1e870 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54  beAddOp2(v, OP_T
1e880 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28  ransaction, i, (
1e890 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49  type==TK_EXCLUSI
1e8a0 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71  VE)+1);.      sq
1e8b0 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
1e8c0 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  ee(v, i);.    }.
1e8d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
1e8e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
1e8f0 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b  toCommit, 0, 0);
1e900 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
1e910 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1e920 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
1e930 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28  mmitTransaction(
1e940 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1e950 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73    Vdbe *v;..  as
1e960 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
1e970 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1e980 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  rse->db!=0 );.  
1e990 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1e9a0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1e9b0 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
1e9c0 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29   "COMMIT", 0, 0)
1e9d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
1e9e0 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
1e9f0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1ea00 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20  ;.  if( v ){.   
1ea10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ea20 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d  p2(v, OP_AutoCom
1ea30 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  mit, 1, 0);.  }.
1ea40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
1ea50 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  k a transaction.
1ea60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
1ea70 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69  ollbackTransacti
1ea80 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
1ea90 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  ){.  Vdbe *v;.. 
1eaa0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
1eab0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1eac0 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b  pParse->db!=0 );
1ead0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
1eae0 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1eaf0 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
1eb00 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20  ON, "ROLLBACK", 
1eb10 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  0, 0) ){.    ret
1eb20 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73  urn;.  }.  v = s
1eb30 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1eb40 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
1eb50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1eb60 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
1eb70 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b  toCommit, 1, 1);
1eb80 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
1eb90 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1eba0 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
1ebb0 73 65 72 20 77 68 65 6e 20 69 74 20 70 61 72 73  ser when it pars
1ebc0 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  es a command to 
1ebd0 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61  create,.** relea
1ebe0 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
1ebf0 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e  n SQL savepoint.
1ec00 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
1ec10 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65  3Savepoint(Parse
1ec20 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70   *pParse, int op
1ec30 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
1ec40 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
1ec50 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1ec60 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
1ec70 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
1ec80 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  zName ){.    Vdb
1ec90 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
1eca0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23  tVdbe(pParse);.#
1ecb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1ecc0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
1ecd0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
1ece0 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61  t char * const a
1ecf0 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c  z[] = { "BEGIN",
1ed00 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c   "RELEASE", "ROL
1ed10 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73  LBACK" };.    as
1ed20 73 65 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54  sert( !SAVEPOINT
1ed30 5f 42 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f  _BEGIN && SAVEPO
1ed40 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26  INT_RELEASE==1 &
1ed50 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  & SAVEPOINT_ROLL
1ed60 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69  BACK==2 );.#endi
1ed70 66 0a 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20  f.    if( !v || 
1ed80 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
1ed90 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
1eda0 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70  SAVEPOINT, az[op
1edb0 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a  ], zName, 0) ){.
1edc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
1edd0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
1ede0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
1edf0 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
1ee00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ee10 34 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e  4(v, OP_Savepoin
1ee20 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61  t, op, 0, 0, zNa
1ee30 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  me, P4_DYNAMIC);
1ee40 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  .  }.}../*.** Ma
1ee50 6b 65 20 73 75 72 65 20 74 68 65 20 54 45 4d 50  ke sure the TEMP
1ee60 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
1ee70 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20  n and available 
1ee80 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e  for use.  Return
1ee90 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
1eea0 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65  f errors.  Leave
1eeb0 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
1eec0 67 65 73 20 69 6e 20 74 68 65 20 70 50 61 72 73  ges in the pPars
1eed0 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
1eee0 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  int sqlite3OpenT
1eef0 65 6d 70 44 61 74 61 62 61 73 65 28 50 61 72 73  empDatabase(Pars
1ef00 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
1ef10 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1ef20 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62  se->db;.  if( db
1ef30 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20  ->aDb[1].pBt==0 
1ef40 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c  && !pParse->expl
1ef50 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ain ){.    int r
1ef60 63 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  c;.    Btree *pB
1ef70 74 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  t;.    static co
1ef80 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
1ef90 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
1efa0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1efb0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
1efc0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
1efd0 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
1efe0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
1eff0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
1f000 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
1f010 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20  ONCLOSE |.      
1f020 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1f030 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63  TEMP_DB;..    rc
1f040 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f   = sqlite3BtreeO
1f050 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c  pen(db->pVfs, 0,
1f060 20 64 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c   db, &pBt, 0, fl
1f070 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ags);.    if( rc
1f080 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f090 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1f0a0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
1f0b0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74  able to open a t
1f0c0 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
1f0d0 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c  e ".        "fil
1f0e0 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65  e for storing te
1f0f0 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29  mporary tables")
1f100 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
1f110 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  rc = rc;.      r
1f120 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
1f130 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42     db->aDb[1].pB
1f140 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73  t = pBt;.    ass
1f150 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  ert( db->aDb[1].
1f160 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69  pSchema );.    i
1f170 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d  f( SQLITE_NOMEM=
1f180 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74  =sqlite3BtreeSet
1f190 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62  PageSize(pBt, db
1f1a0 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20  ->nextPagesize, 
1f1b0 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  -1, 0) ){.      
1f1c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1f1d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
1f1e0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1f1f0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1f200 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20  *.** Record the 
1f210 66 61 63 74 20 74 68 61 74 20 74 68 65 20 73 63  fact that the sc
1f220 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c 6c  hema cookie will
1f230 20 6e 65 65 64 20 74 6f 20 62 65 20 76 65 72 69   need to be veri
1f240 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74 61  fied.** for data
1f250 62 61 73 65 20 69 44 62 2e 20 20 54 68 65 20 63  base iDb.  The c
1f260 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79 20  ode to actually 
1f270 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65 6d  verify the schem
1f280 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c  a cookie.** will
1f290 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65 6e   occur at the en
1f2a0 64 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76  d of the top-lev
1f2b0 65 6c 20 56 44 42 45 20 61 6e 64 20 77 69 6c 6c  el VDBE and will
1f2c0 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a   be generated.**
1f2d0 20 6c 61 74 65 72 2c 20 62 79 20 73 71 6c 69 74   later, by sqlit
1f2e0 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29  e3FinishCoding()
1f2f0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1f300 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
1f310 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  a(Parse *pParse,
1f320 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72   int iDb){.  Par
1f330 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
1f340 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
1f350 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
1f360 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 54  sqlite3 *db = pT
1f370 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b 0a 0a 20 20  oplevel->db;..  
1f380 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
1f390 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
1f3a0 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61  .  assert( db->a
1f3b0 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c  Db[iDb].pBt!=0 |
1f3c0 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73  | iDb==1 );.  as
1f3d0 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45  sert( iDb<SQLITE
1f3e0 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20  _MAX_ATTACHED+2 
1f3f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1f400 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
1f410 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
1f420 29 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 54  );.  if( DbMaskT
1f430 65 73 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63  est(pToplevel->c
1f440 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d  ookieMask, iDb)=
1f450 3d 30 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b  =0 ){.    DbMask
1f460 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63  Set(pToplevel->c
1f470 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b  ookieMask, iDb);
1f480 0a 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  .    pToplevel->
1f490 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d  cookieValue[iDb]
1f4a0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
1f4b0 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f  pSchema->schema_
1f4c0 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 69 66 28 20  cookie;.    if( 
1f4d0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
1f4e0 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
1f4f0 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
1f500 61 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76 65  atabase(pTopleve
1f510 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
1f520 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ./*.** If argume
1f530 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20  nt zDb is NULL, 
1f540 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65  then call sqlite
1f550 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
1f560 61 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a  a() for each .**
1f570 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
1f580 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  se. Otherwise, i
1f590 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68 65  nvoke it for the
1f5a0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20   database named 
1f5b0 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69  zDb only..*/.voi
1f5c0 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  d sqlite3CodeVer
1f5d0 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 50  ifyNamedSchema(P
1f5e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
1f5f0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
1f600 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1f610 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
1f620 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1f630 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
1f640 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
1f650 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
1f660 69 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26 20  if( pDb->pBt && 
1f670 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c 69  (!zDb || 0==sqli
1f680 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20  te3StrICmp(zDb, 
1f690 70 44 62 2d 3e 7a 4e 61 6d 65 29 29 20 29 7b 0a  pDb->zName)) ){.
1f6a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
1f6b0 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
1f6c0 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  arse, i);.    }.
1f6d0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
1f6e0 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
1f6f0 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f  that prepares fo
1f700 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61  r doing an opera
1f710 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67  tion that.** mig
1f720 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61  ht change the da
1f730 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  tabase..**.** Th
1f740 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74  is routine start
1f750 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  s a new transact
1f760 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f  ion if we are no
1f770 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e  t already within
1f780 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f  .** a transactio
1f790 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c  n.  If we are al
1f7a0 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74  ready within a t
1f7b0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
1f7c0 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a   a checkpoint.**
1f7d0 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73   is set if the s
1f7e0 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61  etStatement para
1f7f0 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20  meter is true.  
1f800 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  A checkpoint sho
1f810 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f  uld.** be set fo
1f820 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61  r operations tha
1f830 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75  t might fail (du
1f840 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e  e to a constrain
1f850 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68  t) part of.** th
1f860 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e  e way through an
1f870 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65  d which will nee
1f880 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77  d to undo some w
1f890 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61  rites without ha
1f8a0 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62  ving to.** rollb
1f8b0 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72  ack the whole tr
1f8c0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20  ansaction.  For 
1f8d0 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65  operations where
1f8e0 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
1f8f0 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b  .** can be check
1f900 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68  ed before any ch
1f910 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
1f920 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  o the database, 
1f930 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e  it is never.** n
1f940 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f  ecessary to undo
1f950 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65   a write and the
1f960 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
1f970 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a  ld not be set..*
1f980 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
1f990 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
1f9a0 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
1f9b0 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e   int setStatemen
1f9c0 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50  t, int iDb){.  P
1f9d0 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
1f9e0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
1f9f0 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
1fa00 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
1fa10 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
1fa20 2c 20 69 44 62 29 3b 0a 20 20 44 62 4d 61 73 6b  , iDb);.  DbMask
1fa30 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 77  Set(pToplevel->w
1fa40 72 69 74 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a  riteMask, iDb);.
1fa50 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d    pToplevel->isM
1fa60 75 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65 74  ultiWrite |= set
1fa70 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a  Statement;.}../*
1fa80 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
1fa90 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
1faa0 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
1fab0 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69 67  construction mig
1fac0 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65  ht write.** more
1fad0 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20   than one entry 
1fae0 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69  (example: deleti
1faf0 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20  ng one row then 
1fb00 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68 65  inserting anothe
1fb10 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20  r,.** inserting 
1fb20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69 6e  multiple rows in
1fb30 20 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73   a table, or ins
1fb40 65 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e 64  erting a row and
1fb50 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e 29   index entries.)
1fb60 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74 20  .** If an abort 
1fb70 6f 63 63 75 72 73 20 61 66 74 65 72 20 73 6f 6d  occurs after som
1fb80 65 20 6f 66 20 74 68 65 73 65 20 77 72 69 74 65  e of these write
1fb90 73 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64  s have completed
1fba0 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a  , then it will.*
1fbb0 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74  * be necessary t
1fbc0 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c  o undo the compl
1fbd0 65 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a  eted writes..*/.
1fbe0 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c 74  void sqlite3Mult
1fbf0 69 57 72 69 74 65 28 50 61 72 73 65 20 2a 70 50  iWrite(Parse *pP
1fc00 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a  arse){.  Parse *
1fc10 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
1fc20 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
1fc30 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70  (pParse);.  pTop
1fc40 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72  level->isMultiWr
1fc50 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a  ite = 1;.}../* .
1fc60 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65  ** The code gene
1fc70 72 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69 73  rator calls this
1fc80 20 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20 64   routine if is d
1fc90 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 69 74  iscovers that it
1fca0 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20   is.** possible 
1fcb0 74 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74 65  to abort a state
1fcc0 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63 6f  ment prior to co
1fcd0 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72  mpletion.  In or
1fce0 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f  der to .** perfo
1fcf0 72 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77 69  rm this abort wi
1fd00 74 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e 67  thout corrupting
1fd10 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 77   the database, w
1fd20 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a  e need to make.*
1fd30 2a 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  * sure that the 
1fd40 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72 6f  statement is pro
1fd50 74 65 63 74 65 64 20 62 79 20 61 20 73 74 61 74  tected by a stat
1fd60 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
1fd70 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63  n..**.** Technic
1fd80 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65  ally, we only ne
1fd90 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61  ed to set the ma
1fda0 79 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20 74  yAbort flag if t
1fdb0 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69  he.** isMultiWri
1fdc0 74 65 20 66 6c 61 67 20 77 61 73 20 70 72 65 76  te flag was prev
1fdd0 69 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68 65  iously set.  The
1fde0 72 65 20 69 73 20 61 20 74 69 6d 65 20 64 65 70  re is a time dep
1fdf0 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20  endency.** such 
1fe00 74 68 61 74 20 74 68 65 20 61 62 6f 72 74 20 6d  that the abort m
1fe10 75 73 74 20 6f 63 63 75 72 20 61 66 74 65 72 20  ust occur after 
1fe20 74 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e 20  the multiwrite. 
1fe30 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73   This makes.** s
1fe40 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69  ome statements i
1fe50 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45 50  nvolving the REP
1fe60 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72 65  LACE conflict re
1fe70 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
1fe80 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c  hm.** go a littl
1fe90 65 20 66 61 73 74 65 72 2e 20 20 42 75 74 20 74  e faster.  But t
1fea0 61 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65 20  aking advantage 
1feb0 6f 66 20 74 68 69 73 20 74 69 6d 65 20 64 65 70  of this time dep
1fec0 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73  endency.** makes
1fed0 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63 75   it more difficu
1fee0 6c 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74  lt to prove that
1fef0 20 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f 72   the code is cor
1ff00 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72  rect (in .** par
1ff10 74 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65 76  ticular, it prev
1ff20 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72 69  ents us from wri
1ff30 74 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69 76  ting an effectiv
1ff40 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
1ff50 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41 73  ion of sqlite3As
1ff60 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29 20  sertMayAbort()) 
1ff70 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20 63  and so we have c
1ff80 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65  hosen.** to take
1ff90 20 74 68 65 20 73 61 66 65 20 72 6f 75 74 65 20   the safe route 
1ffa0 61 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70 74  and skip the opt
1ffb0 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  imization..*/.vo
1ffc0 69 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f  id sqlite3MayAbo
1ffd0 72 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rt(Parse *pParse
1ffe0 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70  ){.  Parse *pTop
1fff0 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50  level = sqlite3P
20000 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61  arseToplevel(pPa
20010 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  rse);.  pTopleve
20020 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b  l->mayAbort = 1;
20030 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
20040 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20 63  n OP_Halt that c
20050 61 75 73 65 73 20 74 68 65 20 76 64 62 65 20 74  auses the vdbe t
20060 6f 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  o return an SQLI
20070 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a  TE_CONSTRAINT.**
20080 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72   error. The onEr
20090 72 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64 65  ror parameter de
200a0 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 28  termines which (
200b0 69 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20 73  if any) of the s
200c0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f  tatement.** and/
200d0 6f 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  or current trans
200e0 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
200f0 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73   back..*/.void s
20100 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
20110 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
20120 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
20130 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
20140 20 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 20    int errCode,  
20150 20 20 20 20 2f 2a 20 65 78 74 65 6e 64 65 64 20      /* extended 
20160 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
20170 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20  int onError,    
20180 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20    /* Constraint 
20190 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  type */.  char *
201a0 70 34 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45  p4,         /* E
201b0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a  rror message */.
201c0 20 20 69 38 20 70 34 74 79 70 65 2c 20 20 20 20    i8 p4type,    
201d0 20 20 20 20 2f 2a 20 50 34 5f 53 54 41 54 49 43      /* P4_STATIC
201e0 20 6f 72 20 50 34 5f 54 52 41 4e 53 49 45 4e 54   or P4_TRANSIENT
201f0 20 2a 2f 0a 20 20 75 38 20 70 35 45 72 72 6d 73   */.  u8 p5Errms
20200 67 20 20 20 20 20 20 20 2f 2a 20 50 35 5f 45 72  g       /* P5_Er
20210 72 4d 73 67 20 74 79 70 65 20 2a 2f 0a 29 7b 0a  rMsg type */.){.
20220 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
20230 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
20240 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65  e);.  assert( (e
20250 72 72 43 6f 64 65 26 30 78 66 66 29 3d 3d 53 51  rrCode&0xff)==SQ
20260 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
20270 29 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  );.  if( onError
20280 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
20290 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
202a0 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20  t(pParse);.  }. 
202b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
202c0 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65  p4(v, OP_Halt, e
202d0 72 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c  rrCode, onError,
202e0 20 30 2c 20 70 34 2c 20 70 34 74 79 70 65 29 3b   0, p4, p4type);
202f0 0a 20 20 69 66 28 20 70 35 45 72 72 6d 73 67 20  .  if( p5Errmsg 
20300 29 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  ) sqlite3VdbeCha
20310 6e 67 65 50 35 28 76 2c 20 70 35 45 72 72 6d 73  ngeP5(v, p5Errms
20320 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64  g);.}../*.** Cod
20330 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65  e an OP_Halt due
20340 20 74 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52   to UNIQUE or PR
20350 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
20360 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a  aint violation..
20370 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
20380 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28  niqueConstraint(
20390 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
203a0 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
203b0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
203c0 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
203d0 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70  * Constraint typ
203e0 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  e */.  Index *pI
203f0 64 78 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  dx       /* The 
20400 69 6e 64 65 78 20 74 68 61 74 20 74 72 69 67 67  index that trigg
20410 65 72 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69  ers the constrai
20420 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
20430 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a  *zErr;.  int j;.
20440 20 20 53 74 72 41 63 63 75 6d 20 65 72 72 4d 73    StrAccum errMs
20450 67 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  g;.  Table *pTab
20460 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b   = pIdx->pTable;
20470 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  ..  sqlite3StrAc
20480 63 75 6d 49 6e 69 74 28 26 65 72 72 4d 73 67 2c  cumInit(&errMsg,
20490 20 30 2c 20 30 2c 20 32 30 30 29 3b 0a 20 20 65   0, 0, 200);.  e
204a0 72 72 4d 73 67 2e 64 62 20 3d 20 70 50 61 72 73  rrMsg.db = pPars
204b0 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 6a 3d 30  e->db;.  for(j=0
204c0 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; j<pIdx->nKeyCo
204d0 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 63 68 61  l; j++){.    cha
204e0 72 20 2a 7a 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  r *zCol = pTab->
204f0 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c  aCol[pIdx->aiCol
20500 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a 20  umn[j]].zName;. 
20510 20 20 20 69 66 28 20 6a 20 29 20 73 71 6c 69 74     if( j ) sqlit
20520 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
20530 28 26 65 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20  (&errMsg, ", ", 
20540 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  2);.    sqlite3S
20550 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c  trAccumAppendAll
20560 28 26 65 72 72 4d 73 67 2c 20 70 54 61 62 2d 3e  (&errMsg, pTab->
20570 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
20580 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
20590 64 28 26 65 72 72 4d 73 67 2c 20 22 2e 22 2c 20  d(&errMsg, ".", 
205a0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  1);.    sqlite3S
205b0 74 72 41 63 63 75 6d 41 70 70 65 6e 64 41 6c 6c  trAccumAppendAll
205c0 28 26 65 72 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b  (&errMsg, zCol);
205d0 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71  .  }.  zErr = sq
205e0 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
205f0 69 73 68 28 26 65 72 72 4d 73 67 29 3b 0a 20 20  ish(&errMsg);.  
20600 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
20610 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 0a 20  raint(pParse, . 
20620 20 20 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49     IsPrimaryKeyI
20630 6e 64 65 78 28 70 49 64 78 29 20 3f 20 53 51 4c  ndex(pIdx) ? SQL
20640 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
20650 52 49 4d 41 52 59 4b 45 59 20 0a 20 20 20 20 20  RIMARYKEY .     
20660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20670 20 20 20 20 20 20 20 3a 20 53 51 4c 49 54 45 5f         : SQLITE_
20680 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55  CONSTRAINT_UNIQU
20690 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20  E,.    onError, 
206a0 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zErr, P4_DYNAMIC
206b0 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55  , P5_ConstraintU
206c0 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  nique);.}.../*.*
206d0 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
206e0 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69  t due to non-uni
206f0 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f  que rowid..*/.vo
20700 69 64 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43  id sqlite3RowidC
20710 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
20720 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
20730 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
20740 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72  t */.  int onErr
20750 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66  or,      /* Conf
20760 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20  lict resolution 
20770 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54  algorithm */.  T
20780 61 62 6c 65 20 2a 70 54 61 62 20 20 20 20 20 20  able *pTab      
20790 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 77 69   /* The table wi
207a0 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75  th the non-uniqu
207b0 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20  e rowid */ .){. 
207c0 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69   char *zMsg;.  i
207d0 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 54 61  nt rc;.  if( pTa
207e0 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20  b->iPKey>=0 ){. 
207f0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
20800 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
20810 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54  >db, "%s.%s", pT
20820 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  ab->zName,.     
20830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20840 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
20850 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61  pTab->iPKey].zNa
20860 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
20870 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
20880 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65  PRIMARYKEY;.  }e
20890 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20  lse{.    zMsg = 
208a0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70  sqlite3MPrintf(p
208b0 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72  Parse->db, "%s.r
208c0 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  owid", pTab->zNa
208d0 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
208e0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
208f0 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c  ROWID;.  }.  sql
20900 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
20910 6e 74 28 70 50 61 72 73 65 2c 20 72 63 2c 20 6f  nt(pParse, rc, o
20920 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34  nError, zMsg, P4
20930 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20  _DYNAMIC,.      
20940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20950 20 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55    P5_ConstraintU
20960 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nique);.}../*.**
20970 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
20980 20 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65   pIndex uses the
20990 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
209a0 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75  nce pColl.  Retu
209b0 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74  rn.** true if it
209c0 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20   does and false 
209d0 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
209e0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
209f0 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
20a00 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74  tatic int collat
20a10 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63  ionMatch(const c
20a20 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65  har *zColl, Inde
20a30 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e  x *pIndex){.  in
20a40 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  t i;.  assert( z
20a50 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72  Coll!=0 );.  for
20a60 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e  (i=0; i<pIndex->
20a70 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
20a80 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
20a90 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c   = pIndex->azCol
20aa0 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  l[i];.    assert
20ab0 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78  ( z!=0 || pIndex
20ac0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20  ->aiColumn[i]<0 
20ad0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
20ae0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d  x->aiColumn[i]>=
20af0 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53  0 && 0==sqlite3S
20b00 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29  trICmp(z, zColl)
20b10 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
20b20 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
20b30 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
20b40 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
20b50 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
20b60 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65  of pTab that use
20b70 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
20b80 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a  equence pColl..*
20b90 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68  * If pColl==0 th
20ba0 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c  en recompute all
20bb0 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62   indices of pTab
20bc0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
20bd0 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
20be0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69  .static void rei
20bf0 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20  ndexTable(Parse 
20c00 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
20c10 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74  pTab, char const
20c20 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65   *zColl){.  Inde
20c30 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
20c40 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
20c50 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
20c60 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66  ith pTab */..  f
20c70 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e  or(pIndex=pTab->
20c80 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
20c90 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70  pIndex=pIndex->p
20ca0 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a  Next){.    if( z
20cb0 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61  Coll==0 || colla
20cc0 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c  tionMatch(zColl,
20cd0 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20   pIndex) ){.    
20ce0 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
20cf0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
20d00 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
20d10 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
20d20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
20d30 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
20d40 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20  arse, 0, iDb);. 
20d50 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69       sqlite3Refi
20d60 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  llIndex(pParse, 
20d70 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20  pIndex, -1);.   
20d80 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
20d90 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65  ./*.** Recompute
20da0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
20db0 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c  all tables in al
20dc0 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72  l databases wher
20dd0 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73  e the.** indices
20de0 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
20df0 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
20e00 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20  l.  If pColl==0 
20e10 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a  then recompute.*
20e20 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76  * all indices ev
20e30 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66  erywhere..*/.#if
20e40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20e50 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
20e60 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61  void reindexData
20e70 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61  bases(Parse *pPa
20e80 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  rse, char const 
20e90 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70  *zColl){.  Db *p
20ea0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
20eb0 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
20ec0 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
20ed0 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20ef0 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
20f00 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  ex number */.  s
20f10 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
20f20 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68  rse->db;   /* Th
20f30 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
20f40 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45  ction */.  HashE
20f50 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20  lem *k;         
20f60 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
20f70 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65  oping over table
20f80 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61  s in pDb */.  Ta
20f90 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
20fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74            /* A t
20fb0 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
20fc0 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  base */..  asser
20fd0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
20fe0 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64  oldsAllMutexes(d
20ff0 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64  b) );  /* Needed
21000 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
21010 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d  ss */.  for(iDb=
21020 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20  0, pDb=db->aDb; 
21030 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62  iDb<db->nDb; iDb
21040 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20  ++, pDb++){.    
21050 61 73 73 65 72 74 28 20 70 44 62 21 3d 30 20 29  assert( pDb!=0 )
21060 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69  ;.    for(k=sqli
21070 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62  teHashFirst(&pDb
21080 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
21090 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74  sh);  k; k=sqlit
210a0 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20  eHashNext(k)){. 
210b0 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62       pTab = (Tab
210c0 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  le*)sqliteHashDa
210d0 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69  ta(k);.      rei
210e0 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65  ndexTable(pParse
210f0 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  , pTab, zColl);.
21100 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
21110 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  if../*.** Genera
21120 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
21130 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
21140 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  .**.**        RE
21150 49 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20  INDEX           
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21170 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20   -- 1.**        
21180 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74  REINDEX  <collat
21190 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20  ion>            
211a0 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20     -- 2.**      
211b0 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
211c0 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61  abase>.?<tablena
211d0 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20  me>  -- 3.**    
211e0 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
211f0 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78  atabase>.?<index
21200 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a  name>  -- 4.**.*
21210 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20  * Form 1 causes 
21220 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61  all indices in a
21230 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
21240 62 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75  bases to be rebu
21250 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72  ilt..** Form 2 r
21260 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69  ebuilds all indi
21270 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62  ces in all datab
21280 61 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68  ases that use th
21290 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61  e named.** colla
212a0 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20  ting function.  
212b0 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65  Forms 3 and 4 re
212c0 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20  build the named 
212d0 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20  index or all.** 
212e0 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
212f0 65 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  ed with the name
21300 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e  d table..*/.#ifn
21310 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21320 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c  REINDEX.void sql
21330 69 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73  ite3Reindex(Pars
21340 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
21350 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20   *pName1, Token 
21360 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c  *pName2){.  Coll
21370 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
21380 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
21390 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
213a0 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f   be reindexed, o
213b0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72  r NULL */.  char
213c0 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
213d0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
213e0 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  of a table or in
213f0 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dex */.  const c
21400 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20  har *zDb;       
21410 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
21420 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
21430 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
21440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21450 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
21460 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e  database */.  In
21470 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20  dex *pIndex;    
21480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
21490 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
214a0 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20   with pTab */.  
214b0 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
214c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
214d0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
214e0 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
214f0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
21500 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
21510 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
21520 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  tion */.  Token 
21530 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20  *pObjName;      
21540 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
21550 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e   the table or in
21560 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65  dex to be reinde
21570 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61  xed */..  /* Rea
21580 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
21590 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72  chema. If an err
215a0 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
215b0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
215c0 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20  e.  ** and code 
215d0 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
215e0 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  turn NULL. */.  
215f0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
21600 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
21610 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
21620 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69  return;.  }..  i
21630 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a  f( pName1==0 ){.
21640 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
21650 61 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b  ases(pParse, 0);
21660 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
21670 65 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 70  else if( NEVER(p
21680 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61  Name2==0) || pNa
21690 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  me2->z==0 ){.   
216a0 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20   char *zColl;.  
216b0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
216c0 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c  ->z );.    zColl
216d0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
216e0 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
216f0 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  db, pName1);.   
21700 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65   if( !zColl ) re
21710 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20  turn;.    pColl 
21720 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
21730 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29  lSeq(db, ENC(db)
21740 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20  , zColl, 0);.   
21750 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
21760 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
21770 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f  ases(pParse, zCo
21780 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
21790 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f  e3DbFree(db, zCo
217a0 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ll);.      retur
217b0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  n;.    }.    sql
217c0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
217d0 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62  Coll);.  }.  iDb
217e0 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
217f0 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
21800 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
21810 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ObjName);.  if( 
21820 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
21830 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d    z = sqlite3Nam
21840 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
21850 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ObjName);.  if( 
21860 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
21870 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69   zDb = db->aDb[i
21880 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  Db].zName;.  pTa
21890 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
218a0 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29  able(db, z, zDb)
218b0 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a  ;.  if( pTab ){.
218c0 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
218d0 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30  (pParse, pTab, 0
218e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
218f0 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
21900 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
21910 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
21920 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20  indIndex(db, z, 
21930 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  zDb);.  sqlite3D
21940 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
21950 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
21960 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
21970 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
21980 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
21990 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
219a0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
219b0 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  dex, -1);.    re
219c0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
219d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
219e0 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69  se, "unable to i
219f0 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65  dentify the obje
21a00 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ct to be reindex
21a10 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ed");.}.#endif..
21a20 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 4b  /*.** Return a K
21a30 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
21a40 20 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72   that is appropr
21a50 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76  iate for the giv
21a60 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20  en Index..**.** 
21a70 54 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  The KeyInfo stru
21a80 63 74 75 72 65 20 66 6f 72 20 61 6e 20 69 6e 64  cture for an ind
21a90 65 78 20 69 73 20 63 61 63 68 65 64 20 69 6e 20  ex is cached in 
21aa0 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
21ab0 2e 0a 2a 2a 20 53 6f 20 74 68 65 72 65 20 6d 69  ..** So there mi
21ac0 67 68 74 20 62 65 20 6d 75 6c 74 69 70 6c 65 20  ght be multiple 
21ad0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
21ae0 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74  e returned point
21af0 65 72 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  er.  The.** call
21b00 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 74 72  er should not tr
21b10 79 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20  y to modify the 
21b20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  KeyInfo object..
21b30 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
21b40 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73   should invoke s
21b50 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
21b60 65 66 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75  ef() on the retu
21b70 72 6e 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77  rned object.** w
21b80 68 65 6e 20 69 74 20 68 61 73 20 66 69 6e 69 73  hen it has finis
21b90 68 65 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f  hed using it..*/
21ba0 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65  .KeyInfo *sqlite
21bb0 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28  3KeyInfoOfIndex(
21bc0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
21bd0 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69  ndex *pIdx){.  i
21be0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
21bf0 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 69 66 6e  ) return 0;.#ifn
21c00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21c10 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69  SHARED_CACHE.  i
21c20 66 28 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66  f( pIdx->pKeyInf
21c30 6f 20 26 26 20 70 49 64 78 2d 3e 70 4b 65 79 49  o && pIdx->pKeyI
21c40 6e 66 6f 2d 3e 64 62 21 3d 70 50 61 72 73 65 2d  nfo->db!=pParse-
21c50 3e 64 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >db ){.    sqlit
21c60 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
21c70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a  Idx->pKeyInfo);.
21c80 20 20 20 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e      pIdx->pKeyIn
21c90 66 6f 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  fo = 0;.  }.#end
21ca0 69 66 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70  if.  if( pIdx->p
21cb0 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  KeyInfo==0 ){.  
21cc0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
21cd0 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43   nCol = pIdx->nC
21ce0 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 6e 74 20 6e  olumn;.    int n
21cf0 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79  Key = pIdx->nKey
21d00 43 6f 6c 3b 0a 20 20 20 20 4b 65 79 49 6e 66 6f  Col;.    KeyInfo
21d10 20 2a 70 4b 65 79 3b 0a 20 20 20 20 69 66 28 20   *pKey;.    if( 
21d20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  pIdx->uniqNotNul
21d30 6c 20 29 7b 0a 20 20 20 20 20 20 70 4b 65 79 20  l ){.      pKey 
21d40 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  = sqlite3KeyInfo
21d50 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
21d60 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65  , nKey, nCol-nKe
21d70 79 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  y);.    }else{. 
21d80 20 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69       pKey = sqli
21d90 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28  te3KeyInfoAlloc(
21da0 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c  pParse->db, nCol
21db0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
21dc0 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
21dd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21de0 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61  3KeyInfoIsWritea
21df0 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20 20 20  ble(pKey) );.   
21e00 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
21e10 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
21e20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20    char *zColl = 
21e30 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  pIdx->azColl[i];
21e40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
21e50 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 20   zColl!=0 );.   
21e60 20 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c       pKey->aColl
21e70 5b 69 5d 20 3d 20 73 74 72 63 6d 70 28 7a 43 6f  [i] = strcmp(zCo
21e80 6c 6c 2c 22 42 49 4e 41 52 59 22 29 3d 3d 30 20  ll,"BINARY")==0 
21e90 3f 20 30 20 3a 0a 20 20 20 20 20 20 20 20 20 20  ? 0 :.          
21ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21eb0 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
21ec0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
21ed0 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65  ll);.        pKe
21ee0 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  y->aSortOrder[i]
21ef0 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72   = pIdx->aSortOr
21f00 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  der[i];.      }.
21f10 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
21f20 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ->nErr ){.      
21f30 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
21f40 55 6e 72 65 66 28 70 4b 65 79 29 3b 0a 20 20 20  Unref(pKey);.   
21f50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21f60 20 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f    pIdx->pKeyInfo
21f70 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d   = pKey;.      }
21f80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
21f90 75 72 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  urn sqlite3KeyIn
21fa0 66 6f 52 65 66 28 70 49 64 78 2d 3e 70 4b 65 79  foRef(pIdx->pKey
21fb0 49 6e 66 6f 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  Info);.}..#ifnde
21fc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
21fd0 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  E./* .** This ro
21fe0 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
21ff0 20 6f 6e 63 65 20 70 65 72 20 43 54 45 20 62 79   once per CTE by
22000 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
22010 65 20 70 61 72 73 69 6e 67 20 61 20 0a 2a 2a 20  e parsing a .** 
22020 57 49 54 48 20 63 6c 61 75 73 65 2e 20 0a 2a 2f  WITH clause. .*/
22030 0a 57 69 74 68 20 2a 73 71 6c 69 74 65 33 57 69  .With *sqlite3Wi
22040 74 68 41 64 64 28 0a 20 20 50 61 72 73 65 20 2a  thAdd(.  Parse *
22050 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
22060 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
22070 65 78 74 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70  ext */.  With *p
22080 57 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  With,           
22090 20 2f 2a 20 45 78 69 73 74 69 6e 67 20 57 49 54   /* Existing WIT
220a0 48 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c  H clause, or NUL
220b0 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  L */.  Token *pN
220c0 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ame,           /
220d0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
220e0 6d 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20 20  mmon-table */.  
220f0 45 78 70 72 4c 69 73 74 20 2a 70 41 72 67 6c 69  ExprList *pArgli
22100 73 74 2c 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f  st,     /* Optio
22110 6e 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  nal column name 
22120 6c 69 73 74 20 66 6f 72 20 74 68 65 20 74 61 62  list for the tab
22130 6c 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  le */.  Select *
22140 70 51 75 65 72 79 20 20 20 20 20 20 20 20 20 20  pQuery          
22150 2f 2a 20 51 75 65 72 79 20 75 73 65 64 20 74 6f  /* Query used to
22160 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
22170 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71  table */.){.  sq
22180 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
22190 73 65 2d 3e 64 62 3b 0a 20 20 57 69 74 68 20 2a  se->db;.  With *
221a0 70 4e 65 77 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  pNew;.  char *zN
221b0 61 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ame;..  /* Check
221c0 20 74 68 61 74 20 74 68 65 20 43 54 45 20 6e 61   that the CTE na
221d0 6d 65 20 69 73 20 75 6e 69 71 75 65 20 77 69 74  me is unique wit
221e0 68 69 6e 20 74 68 69 73 20 57 49 54 48 20 63 6c  hin this WITH cl
221f0 61 75 73 65 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f  ause. If.  ** no
22200 74 2c 20 73 74 6f 72 65 20 61 6e 20 65 72 72 6f  t, store an erro
22210 72 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73  r in the Parse s
22220 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 7a  tructure. */.  z
22230 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
22240 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
22250 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  se->db, pName);.
22260 20 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 70    if( zName && p
22270 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20  With ){.    int 
22280 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
22290 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69  i<pWith->nCte; i
222a0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
222b0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e  qlite3StrICmp(zN
222c0 61 6d 65 2c 20 70 57 69 74 68 2d 3e 61 5b 69 5d  ame, pWith->a[i]
222d0 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
222e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
222f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
22300 75 70 6c 69 63 61 74 65 20 57 49 54 48 20 74 61  uplicate WITH ta
22310 62 6c 65 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  ble name: %s", z
22320 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
22330 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
22340 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74  pWith ){.    int
22350 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
22360 2a 70 57 69 74 68 29 20 2b 20 28 73 69 7a 65 6f  *pWith) + (sizeo
22370 66 28 70 57 69 74 68 2d 3e 61 5b 31 5d 29 20 2a  f(pWith->a[1]) *
22380 20 70 57 69 74 68 2d 3e 6e 43 74 65 29 3b 0a 20   pWith->nCte);. 
22390 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
223a0 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70  3DbRealloc(db, p
223b0 57 69 74 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20  With, nByte);.  
223c0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 20  }else{.    pNew 
223d0 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
223e0 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
223f0 28 2a 70 57 69 74 68 29 29 3b 0a 20 20 7d 0a 20  (*pWith));.  }. 
22400 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d   assert( zName!=
22410 30 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 3b 0a  0 || pNew==0 );.
22420 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
22430 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c  llocFailed==0 ||
22440 20 70 4e 65 77 3d 3d 30 20 29 3b 0a 0a 20 20 69   pNew==0 );..  i
22450 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
22460 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
22470 74 44 65 6c 65 74 65 28 64 62 2c 20 70 41 72 67  tDelete(db, pArg
22480 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  list);.    sqlit
22490 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
224a0 62 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 20 20  b, pQuery);.    
224b0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
224c0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  , zName);.    pN
224d0 65 77 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65  ew = pWith;.  }e
224e0 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  lse{.    pNew->a
224f0 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65  [pNew->nCte].pSe
22500 6c 65 63 74 20 3d 20 70 51 75 65 72 79 3b 0a 20  lect = pQuery;. 
22510 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
22520 3e 6e 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70  >nCte].pCols = p
22530 41 72 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65  Arglist;.    pNe
22540 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d  w->a[pNew->nCte]
22550 2e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a  .zName = zName;.
22560 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77      pNew->a[pNew
22570 2d 3e 6e 43 74 65 5d 2e 7a 45 72 72 20 3d 20 30  ->nCte].zErr = 0
22580 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65  ;.    pNew->nCte
22590 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ++;.  }..  retur
225a0 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
225b0 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e   Free the conten
225c0 74 73 20 6f 66 20 74 68 65 20 57 69 74 68 20 6f  ts of the With o
225d0 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
225e0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
225f0 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
22600 69 74 65 33 57 69 74 68 44 65 6c 65 74 65 28 73  ite3WithDelete(s
22610 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 68  qlite3 *db, With
22620 20 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28 20   *pWith){.  if( 
22630 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74  pWith ){.    int
22640 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
22650 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20   i<pWith->nCte; 
22660 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
22670 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20 26  ct Cte *pCte = &
22680 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20  pWith->a[i];.   
22690 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
226a0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74  stDelete(db, pCt
226b0 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20  e->pCols);.     
226c0 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
226d0 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e 70  lete(db, pCte->p
226e0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73  Select);.      s
226f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
22700 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCte->zName);. 
22710 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
22720 44 62 46 72 65 65 28 64 62 2c 20 70 57 69 74 68  DbFree(db, pWith
22730 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
22740 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
22750 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a  TE_OMIT_CTE) */.