/ Hex Artifact Content
Login

Artifact c26b233dcdb1e2c8f468d49236c266f9f3de96d8:


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 61 73 73 65 72 74 28 20 7a  t i;.  assert( z
24c0: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 2f 2a 20  Name!=0 );.  /* 
24d0: 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72 65 20  All mutexes are 
24e0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 73 63 68  required for sch
24f0: 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d 61 6b  ema access.  Mak
2500: 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64 20 74  e sure we hold t
2510: 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  hem. */.  assert
2520: 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 7c  ( zDatabase!=0 |
2530: 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  | sqlite3BtreeHo
2540: 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
2550: 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49  ) );.  for(i=OMI
2560: 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e  T_TEMPDB; i<db->
2570: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
2580: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
2590: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
25a0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
25b0: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
25c0: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20  zDatabase!=0 && 
25d0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
25e0: 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44  Database, db->aD
25f0: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
2600: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
2610: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
2620: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a  aMutexHeld(db, j
2630: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  , 0) );.    p = 
2640: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2650: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68  &db->aDb[j].pSch
2660: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  ema->tblHash, zN
2670: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20  ame);.    if( p 
2680: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
2690: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
26a0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
26b0: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
26c0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
26d0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
26e0: 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67  abase.** table g
26f0: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
2700: 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   that table and 
2710: 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65  (optionally) the
2720: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
2730: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
2740: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ing the table.  
2750: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
2760: 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20  ot found.  Also 
2770: 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  leave an.** erro
2780: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
2790: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
27a0: 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
27b0: 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
27c0: 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69  routine and sqli
27d0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69  te3FindTable() i
27e0: 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72  s that this.** r
27f0: 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e  outine leaves an
2800: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2810: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
2820: 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74  g where.** sqlit
2830: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f  e3FindTable() do
2840: 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65  es not..*/.Table
2850: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54   *sqlite3LocateT
2860: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
2870: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
2880: 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69  * context in whi
2890: 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72  ch to report err
28a0: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ors */.  int isV
28b0: 69 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  iew,            
28c0: 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69  /* True if looki
28d0: 6e 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61  ng for a VIEW ra
28e0: 74 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c  ther than a TABL
28f0: 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  E */.  const cha
2900: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
2910: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
2920: 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  le we are lookin
2930: 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  g for */.  const
2940: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20   char *zDbase   
2950: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2960: 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68   database.  Migh
2970: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
2980: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
2990: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
29a0: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
29b0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
29c0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
29d0: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
29e0: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
29f0: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
2a00: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2a10: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
2a20: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
2a30: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2a40: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
2a50: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
2a60: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
2a70: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
2a80: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
2a90: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69  har *zMsg = isVi
2aa0: 65 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69  ew ? "no such vi
2ab0: 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74  ew" : "no such t
2ac0: 61 62 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a  able";.    if( z
2ad0: 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73  Dbase ){.      s
2ae0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2af0: 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25  Parse, "%s: %s.%
2b00: 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65  s", zMsg, zDbase
2b10: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
2b20: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2b30: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
2b40: 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73  e, "%s: %s", zMs
2b50: 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  g, zName);.    }
2b60: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
2b70: 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
2b80: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
2b90: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
2ba0: 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  e table identifi
2bb0: 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20  ed by *p..**.** 
2bc0: 54 68 69 73 20 69 73 20 61 20 77 72 61 70 70 65  This is a wrappe
2bd0: 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33  r around sqlite3
2be0: 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54  LocateTable(). T
2bf0: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
2c00: 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  tween.** sqlite3
2c10: 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e  LocateTable() an
2c20: 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
2c30: 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
2c40: 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a  ction restricts.
2c50: 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  ** the search to
2c60: 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68   schema (p->pSch
2c70: 65 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f  ema) if it is no
2c80: 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65  t NULL. p->pSche
2c90: 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e  ma may be.** non
2ca0: 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70  -NULL if it is p
2cb0: 61 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72  art of a view or
2cc0: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
2cd0: 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65   definition. See
2ce0: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72  .** sqlite3FixSr
2cf0: 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74 61  cList() for deta
2d00: 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73  ils..*/.Table *s
2d10: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
2d20: 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a  eItem(.  Parse *
2d30: 70 50 61 72 73 65 2c 20 0a 20 20 69 6e 74 20 69  pParse, .  int i
2d40: 73 56 69 65 77 2c 20 0a 20 20 73 74 72 75 63 74  sView, .  struct
2d50: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2d60: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
2d70: 20 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28   *zDb;.  assert(
2d80: 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c   p->pSchema==0 |
2d90: 7c 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  | p->zDatabase==
2da0: 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53  0 );.  if( p->pS
2db0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74  chema ){.    int
2dc0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
2dd0: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
2de0: 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65  se->db, p->pSche
2df0: 6d 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70  ma);.    zDb = p
2e00: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
2e10: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c  Db].zName;.  }el
2e20: 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d  se{.    zDb = p-
2e30: 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a  >zDatabase;.  }.
2e40: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2e50: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
2e60: 73 65 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e 7a  se, isView, p->z
2e70: 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f  Name, zDb);.}../
2e80: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2e90: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
2ea0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2eb0: 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75  es .** a particu
2ec0: 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20  lar index given 
2ed0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
2ee0: 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68   index.** and th
2ef0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
2f00: 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74  tabase that cont
2f10: 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a  ains the index..
2f20: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
2f30: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
2f40: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
2f50: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
2f60: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
2f70: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c   for the.** tabl
2f80: 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  e and the first 
2f90: 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69  matching index i
2fa0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
2fb0: 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72   checking.** for
2fc0: 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78   duplicate index
2fd0: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
2fe0: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
2ff0: 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69  er is.** TEMP fi
3000: 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20  rst, then MAIN, 
3010: 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61  then any auxilia
3020: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
3030: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ed.** using the 
3040: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a  ATTACH command..
3050: 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65  */.Index *sqlite
3060: 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74  3FindIndex(sqlit
3070: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
3080: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
3090: 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49   char *zDb){.  I
30a0: 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69  ndex *p = 0;.  i
30b0: 6e 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d  nt i;.  /* All m
30c0: 75 74 65 78 65 73 20 61 72 65 20 72 65 71 75 69  utexes are requi
30d0: 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61  red for schema a
30e0: 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72  ccess.  Make sur
30f0: 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20  e we hold them. 
3100: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62  */.  assert( zDb
3110: 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74  !=0 || sqlite3Bt
3120: 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78  reeHoldsAllMutex
3130: 65 73 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28  es(db) );.  for(
3140: 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69  i=OMIT_TEMPDB; i
3150: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
3160: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32      int j = (i<2
3170: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a  ) ? i^1 : i;  /*
3180: 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66   Search TEMP bef
3190: 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20  ore MAIN */.    
31a0: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
31b0: 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63  = db->aDb[j].pSc
31c0: 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74  hema;.    assert
31d0: 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ( pSchema );.   
31e0: 20 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69   if( zDb && sqli
31f0: 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20  te3StrICmp(zDb, 
3200: 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65  db->aDb[j].zName
3210: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
3220: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3230: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
3240: 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20  (db, j, 0) );.  
3250: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73    p = sqlite3Has
3260: 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e  hFind(&pSchema->
3270: 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b  idxHash, zName);
3280: 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65  .    if( p ) bre
3290: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
32a0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   p;.}../*.** Rec
32b0: 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  laim the memory 
32c0: 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78  used by an index
32d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
32e0: 66 72 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65  freeIndex(sqlite
32f0: 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29  3 *db, Index *p)
3300: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
3310: 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20  _OMIT_ANALYZE.  
3320: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64  sqlite3DeleteInd
3330: 65 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29  exSamples(db, p)
3340: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 64  ;.#endif.  if( d
3350: 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42 79  b==0 || db->pnBy
3360: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71  tesFreed==0 ) sq
3370: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
3380: 66 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a  f(p->pKeyInfo);.
3390: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
33a0: 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61 72 74  ete(db, p->pPart
33b0: 49 64 78 57 68 65 72 65 29 3b 0a 20 20 73 71 6c  IdxWhere);.  sql
33c0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
33d0: 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69 66  ->zColAff);.  if
33e0: 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20 29  ( p->isResized )
33f0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3400: 62 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20  b, p->azColl);. 
3410: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3420: 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  b, p);.}../*.** 
3430: 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61  For the index ca
3440: 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68  lled zIdxName wh
3450: 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20  ich is found in 
3460: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62  the database iDb
3470: 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74  ,.** unlike that
3480: 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20   index from its 
3490: 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76  Table then remov
34a0: 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d  e the index from
34b0: 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61  .** the index ha
34c0: 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65  sh table and fre
34d0: 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72  e all memory str
34e0: 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74  uctures associat
34f0: 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69  ed.** with the i
3500: 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ndex..*/.void sq
3510: 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
3520: 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65  leteIndex(sqlite
3530: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
3540: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78  const char *zIdx
3550: 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a  Name){.  Index *
3560: 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 20 2a  pIndex;.  Hash *
3570: 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 72 74  pHash;..  assert
3580: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
3590: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
35a0: 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73 68 20  , 0) );.  pHash 
35b0: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  = &db->aDb[iDb].
35c0: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
35d0: 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  ;.  pIndex = sql
35e0: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70  ite3HashInsert(p
35f0: 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20  Hash, zIdxName, 
3600: 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  0);.  if( ALWAYS
3610: 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20  (pIndex) ){.    
3620: 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  if( pIndex->pTab
3630: 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 6e 64  le->pIndex==pInd
3640: 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  ex ){.      pInd
3650: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
3660: 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  ex = pIndex->pNe
3670: 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
3680: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20       Index *p;. 
3690: 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 69 63       /* Justific
36a0: 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 53 28  ation of ALWAYS(
36b0: 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20 6d 75  );  The index mu
36c0: 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c 69 73  st be on the lis
36d0: 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 69 6e  t of.      ** in
36e0: 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  dices. */.      
36f0: 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  p = pIndex->pTab
3700: 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  le->pIndex;.    
3710: 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
3720: 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d  p) && p->pNext!=
3730: 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 70 2d  pIndex ){ p = p-
3740: 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 20 20  >pNext; }.      
3750: 69 66 28 20 41 4c 57 41 59 53 28 70 20 26 26 20  if( ALWAYS(p && 
3760: 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78  p->pNext==pIndex
3770: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ) ){.        p->
3780: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
3790: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
37a0: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64     }.    freeInd
37b0: 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a  ex(db, pIndex);.
37c0: 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20    }.  db->flags 
37d0: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
37e0: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
37f0: 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68 20 74  * Look through t
3800: 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 6e 20  he list of open 
3810: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 69  database files i
3820: 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e 64 20  n db->aDb[] and 
3830: 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65 20 62  if.** any have b
3840: 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65 6d 6f  een closed, remo
3850: 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 65  ve them from the
3860: 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f 63 61   list.  Realloca
3870: 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e 61 44  te the.** db->aD
3880: 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20 74 6f  b[] structure to
3890: 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a 65 2c   a smaller size,
38a0: 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2a   if possible..**
38b0: 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74 68 65  .** Entry 0 (the
38c0: 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61 73 65   "main" database
38d0: 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20 28 74  ) and entry 1 (t
38e0: 68 65 20 22 74 65 6d 70 22 20 64 61 74 61 62 61  he "temp" databa
38f0: 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76 65 72  se).** are never
3900: 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20   candidates for 
3910: 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65 64 2e  being collapsed.
3920: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3930: 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65  CollapseDatabase
3940: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64  Array(sqlite3 *d
3950: 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  b){.  int i, j;.
3960: 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c 64    for(i=j=2; i<d
3970: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3980: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
3990: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
39a0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
39b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
39c0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
39d0: 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db->zName);.    
39e0: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30    pDb->zName = 0
39f0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
3a00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3a10: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
3a20: 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44  >aDb[j] = db->aD
3a30: 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b[i];.    }.    
3a40: 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  j++;.  }.  memse
3a50: 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30  t(&db->aDb[j], 0
3a60: 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69  , (db->nDb-j)*si
3a70: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29  zeof(db->aDb[j])
3a80: 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a  );.  db->nDb = j
3a90: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
3aa0: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
3ab0: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
3ac0: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
3ad0: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
3ae0: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
3af0: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
3b00: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3b10: 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64 62  db->aDb);.    db
3b20: 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53  ->aDb = db->aDbS
3b30: 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  tatic;.  }.}../*
3b40: 0a 2a 2a 20 52 65 73 65 74 20 74 68 65 20 73 63  .** Reset the sc
3b50: 68 65 6d 61 20 66 6f 72 20 74 68 65 20 64 61 74  hema for the dat
3b60: 61 62 61 73 65 20 61 74 20 69 6e 64 65 78 20 69  abase at index i
3b70: 44 62 2e 20 20 41 6c 73 6f 20 72 65 73 65 74 20  Db.  Also reset 
3b80: 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73 63 68 65  the.** TEMP sche
3b90: 6d 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ma..*/.void sqli
3ba0: 74 65 33 52 65 73 65 74 4f 6e 65 53 63 68 65 6d  te3ResetOneSchem
3bb0: 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  a(sqlite3 *db, i
3bc0: 6e 74 20 69 44 62 29 7b 0a 20 20 44 62 20 2a 70  nt iDb){.  Db *p
3bd0: 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  Db;.  assert( iD
3be0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
3bf0: 2f 2a 20 43 61 73 65 20 31 3a 20 20 52 65 73 65  /* Case 1:  Rese
3c00: 74 20 74 68 65 20 73 69 6e 67 6c 65 20 73 63 68  t the single sch
3c10: 65 6d 61 20 69 64 65 6e 74 69 66 69 65 64 20 62  ema identified b
3c20: 79 20 69 44 62 20 2a 2f 0a 20 20 70 44 62 20 3d  y iDb */.  pDb =
3c30: 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
3c40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3c50: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
3c60: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
3c70: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
3c80: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 73  Schema!=0 );.  s
3c90: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
3ca0: 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b  r(pDb->pSchema);
3cb0: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79 20 64 61  ..  /* If any da
3cc0: 74 61 62 61 73 65 20 6f 74 68 65 72 20 74 68 61  tabase other tha
3cd0: 6e 20 54 45 4d 50 20 69 73 20 72 65 73 65 74 2c  n TEMP is reset,
3ce0: 20 74 68 65 6e 20 61 6c 73 6f 20 72 65 73 65 74   then also reset
3cf0: 20 54 45 4d 50 0a 20 20 2a 2a 20 73 69 6e 63 65   TEMP.  ** since
3d00: 20 54 45 4d 50 20 6d 69 67 68 74 20 62 65 20 68   TEMP might be h
3d10: 6f 6c 64 69 6e 67 20 74 72 69 67 67 65 72 73 20  olding triggers 
3d20: 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 74  that reference t
3d30: 61 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a  ables in the.  *
3d40: 2a 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  * other database
3d50: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 44 62  ..  */.  if( iDb
3d60: 21 3d 31 20 29 7b 0a 20 20 20 20 70 44 62 20 3d  !=1 ){.    pDb =
3d70: 20 26 64 62 2d 3e 61 44 62 5b 31 5d 3b 0a 20 20   &db->aDb[1];.  
3d80: 20 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 70    assert( pDb->p
3d90: 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a 20 20 20  Schema!=0 );.   
3da0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
3db0: 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61  ear(pDb->pSchema
3dc0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b  );.  }.  return;
3dd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
3de0: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
3df0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 6c 6c 20  mation from all 
3e00: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
3e10: 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  es (including.**
3e20: 20 22 6d 61 69 6e 22 20 61 6e 64 20 22 74 65 6d   "main" and "tem
3e30: 70 22 29 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  p") for a single
3e40: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
3e50: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
3e60: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
3e70: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
3e80: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
3e90: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
3ea0: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
3eb0: 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  b);.  for(i=0; i
3ec0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
3ed0: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
3ee0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
3ef0: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  f( pDb->pSchema 
3f00: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3f10: 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d  SchemaClear(pDb-
3f20: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d  >pSchema);.    }
3f30: 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73  .  }.  db->flags
3f40: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
3f50: 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71 6c  rnChanges;.  sql
3f60: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
3f70: 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  st(db);.  sqlite
3f80: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
3f90: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c  b);.  sqlite3Col
3fa0: 6c 61 70 73 65 44 61 74 61 62 61 73 65 41 72 72  lapseDatabaseArr
3fb0: 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ay(db);.}../*.**
3fc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3fd0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63   called when a c
3fe0: 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f  ommit occurs..*/
3ff0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d  .void sqlite3Com
4000: 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
4010: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
4020: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20  .  db->flags &= 
4030: 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  ~SQLITE_InternCh
4040: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
4050: 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20 61 6c  Delete memory al
4060: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
4070: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 20  column names of 
4080: 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  a table or view 
4090: 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e 61 43  (the.** Table.aC
40a0: 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a 2f 0a  ol[] array)..*/.
40b0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
40c0: 74 65 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61  teDeleteColumnNa
40d0: 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mes(sqlite3 *db,
40e0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
40f0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75  .  int i;.  Colu
4100: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65  mn *pCol;.  asse
4110: 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b  rt( pTable!=0 );
4120: 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 70  .  if( (pCol = p
4130: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20  Table->aCol)!=0 
4140: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
4150: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
4160: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
4170: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
4180: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  e(db, pCol->zNam
4190: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
41a0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
41b0: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
41c0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
41d0: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c  e(db, pCol->zDfl
41e0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
41f0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c  3DbFree(db, pCol
4200: 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20  ->zType);.      
4210: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4220: 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a  , pCol->zColl);.
4230: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4240: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
4250: 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d  le->aCol);.  }.}
4260: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
4270: 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73  he memory data s
4280: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
4290: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
42a0: 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e  ven.** Table.  N
42b0: 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
42c0: 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68  de to disk by th
42d0: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
42e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a  * This routine j
42f0: 75 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20  ust deletes the 
4300: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20  data structure. 
4310: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c   It does not unl
4320: 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ink.** the table
4330: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
4340: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
4350: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
4360: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
4370: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
4380: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
4390: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
43a0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
43b0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  ** the table..**
43c0: 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61 6d  .** The db param
43d0: 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c  eter is optional
43e0: 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65 64 20  .  It is needed 
43f0: 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  if the Table obj
4400: 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ect .** contains
4410: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
4420: 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65 63  y.  (Table objec
4430: 74 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61  ts in the schema
4440: 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c   do not use.** l
4450: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c  ookaside memory,
4460: 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d 65   but some epheme
4470: 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  ral Table object
4480: 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a  s do.)  Or the.*
4490: 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 63  * db parameter c
44a0: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
44b0: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
44c0: 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20   to measure the 
44d0: 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62  memory.** used b
44e0: 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  y the Table obje
44f0: 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ct..*/.void sqli
4500: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73  te3DeleteTable(s
4510: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
4520: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e  e *pTable){.  In
4530: 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e  dex *pIndex, *pN
4540: 65 78 74 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28  ext;.  TESTONLY(
4550: 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 3b   int nLookaside;
4560: 20 29 20 2f 2a 20 55 73 65 64 20 74 6f 20 76 65   ) /* Used to ve
4570: 72 69 66 79 20 6c 6f 6f 6b 61 73 69 64 65 20 6e  rify lookaside n
4580: 6f 74 20 75 73 65 64 20 66 6f 72 20 73 63 68 65  ot used for sche
4590: 6d 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ma */..  assert(
45a0: 20 21 70 54 61 62 6c 65 20 7c 7c 20 70 54 61 62   !pTable || pTab
45b0: 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20  le->nRef>0 );.. 
45c0: 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74   /* Do not delet
45d0: 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e 74 69  e the table unti
45e0: 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  l the reference 
45f0: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
4600: 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70 54  ro. */.  if( !pT
4610: 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  able ) return;. 
4620: 20 69 66 28 20 28 28 21 64 62 20 7c 7c 20 64 62   if( ((!db || db
4630: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
4640: 30 29 20 26 26 20 28 2d 2d 70 54 61 62 6c 65 2d  0) && (--pTable-
4650: 3e 6e 52 65 66 29 3e 30 29 20 29 20 72 65 74 75  >nRef)>0) ) retu
4660: 72 6e 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64  rn;..  /* Record
4670: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
4680: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61  utstanding looka
4690: 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  side allocations
46a0: 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62 6c 65   in schema Table
46b0: 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20  s.  ** prior to 
46c0: 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65 28 29  doing any free()
46d0: 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 53 69   operations.  Si
46e0: 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62 6c 65  nce schema Table
46f0: 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a  s do not use.  *
4700: 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69  * lookaside, thi
4710: 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20  s number should 
4720: 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20  not change. */. 
4730: 20 54 45 53 54 4f 4e 4c 59 28 20 6e 4c 6f 6f 6b   TESTONLY( nLook
4740: 61 73 69 64 65 20 3d 20 28 64 62 20 26 26 20 28  aside = (db && (
4750: 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73  pTable->tabFlags
4760: 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
4770: 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20  ==0) ?.         
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
47a0: 75 74 20 3a 20 30 20 29 3b 0a 0a 20 20 2f 2a 20  ut : 0 );..  /* 
47b0: 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63  Delete all indic
47c0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
47d0: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  th this table. *
47e0: 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d  /.  for(pIndex =
47f0: 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b   pTable->pIndex;
4800: 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d   pIndex; pIndex=
4810: 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78  pNext){.    pNex
4820: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
4830: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
4840: 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d  Index->pSchema==
4850: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20  pTable->pSchema 
4860: 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62 20 7c  );.    if( !db |
4870: 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  | db->pnBytesFre
4880: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ed==0 ){.      c
4890: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e  har *zName = pIn
48a0: 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20  dex->zName; .   
48b0: 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e     TESTONLY ( In
48c0: 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71  dex *pOld = ) sq
48d0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
48e0: 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e 64 65  .         &pInde
48f0: 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  x->pSchema->idxH
4900: 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20  ash, zName, 0.  
4910: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73      );.      ass
4920: 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71  ert( db==0 || sq
4930: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
4940: 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64  Held(db, 0, pInd
4950: 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a  ex->pSchema) );.
4960: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
4970: 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f  ld==pIndex || pO
4980: 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  ld==0 );.    }. 
4990: 20 20 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c     freeIndex(db,
49a0: 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20   pIndex);.  }.. 
49b0: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66   /* Delete any f
49c0: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61  oreign keys atta
49d0: 63 68 65 64 20 74 6f 20 74 68 69 73 20 74 61 62  ched to this tab
49e0: 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  le. */.  sqlite3
49f0: 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  FkDelete(db, pTa
4a00: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  ble);..  /* Dele
4a10: 74 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  te the Table str
4a20: 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20  ucture itself.. 
4a30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 44 65 6c 65   */.  sqliteDele
4a40: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
4a50: 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c  , pTable);.  sql
4a60: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4a70: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
4a80: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4a90: 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41  b, pTable->zColA
4aa0: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ff);.  sqlite3Se
4ab0: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
4ac0: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b  Table->pSelect);
4ad0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4ae0: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c  OMIT_CHECK.  sql
4af0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4b00: 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70  te(db, pTable->p
4b10: 43 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 23  Check);.#endif.#
4b20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4b30: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
4b40: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65    sqlite3VtabCle
4b50: 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  ar(db, pTable);.
4b60: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
4b70: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
4b80: 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79  e);..  /* Verify
4b90: 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69   that no lookasi
4ba0: 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73  de memory was us
4bb0: 65 64 20 62 79 20 73 63 68 65 6d 61 20 74 61 62  ed by schema tab
4bc0: 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  les */.  assert(
4bd0: 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c   nLookaside==0 |
4be0: 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64 62  | nLookaside==db
4bf0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74  ->lookaside.nOut
4c00: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   );.}../*.** Unl
4c10: 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61  ink the given ta
4c20: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73  ble from the has
4c30: 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65  h tables and the
4c40: 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74   delete the.** t
4c50: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77  able structure w
4c60: 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69  ith all its indi
4c70: 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20  ces and foreign 
4c80: 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  keys..*/.void sq
4c90: 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65  lite3UnlinkAndDe
4ca0: 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65  leteTable(sqlite
4cb0: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
4cc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
4cd0: 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Name){.  Table *
4ce0: 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  p;.  Db *pDb;.. 
4cf0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
4d00: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
4d10: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
4d20: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  b );.  assert( z
4d30: 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61 73 73  TabName );.  ass
4d40: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
4d50: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
4d60: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 74 65 73  iDb, 0) );.  tes
4d70: 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d 65 5b  tcase( zTabName[
4d80: 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65 72  0]==0 );  /* Zer
4d90: 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65 20 6e  o-length table n
4da0: 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ames are allowed
4db0: 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d   */.  pDb = &db-
4dc0: 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d  >aDb[iDb];.  p =
4dd0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
4de0: 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  rt(&pDb->pSchema
4df0: 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e  ->tblHash, zTabN
4e00: 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ame, 0);.  sqlit
4e10: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
4e20: 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  , p);.  db->flag
4e30: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
4e40: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
4e50: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65  .** Given a toke
4e60: 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69  n, return a stri
4e70: 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  ng that consists
4e80: 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66 20   of the text of 
4e90: 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20  that.** token.  
4ea0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
4eb0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
4ec0: 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64  g.** is obtained
4ed0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c   from sqliteMall
4ee0: 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
4ef0: 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
4f00: 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
4f10: 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f  n..**.** Any quo
4f20: 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65 78  tation marks (ex
4f30: 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d 65  :  "name", 'name
4f40: 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e  ', [name], or `n
4f50: 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73 75  ame`) that.** su
4f60: 72 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79 20  rround the body 
4f70: 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72 65  of the token are
4f80: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20   removed..**.** 
4f90: 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e  Tokens are often
4fa0: 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69   just pointers i
4fb0: 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
4fc0: 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f   SQL text and so
4fd0: 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30  .** are not \000
4fe0: 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20   terminated and 
4ff0: 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65  are not persiste
5000: 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65  nt.  The returne
5010: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c  d string.** is \
5020: 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61  000 terminated a
5030: 6e 64 20 69 73 20 70 65 72 73 69 73 74 65 6e 74  nd is persistent
5040: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
5050: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
5060: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b  sqlite3 *db, Tok
5070: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68  en *pName){.  ch
5080: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28  ar *zName;.  if(
5090: 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
50a0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
50b0: 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
50c0: 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d  *)pName->z, pNam
50d0: 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  e->n);.    sqlit
50e0: 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29  e3Dequote(zName)
50f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
5100: 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Name = 0;.  }.  
5110: 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a  return zName;.}.
5120: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
5130: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
5140: 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61  ble stored in da
5150: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44  tabase number iD
5160: 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67  b for.** writing
5170: 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f  . The table is o
5180: 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73  pened using curs
5190: 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  or 0..*/.void sq
51a0: 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54  lite3OpenMasterT
51b0: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69  able(Parse *p, i
51c0: 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
51d0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
51e0: 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  dbe(p);.  sqlite
51f0: 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44  3TableLock(p, iD
5200: 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  b, MASTER_ROOT, 
5210: 31 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  1, SCHEMA_TABLE(
5220: 69 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  iDb));.  sqlite3
5230: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
5240: 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30   OP_OpenWrite, 0
5250: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69  , MASTER_ROOT, i
5260: 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70 2d  Db, 5);.  if( p-
5270: 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  >nTab==0 ){.    
5280: 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d  p->nTab = 1;.  }
5290: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
52a0: 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73  ter zName points
52b0: 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   to a nul-termin
52c0: 61 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74  ated buffer cont
52d0: 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a  aining the name.
52e0: 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  ** of a database
52f0: 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22   ("main", "temp"
5300: 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   or the name of 
5310: 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e  an attached db).
5320: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
5330: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e  n returns the in
5340: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
5350: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
5360: 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31  >aDb[], or.** -1
5370: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62   if the named db
5380: 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
5390: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
53a0: 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74  FindDbName(sqlit
53b0: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
53c0: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
53d0: 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  t i = -1;       
53e0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75    /* Database nu
53f0: 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e  mber */.  if( zN
5400: 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70  ame ){.    Db *p
5410: 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  Db;.    int n = 
5420: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
5430: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28  zName);.    for(
5440: 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70  i=(db->nDb-1), p
5450: 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20  Db=&db->aDb[i]; 
5460: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d  i>=0; i--, pDb--
5470: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 21 4f  ){.      if( (!O
5480: 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21  MIT_TEMPDB || i!
5490: 3d 31 20 29 20 26 26 20 6e 3d 3d 73 71 6c 69 74  =1 ) && n==sqlit
54a0: 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62 2d 3e  e3Strlen30(pDb->
54b0: 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20  zName) && .     
54c0: 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53       0==sqlite3S
54d0: 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d  trICmp(pDb->zNam
54e0: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
54f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5500: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5510: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a  return i;.}../*.
5520: 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e  ** The token *pN
5530: 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ame contains the
5540: 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62   name of a datab
5550: 61 73 65 20 28 65 69 74 68 65 72 20 22 6d 61 69  ase (either "mai
5560: 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20  n" or.** "temp" 
5570: 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  or the name of a
5580: 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20  n attached db). 
5590: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
55a0: 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65  urns the.** inde
55b0: 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64  x of the named d
55c0: 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61  atabase in db->a
55d0: 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74  Db[], or -1 if t
55e0: 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20  he named db .** 
55f0: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
5600: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  */.int sqlite3Fi
5610: 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62  ndDb(sqlite3 *db
5620: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
5630: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
5660: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
5670: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5690: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20       /* Name we 
56a0: 61 72 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f  are searching fo
56b0: 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73  r */.  zName = s
56c0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
56d0: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
56e0: 20 20 69 20 3d 20 73 71 6c 69 74 65 33 46 69 6e    i = sqlite3Fin
56f0: 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d  dDbName(db, zNam
5700: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
5710: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
5720: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
5730: 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76  * The table or v
5740: 69 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e  iew or trigger n
5750: 61 6d 65 20 69 73 20 70 61 73 73 65 64 20 74 6f  ame is passed to
5760: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
5770: 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d  a tokens.** pNam
5780: 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49  e1 and pName2. I
5790: 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  f the table name
57a0: 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69   was fully quali
57b0: 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  fied, for exampl
57c0: 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  e:.**.** CREATE 
57d0: 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e  TABLE xxx.yyy (.
57e0: 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e  ..);.** .** Then
57f0: 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74   pName1 is set t
5800: 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d  o "xxx" and pNam
5810: 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65  e2 "yyy". On the
5820: 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a   other hand if.*
5830: 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
5840: 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75   is not fully qu
5850: 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a  alified, i.e.:.*
5860: 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c  *.** CREATE TABL
5870: 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a  E yyy(...);.**.*
5880: 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73  * Then pName1 is
5890: 20 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e   set to "yyy" an
58a0: 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a  d pName2 is ""..
58b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
58c0: 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70 70 55  ne sets the *ppU
58d0: 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f  nqual pointer to
58e0: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f   point at the to
58f0: 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a  ken (pName1 or.*
5900: 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73  * pName2) that s
5910: 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c  tores the unqual
5920: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
5930: 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20  .  The index of 
5940: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
5950: 22 78 78 78 22 20 69 73 20 72 65 74 75 72 6e 65  "xxx" is returne
5960: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5970: 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20  3TwoPartName(.  
5980: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5990: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61      /* Parsing a
59a0: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
59b0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
59c0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
59d0: 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22      /* The "xxx"
59e0: 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78   in the name "xx
59f0: 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22 20  x.yyy" or "xxx" 
5a00: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
5a10: 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e2,      /* The 
5a20: 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d  "yyy" in the nam
5a30: 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20  e "xxx.yyy" */. 
5a40: 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c   Token **pUnqual
5a50: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
5a60: 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62  e unqualified ob
5a70: 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a  ject name here *
5a80: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  /.){.  int iDb; 
5a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5aa0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
5ab0: 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63  olding the objec
5ac0: 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
5ad0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
5ae0: 0a 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ..  if( ALWAYS(p
5af0: 4e 61 6d 65 32 21 3d 30 29 20 26 26 20 70 4e 61  Name2!=0) && pNa
5b00: 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20  me2->n>0 ){.    
5b10: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
5b20: 79 20 29 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  y ) {.      sqli
5b30: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5b40: 73 65 2c 20 22 63 6f 72 72 75 70 74 20 64 61 74  se, "corrupt dat
5b50: 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20 70  abase");.      p
5b60: 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Parse->nErr++;. 
5b70: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
5b80: 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75      }.    *pUnqu
5b90: 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20  al = pName2;.   
5ba0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69   iDb = sqlite3Fi
5bb0: 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29  ndDb(db, pName1)
5bc0: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
5bd0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5be0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5bf0: 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61   "unknown databa
5c00: 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b  se %T", pName1);
5c10: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
5c20: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74  Err++;.      ret
5c30: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
5c40: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
5c50: 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  t( db->init.iDb=
5c60: 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62  =0 || db->init.b
5c70: 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d  usy );.    iDb =
5c80: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20   db->init.iDb;. 
5c90: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
5ca0: 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame1;.  }.  retu
5cb0: 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn iDb;.}../*.**
5cc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5cd0: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69   used to check i
5ce0: 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72 69  f the UTF-8 stri
5cf0: 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65  ng zName is a le
5d00: 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69  gal.** unqualifi
5d10: 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65  ed name for a ne
5d20: 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  w schema object 
5d30: 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76  (table, index, v
5d40: 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65  iew or.** trigge
5d50: 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72  r). All names ar
5d60: 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74  e legal except t
5d70: 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e 20  hose that begin 
5d80: 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a  with the string.
5d90: 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e  ** "sqlite_" (in
5da0: 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72   upper, lower or
5db0: 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54 68   mixed case). Th
5dc0: 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  is portion of th
5dd0: 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69  e namespace.** i
5de0: 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 69  s reserved for i
5df0: 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a  nternal use..*/.
5e00: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
5e10: 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65  ObjectName(Parse
5e20: 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20   *pParse, const 
5e30: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
5e40: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d  if( !pParse->db-
5e50: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50  >init.busy && pP
5e60: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
5e70: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70  .          && (p
5e80: 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Parse->db->flags
5e90: 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53   & SQLITE_WriteS
5ea0: 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20  chema)==0.      
5eb0: 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65      && 0==sqlite
5ec0: 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c  3StrNICmp(zName,
5ed0: 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29   "sqlite_", 7) )
5ee0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
5ef0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f  orMsg(pParse, "o
5f00: 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72  bject name reser
5f10: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
5f20: 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65   use: %s", zName
5f30: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
5f40: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
5f50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5f60: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
5f70: 75 72 6e 20 74 68 65 20 50 52 49 4d 41 52 59 20  urn the PRIMARY 
5f80: 4b 45 59 20 69 6e 64 65 78 20 6f 66 20 61 20 74  KEY index of a t
5f90: 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  able.*/.Index *s
5fa0: 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79  qlite3PrimaryKey
5fb0: 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61  Index(Table *pTa
5fc0: 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a  b){.  Index *p;.
5fd0: 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70 49    for(p=pTab->pI
5fe0: 6e 64 65 78 3b 20 70 20 26 26 20 21 49 73 50 72  ndex; p && !IsPr
5ff0: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 29  imaryKeyIndex(p)
6000: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a  ; p=p->pNext){}.
6010: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
6020: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6030: 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  column of index 
6040: 70 49 64 78 20 74 68 61 74 20 63 6f 72 72 65 73  pIdx that corres
6050: 70 6f 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a 2a  ponds to table.*
6060: 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20 20  * column iCol.  
6070: 52 65 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f 74  Return -1 if not
6080: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20 73   found..*/.i16 s
6090: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e  qlite3ColumnOfIn
60a0: 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78 2c  dex(Index *pIdx,
60b0: 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69 6e   i16 iCol){.  in
60c0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
60d0: 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i<pIdx->nColumn;
60e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
60f0: 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  Col==pIdx->aiCol
6100: 75 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e 20  umn[i] ) return 
6110: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
6120: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67  -1;.}../*.** Beg
6130: 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20  in constructing 
6140: 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70 72  a new table repr
6150: 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65  esentation in me
6160: 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a 2a  mory.  This is.*
6170: 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20 73  * the first of s
6180: 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f  everal action ro
6190: 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74 20  utines that get 
61a0: 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e  called in respon
61b0: 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41 54  se.** to a CREAT
61c0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
61d0: 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c 61  t.  In particula
61e0: 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  r, this routine 
61f0: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74  is called.** aft
6200: 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73  er seeing tokens
6210: 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22 54   "CREATE" and "T
6220: 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74 61  ABLE" and the ta
6230: 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69 73  ble name. The is
6240: 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20  Temp.** flag is 
6250: 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62 6c  true if the tabl
6260: 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f 72  e should be stor
6270: 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c 69  ed in the auxili
6280: 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ary database.** 
6290: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
62a0: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
62b0: 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
62c0: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65   is normally the
62d0: 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68   case.** when th
62e0: 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45 4d  e "TEMP" or "TEM
62f0: 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64 20  PORARY" keyword 
6300: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
6310: 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64 20  n.** CREATE and 
6320: 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TABLE..**.** The
6330: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
6340: 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  d is initialized
6350: 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61 72   and put in pPar
6360: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a  se->pNewTable..*
6370: 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68 65  * As more of the
6380: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
6390: 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73 65  atement is parse
63a0: 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61 63  d, additional ac
63b0: 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73  tion.** routines
63c0: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
63d0: 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f  to add more info
63e0: 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73 20  rmation to this 
63f0: 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68  record..** At th
6400: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45  e end of the CRE
6410: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
6420: 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33  ent, the sqlite3
6430: 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69  EndTable() routi
6440: 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
6450: 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20  to complete the 
6460: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66 20  construction of 
6470: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  the new table re
6480: 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  cord..*/.void sq
6490: 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65 28  lite3StartTable(
64a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
64b0: 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f  ,   /* Parser co
64c0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
64d0: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46   *pName1,   /* F
64e0: 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68 65  irst part of the
64f0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   name of the tab
6500: 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20  le or view */.  
6510: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
6520: 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20   /* Second part 
6530: 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  of the name of t
6540: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
6550: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
6560: 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ,      /* True i
6570: 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d 50  f this is a TEMP
6580: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
6590: 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a 20  isView,      /* 
65a0: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
65b0: 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20  a VIEW */.  int 
65c0: 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20  isVirtual,   /* 
65d0: 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
65e0: 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65 20  a VIRTUAL table 
65f0: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20  */.  int noErr  
6600: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
6610: 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c 72  ing if table alr
6620: 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
6630: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 6c  {.  Table *pTabl
6640: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  e;.  char *zName
6650: 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d   = 0; /* The nam
6660: 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
6670: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  le */.  sqlite3 
6680: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
6690: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69  ;.  Vdbe *v;.  i
66a0: 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
66b0: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
66c0: 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
66d0: 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54   table in */.  T
66e0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20  oken *pName;    
66f0: 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
6700: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
6710: 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20   to create */.. 
6720: 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72   /* The table or
6730: 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63 72   view name to cr
6740: 65 61 74 65 20 69 73 20 70 61 73 73 65 64 20 74  eate is passed t
6750: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76  o this routine v
6760: 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70  ia tokens.  ** p
6770: 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32  Name1 and pName2
6780: 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e  . If the table n
6790: 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75  ame was fully qu
67a0: 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61  alified, for exa
67b0: 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
67c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78 78  CREATE TABLE xxx
67d0: 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a  .yyy (...);.  **
67e0: 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d   .  ** Then pNam
67f0: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78 78  e1 is set to "xx
6800: 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79  x" and pName2 "y
6810: 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  yy". On the othe
6820: 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74  r hand if.  ** t
6830: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73  he table name is
6840: 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69   not fully quali
6850: 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a  fied, i.e.:.  **
6860: 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42  .  ** CREATE TAB
6870: 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a  LE yyy(...);.  *
6880: 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d  *.  ** Then pNam
6890: 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79  e1 is set to "yy
68a0: 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73  y" and pName2 is
68b0: 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   ""..  **.  ** T
68c0: 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65  he call below se
68d0: 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f 69  ts the pName poi
68e0: 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  nter to point at
68f0: 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d   the token (pNam
6900: 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65  e1 or.  ** pName
6910: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
6920: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
6930: 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 76  able name. The v
6940: 61 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a 20  ariable iDb is. 
6950: 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 69   ** set to the i
6960: 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61  ndex of the data
6970: 62 61 73 65 20 74 68 61 74 20 74 68 65 20 74 61  base that the ta
6980: 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20 74  ble or view is t
6990: 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74 65  o be.  ** create
69a0: 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62  d in..  */.  iDb
69b0: 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
69c0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
69d0: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
69e0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62  Name);.  if( iDb
69f0: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  <0 ) return;.  i
6a00: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
6a10: 26 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61  && isTemp && pNa
6a20: 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21  me2->n>0 && iDb!
6a30: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =1 ){.    /* If 
6a40: 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 20  creating a temp 
6a50: 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20  table, the name 
6a60: 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c 69  may not be quali
6a70: 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20 20  fied. Unless .  
6a80: 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
6a90: 65 20 6e 61 6d 65 20 69 73 20 22 74 65 6d 70 22  e name is "temp"
6aa0: 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20 20   anyway.  */.   
6ab0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6ac0: 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72  (pParse, "tempor
6ad0: 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d  ary table name m
6ae0: 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69  ust be unqualifi
6af0: 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
6b00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49  ;.  }.  if( !OMI
6b10: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
6b20: 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20  mp ) iDb = 1;.. 
6b30: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
6b40: 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20  ken = *pName;.  
6b50: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
6b60: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
6b70: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
6b80: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
6b90: 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ;.  if( SQLITE_O
6ba0: 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
6bb0: 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
6bc0: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
6bd0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
6be0: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66  _error;.  }.  if
6bf0: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d  ( db->init.iDb==
6c00: 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a  1 ) isTemp = 1;.
6c10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6c20: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
6c30: 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69 73 54  N.  assert( (isT
6c40: 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70  emp & 1)==isTemp
6c50: 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20   );.  {.    int 
6c60: 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  code;.    char *
6c70: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
6c80: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
6c90: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
6ca0: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
6cb0: 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
6cc0: 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20  _TABLE(isTemp), 
6cd0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
6ce0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6cf0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6d00: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
6d10: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
6d20: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6d30: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
6d40: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
6d50: 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  E_TEMP_VIEW;.   
6d60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6d70: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
6d80: 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20  CREATE_VIEW;.   
6d90: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
6da0: 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
6db0: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
6dc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65   ){.        code
6dd0: 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45   = SQLITE_CREATE
6de0: 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
6df0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6e00: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
6e10: 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20  CREATE_TABLE;.  
6e20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
6e30: 69 66 28 20 21 69 73 56 69 72 74 75 61 6c 20 26  if( !isVirtual &
6e40: 26 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  & sqlite3AuthChe
6e50: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
6e60: 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20   zName, 0, zDb) 
6e70: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
6e80: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6e90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
6ea0: 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
6eb0: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  e the new table 
6ec0: 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f  name does not co
6ed0: 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65 78  llide with an ex
6ee0: 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65  isting.  ** inde
6ef0: 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20  x or table name 
6f00: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
6f10: 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20  base.  Issue an 
6f20: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66  error message if
6f30: 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54  .  ** it does. T
6f40: 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  he exception is 
6f50: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
6f60: 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 77 61   being parsed wa
6f70: 73 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f  s passed.  ** to
6f80: 20 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c   an sqlite3_decl
6f90: 61 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e  are_vtab() call.
6fa0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e   In that case on
6fb0: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
6fc0: 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70  mes.  ** and typ
6fd0: 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c  es will be used,
6fe0: 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20   so there is no 
6ff0: 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72  need to test for
7000: 20 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20   namespace.  ** 
7010: 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f  collisions..  */
7020: 0a 20 20 69 66 28 20 21 49 4e 5f 44 45 43 4c 41  .  if( !IN_DECLA
7030: 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 63  RE_VTAB ){.    c
7040: 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
7050: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
7060: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
7070: 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
7080: 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
7090: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
70a0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
70b0: 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20   }.    pTable = 
70c0: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
70d0: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 29  (db, zName, zDb)
70e0: 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65  ;.    if( pTable
70f0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e   ){.      if( !n
7100: 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20  oErr ){.        
7110: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7120: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
7130: 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  T already exists
7140: 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", pName);.     
7150: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7160: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69  assert( !db->ini
7170: 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 20 20  t.busy );.      
7180: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72    sqlite3CodeVer
7190: 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
71a0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a  , iDb);.      }.
71b0: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
71c0: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
71d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
71e0: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
71f0: 20 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20   zName, zDb)!=0 
7200: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7210: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7220: 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
7230: 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65  dy an index name
7240: 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  d %s", zName);. 
7250: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
7260: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
7270: 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65   }.  }..  pTable
7280: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7290: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
72a0: 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28  f(Table));.  if(
72b0: 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20   pTable==0 ){.  
72c0: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
72d0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 72  ed = 1;.    pPar
72e0: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
72f0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73  NOMEM;.    pPars
7300: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67  e->nErr++;.    g
7310: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7320: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61  error;.  }.  pTa
7330: 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61  ble->zName = zNa
7340: 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50  me;.  pTable->iP
7350: 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62  Key = -1;.  pTab
7360: 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62  le->pSchema = db
7370: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
7380: 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52  ma;.  pTable->nR
7390: 65 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 6c 65  ef = 1;.  pTable
73a0: 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32  ->nRowLogEst = 2
73b0: 30 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d  00; assert( 200=
73c0: 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
73d0: 30 34 38 35 37 36 29 20 29 3b 0a 20 20 61 73 73  048576) );.  ass
73e0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65  ert( pParse->pNe
73f0: 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70  wTable==0 );.  p
7400: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
7410: 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a   = pTable;..  /*
7420: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
7430: 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71  magic sqlite_seq
7440: 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64  uence table used
7450: 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   by autoincremen
7460: 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63  t,.  ** then rec
7470: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
7480: 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74   this table in t
7490: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
74a0: 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
74b0: 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63  so that INSERT c
74c0: 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c  an find the tabl
74d0: 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23  e easily..  */.#
74e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
74f0: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
7500: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
7510: 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70  nested && strcmp
7520: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
7530: 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b  sequence")==0 ){
7540: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
7550: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
7560: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
7570: 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70  );.    pTable->p
7580: 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20  Schema->pSeqTab 
7590: 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65  = pTable;.  }.#e
75a0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  ndif..  /* Begin
75b0: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
75c0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
75d0: 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20  nsert the table 
75e0: 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a  record into.  **
75f0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
7600: 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20  ER table.  Note 
7610: 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68  in particular th
7620: 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68  at we must go ah
7630: 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c  ead.  ** and all
7640: 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64  ocate the record
7650: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
7660: 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e  table entry now.
7670: 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a    Before any.  *
7680: 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  * PRIMARY KEY or
7690: 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73   UNIQUE keywords
76a0: 20 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68   are parsed.  Th
76b0: 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c  ose keywords wil
76c0: 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64  l cause.  ** ind
76d0: 69 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74  ices to be creat
76e0: 65 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  ed and the table
76f0: 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d   record must com
7700: 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20  e before the .  
7710: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e  ** indices.  Hen
7720: 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ce, the record n
7730: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
7740: 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ble must be allo
7750: 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a  cated.  ** now..
7760: 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e    */.  if( !db->
7770: 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20  init.busy && (v 
7780: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
7790: 28 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a  (pParse))!=0 ){.
77a0: 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20 20      int j1;.    
77b0: 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a  int fileFormat;.
77c0: 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72 65      int reg1, re
77d0: 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 73 71  g2, reg3;.    sq
77e0: 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
77f0: 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
7800: 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64   0, iDb);..#ifnd
7810: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
7820: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
7830: 69 66 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b  if( isVirtual ){
7840: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
7850: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56  beAddOp0(v, OP_V
7860: 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65  Begin);.    }.#e
7870: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ndif..    /* If 
7880: 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  the file format 
7890: 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20  and encoding in 
78a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 76  the database hav
78b0: 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20  e not been set, 
78c0: 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d  .    ** set them
78d0: 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   now..    */.   
78e0: 20 72 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e   reg1 = pParse->
78f0: 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  regRowid = ++pPa
7900: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
7910: 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65  eg2 = pParse->re
7920: 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65  gRoot = ++pParse
7930: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33  ->nMem;.    reg3
7940: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
7950: 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
7960: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52  beAddOp3(v, OP_R
7970: 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  eadCookie, iDb, 
7980: 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49 4c 45  reg3, BTREE_FILE
7990: 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73 71  _FORMAT);.    sq
79a0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
79b0: 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  ee(v, iDb);.    
79c0: 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
79d0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
79e0: 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76 65   reg3); VdbeCove
79f0: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69 6c  rage(v);.    fil
7a00: 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66  eFormat = (db->f
7a10: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65  lags & SQLITE_Le
7a20: 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20  gacyFileFmt)!=0 
7a30: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
7a40: 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d      1 : SQLITE_M
7a50: 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a  AX_FILE_FORMAT;.
7a60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7a70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
7a80: 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c  ger, fileFormat,
7a90: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
7aa0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7ab0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
7ac0: 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46  Db, BTREE_FILE_F
7ad0: 4f 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a 20 20  ORMAT, reg3);.  
7ae0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7af0: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
7b00: 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65 67 33  r, ENC(db), reg3
7b10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7b20: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
7b30: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
7b40: 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49  TREE_TEXT_ENCODI
7b50: 4e 47 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73  NG, reg3);.    s
7b60: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
7b70: 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20  re(v, j1);..    
7b80: 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65  /* This just cre
7b90: 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c  ates a place-hol
7ba0: 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68  der record in th
7bb0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
7bc0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68  table..    ** Th
7bd0: 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64  e record created
7be0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
7bf0: 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20  n anything yet. 
7c00: 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c   It will be repl
7c10: 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  aced.    ** by t
7c20: 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e  he real entry in
7c30: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
7c40: 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  at sqlite3EndTab
7c50: 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  le()..    **.   
7c60: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
7c70: 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  r the new entry 
7c80: 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73  is left in regis
7c90: 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52  ter pParse->regR
7ca0: 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65  owid..    ** The
7cb0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
7cc0: 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  r of the new tab
7cd0: 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  le is left in re
7ce0: 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  g pParse->regRoo
7cf0: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  t..    ** The ro
7d00: 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67  wid and root pag
7d10: 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20  e number values 
7d20: 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68  are needed by th
7d30: 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20  e code that.    
7d40: 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  ** sqlite3EndTab
7d50: 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  le will generate
7d60: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65  ..    */.#if !de
7d70: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7d80: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
7d90: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7da0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
7db0: 20 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20    if( isView || 
7dc0: 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  isVirtual ){.   
7dd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7de0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
7df0: 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20  er, 0, reg2);.  
7e00: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
7e10: 20 20 20 7b 0a 20 20 20 20 20 20 70 50 61 72 73     {.      pPars
7e20: 65 2d 3e 61 64 64 72 43 72 54 61 62 20 3d 20 73  e->addrCrTab = s
7e30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7e40: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
7e50: 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a  le, iDb, reg2);.
7e60: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7e70: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
7e80: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
7e90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7ea0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
7eb0: 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20  wid, 0, reg1);. 
7ec0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7ed0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
7ee0: 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73   0, reg3);.    s
7ef0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
7f00: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30  (v, OP_Insert, 0
7f10: 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20  , reg3, reg1);. 
7f20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
7f30: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
7f40: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71  _APPEND);.    sq
7f50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
7f60: 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20  v, OP_Close);.  
7f70: 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28  }..  /* Normal (
7f80: 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72  non-error) retur
7f90: 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a  n. */.  return;.
7fa0: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
7fb0: 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d  r occurs, we jum
7fc0: 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f  p here */.begin_
7fd0: 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73  table_error:.  s
7fe0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7ff0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
8000: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  n;.}../*.** This
8010: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74   macro is used t
8020: 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73 74  o compare two st
8030: 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65 2d  rings in a case-
8040: 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e 6e  insensitive mann
8050: 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c 69  er..** It is sli
8060: 67 68 74 6c 79 20 66 61 73 74 65 72 20 74 68 61  ghtly faster tha
8070: 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  n calling sqlite
8080: 33 53 74 72 49 43 6d 70 28 29 20 64 69 72 65 63  3StrICmp() direc
8090: 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f 64  tly, but.** prod
80a0: 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64 65  uces larger code
80b0: 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a  ..**.** WARNING:
80c0: 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20 6e   This macro is n
80d0: 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  ot compatible wi
80e0: 74 68 20 74 68 65 20 73 74 72 63 6d 70 28 29 20  th the strcmp() 
80f0: 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72 65  family. It.** re
8100: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68  turns true if th
8110: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61 72  e two strings ar
8120: 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77 69  e equal, otherwi
8130: 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64 65  se false..*/.#de
8140: 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c 20  fine STRICMP(x, 
8150: 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70 70  y) (\.sqlite3Upp
8160: 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73 69  erToLower[*(unsi
8170: 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29 5d  gned char *)(x)]
8180: 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55 70  ==   \.sqlite3Up
8190: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73  perToLower[*(uns
81a0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79 29  igned char *)(y)
81b0: 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69 74  ]     \.&& sqlit
81c0: 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31 2c  e3StrICmp((x)+1,
81d0: 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a 0a  (y)+1)==0 )../*.
81e0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c  ** Add a new col
81f0: 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65  umn to the table
8200: 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
8210: 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a   constructed..**
8220: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
8230: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
8240: 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  e once for each 
8250: 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69  column declarati
8260: 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54  on.** in a CREAT
8270: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
8280: 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  t.  sqlite3Start
8290: 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c  Table() gets cal
82a0: 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20  led.** first to 
82b0: 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67  get things going
82c0: 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75  .  Then this rou
82d0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66  tine is called f
82e0: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d  or each.** colum
82f0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8300: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73  e3AddColumn(Pars
8310: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
8320: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c   *pName){.  Tabl
8330: 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  e *p;.  int i;. 
8340: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75   char *z;.  Colu
8350: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69  mn *pCol;.  sqli
8360: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
8370: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d  ->db;.  if( (p =
8380: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
8390: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
83a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
83b0: 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e  COLUMN.  if( p->
83c0: 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69  nCol+1>db->aLimi
83d0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
83e0: 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
83f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8400: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
8410: 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20  columns on %s", 
8420: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  p->zName);.    r
8430: 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  eturn;.  }.#endi
8440: 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e  f.  z = sqlite3N
8450: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
8460: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a   pName);.  if( z
8470: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8480: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
8490: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
84a0: 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d 3e  ( STRICMP(z, p->
84b0: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29  aCol[i].zName) )
84c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
84d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
84e0: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
84f0: 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b  n name: %s", z);
8500: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
8510: 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
8520: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8530: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
8540: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
8550: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
8560: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
8570: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
8580: 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43  b,p->aCol,(p->nC
8590: 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  ol+8)*sizeof(p->
85a0: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aCol[0]));.    i
85b0: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
85c0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
85d0: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
85e0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
85f0: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77    p->aCol = aNew
8600: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26  ;.  }.  pCol = &
8610: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
8620: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c  ;.  memset(pCol,
8630: 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43   0, sizeof(p->aC
8640: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d  ol[0]));.  pCol-
8650: 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20 20  >zName = z;. .  
8660: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  /* If there is n
8670: 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  o type specified
8680: 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20 74  , columns have t
8690: 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69 6e  he default affin
86a0: 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27 2e  ity.  ** 'NONE'.
86b0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
86c0: 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 74  ype specified, t
86d0: 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43 6f  hen sqlite3AddCo
86e0: 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c 0a  lumnType() will.
86f0: 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6e    ** be called n
8700: 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c 2d  ext to set pCol-
8710: 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65 63  >affinity correc
8720: 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  tly..  */.  pCol
8730: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
8740: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
8750: 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 31 3b  pCol->szEst = 1;
8760: 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a  .  p->nCol++;.}.
8770: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
8780: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
8790: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
87a0: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
87b0: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
87c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
87d0: 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20  tement.  A "NOT 
87e0: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74  NULL" constraint
87f0: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65   has.** been see
8800: 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20  n on a column.  
8810: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
8820: 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c  s the notNull fl
8830: 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c  ag on.** the col
8840: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
8850: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
8860: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8870: 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73  3AddNotNull(Pars
8880: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
8890: 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65  nError){.  Table
88a0: 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61 72 73   *p;.  p = pPars
88b0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
88c0: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45  if( p==0 || NEVE
88d0: 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72  R(p->nCol<1) ) r
88e0: 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  eturn;.  p->aCol
88f0: 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e  [p->nCol-1].notN
8900: 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  ull = (u8)onErro
8910: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e  r;.}../*.** Scan
8920: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70 65   the column type
8930: 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65 6e   name zType (len
8940: 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20 72  gth nType) and r
8950: 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73 73  eturn the.** ass
8960: 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74 79  ociated affinity
8970: 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   type..**.** Thi
8980: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61  s routine does a
8990: 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65 6e   case-independen
89a0: 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79 70  t search of zTyp
89b0: 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73 75  e for the .** su
89c0: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20  bstrings in the 
89d0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 2e  following table.
89e0: 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   If one of the s
89f0: 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a 20  ubstrings is.** 
8a00: 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72 65  found, the corre
8a10: 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69 74  sponding affinit
8a20: 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  y is returned. I
8a30: 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e 73  f zType contains
8a40: 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  .** more than on
8a50: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
8a60: 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f 77  ngs, entries tow
8a70: 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20 0a  ard the top of .
8a80: 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61 6b  ** the table tak
8a90: 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72 20  e priority. For 
8aa0: 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79 70  example, if zTyp
8ab0: 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c 20  e is 'BLOBINT', 
8ac0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  .** SQLITE_AFF_I
8ad0: 4e 54 45 47 45 52 20 69 73 20 72 65 74 75 72 6e  NTEGER is return
8ae0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74 72  ed..**.** Substr
8af0: 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e 69  ing     | Affini
8b00: 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ty.** ----------
8b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b20: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20  ------.** 'INT' 
8b30: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8b40: 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a 20  _AFF_INTEGER.** 
8b50: 27 43 48 41 52 27 20 20 20 20 20 20 20 20 7c 20  'CHAR'        | 
8b60: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
8b70: 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20 20  ** 'CLOB'       
8b80: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
8b90: 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20 20  XT.** 'TEXT'    
8ba0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8bb0: 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27 20  _TEXT.** 'BLOB' 
8bc0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8bd0: 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45 41  AFF_NONE.** 'REA
8be0: 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  L'        | SQLI
8bf0: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27  TE_AFF_REAL.** '
8c00: 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20 53  FLOA'        | S
8c10: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
8c20: 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20 20 20  * 'DOUB'        
8c30: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
8c40: 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20  L.**.** If none 
8c50: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
8c60: 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74  s in the above t
8c70: 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c 0a  able are found,.
8c80: 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  ** SQLITE_AFF_NU
8c90: 4d 45 52 49 43 20 69 73 20 72 65 74 75 72 6e 65  MERIC is returne
8ca0: 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74  d..*/.char sqlit
8cb0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 63  e3AffinityType(c
8cc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c 20  onst char *zIn, 
8cd0: 75 38 20 2a 70 73 7a 45 73 74 29 7b 0a 20 20 75  u8 *pszEst){.  u
8ce0: 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72  32 h = 0;.  char
8cf0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8d00: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e  F_NUMERIC;.  con
8d10: 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72 20 3d  st char *zChar =
8d20: 20 30 3b 0a 0a 20 20 69 66 28 20 7a 49 6e 3d 3d   0;..  if( zIn==
8d30: 30 20 29 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  0 ) return aff;.
8d40: 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d 20    while( zIn[0] 
8d50: 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c 38  ){.    h = (h<<8
8d60: 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65 72  ) + sqlite3Upper
8d70: 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26 30  ToLower[(*zIn)&0
8d80: 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b  xff];.    zIn++;
8d90: 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63  .    if( h==(('c
8da0: 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29  '<<24)+('h'<<16)
8db0: 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29  +('a'<<8)+'r') )
8dc0: 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {             /*
8dd0: 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61   CHAR */.      a
8de0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8df0: 54 45 58 54 3b 0a 20 20 20 20 20 20 7a 43 68 61  TEXT;.      zCha
8e00: 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c  r = zIn;.    }el
8e10: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c  se if( h==(('c'<
8e20: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
8e30: 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20  'o'<<8)+'b') ){ 
8e40: 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f        /* CLOB */
8e50: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
8e60: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
8e70: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
8e80: 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c  ('t'<<24)+('e'<<
8e90: 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27  16)+('x'<<8)+'t'
8ea0: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45  ) ){       /* TE
8eb0: 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  XT */.      aff 
8ec0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
8ed0: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
8ee0: 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28   h==(('b'<<24)+(
8ef0: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
8f00: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
8f10: 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20  /* BLOB */.     
8f20: 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49     && (aff==SQLI
8f30: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c  TE_AFF_NUMERIC |
8f40: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
8f50: 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20  F_REAL) ){.     
8f60: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8f70: 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 69 66  F_NONE;.      if
8f80: 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20 29 20  ( zIn[0]=='(' ) 
8f90: 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23 69 66  zChar = zIn;.#if
8fa0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8fb0: 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a  _FLOATING_POINT.
8fc0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
8fd0: 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65 27  =(('r'<<24)+('e'
8fe0: 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27  <<16)+('a'<<8)+'
8ff0: 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  l')          /* 
9000: 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20  REAL */.        
9010: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
9020: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
9030: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
9040: 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d  _AFF_REAL;.    }
9050: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 66  else if( h==(('f
9060: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
9070: 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20  +('o'<<8)+'a')  
9080: 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20          /* FLOA 
9090: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
90a0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
90b0: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
90c0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
90d0: 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  REAL;.    }else 
90e0: 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34  if( h==(('d'<<24
90f0: 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27  )+('o'<<16)+('u'
9100: 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20  <<8)+'b')       
9110: 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20     /* DOUB */.  
9120: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
9130: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9140: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
9150: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
9160: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
9170: 65 20 69 66 28 20 28 68 26 30 78 30 30 46 46 46  e if( (h&0x00FFF
9180: 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29  FFF)==(('i'<<16)
9190: 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29  +('n'<<8)+'t') )
91a0: 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20  {    /* INT */. 
91b0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
91c0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
91d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
91e0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  }.  }..  /* If p
91f0: 73 7a 45 73 74 20 69 73 20 6e 6f 74 20 4e 55 4c  szEst is not NUL
9200: 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73 74 69  L, store an esti
9210: 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69 65 6c  mate of the fiel
9220: 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20 20 2a  d size.  The.  *
9230: 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20 73 63  * estimate is sc
9240: 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  aled so that the
9250: 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74 65   size of an inte
9260: 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20  ger is 1.  */.  
9270: 69 66 28 20 70 73 7a 45 73 74 20 29 7b 0a 20 20  if( pszEst ){.  
9280: 20 20 2a 70 73 7a 45 73 74 20 3d 20 31 3b 20 20    *pszEst = 1;  
9290: 20 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a 65   /* default size
92a0: 20 69 73 20 61 70 70 72 6f 78 20 34 20 62 79 74   is approx 4 byt
92b0: 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66  es */.    if( af
92c0: 66 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  f<=SQLITE_AFF_NO
92d0: 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  NE ){.      if( 
92e0: 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20 20  zChar ){.       
92f0: 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d   while( zChar[0]
9300: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
9310: 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74  ( sqlite3Isdigit
9320: 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20  (zChar[0]) ){.  
9330: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 20            int v 
9340: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
9350: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
9360: 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a 20 20 20  (zChar, &v);.   
9370: 20 20 20 20 20 20 20 20 20 76 20 3d 20 76 2f 34           v = v/4
9380: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   + 1;.          
9390: 20 20 69 66 28 20 76 3e 32 35 35 20 29 20 76 20    if( v>255 ) v 
93a0: 3d 20 32 35 35 3b 0a 20 20 20 20 20 20 20 20 20  = 255;.         
93b0: 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 76 3b 20     *pszEst = v; 
93c0: 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43  /* BLOB(k), VARC
93d0: 48 41 52 28 6b 29 2c 20 43 48 41 52 28 6b 29 20  HAR(k), CHAR(k) 
93e0: 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a  -> r=(k/4+1) */.
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9400: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
9410: 20 20 20 20 20 20 20 20 20 7a 43 68 61 72 2b 2b           zChar++
9420: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9430: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9440: 20 2a 70 73 7a 45 73 74 20 3d 20 35 3b 20 20 20   *pszEst = 5;   
9450: 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43  /* BLOB, TEXT, C
9460: 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70  LOB -> r=5  (app
9470: 72 6f 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a  rox 20 bytes)*/.
9480: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9490: 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  }.  return aff;.
94a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
94b0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
94c0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
94d0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
94e0: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
94f0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
9500: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70  tatement.  The p
9510: 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74  First token is t
9520: 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65  he first.** toke
9530: 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  n in the sequenc
9540: 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74  e of tokens that
9550: 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 79   describe the ty
9560: 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c  pe of the.** col
9570: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
9580: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
9590: 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74 68 65  .   pLast is the
95a0: 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69   last token.** i
95b0: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20  n the sequence. 
95c0: 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d   Use this inform
95d0: 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75  ation to constru
95e0: 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74  ct a string.** t
95f0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
9600: 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65   typename of the
9610: 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72   column and stor
9620: 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a  e that string.**
9630: 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76   in zType..*/ .v
9640: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
9650: 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a  lumnType(Parse *
9660: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
9670: 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Type){.  Table *
9680: 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  p;.  Column *pCo
9690: 6c 3b 0a 0a 20 20 70 20 3d 20 70 50 61 72 73 65  l;..  p = pParse
96a0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
96b0: 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52  f( p==0 || NEVER
96c0: 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65  (p->nCol<1) ) re
96d0: 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26  turn;.  pCol = &
96e0: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
96f0: 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  1];.  assert( pC
9700: 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 3b 0a  ol->zType==0 );.
9710: 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20    pCol->zType = 
9720: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
9730: 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
9740: 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d   pType);.  pCol-
9750: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
9760: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
9770: 70 43 6f 6c 2d 3e 7a 54 79 70 65 2c 20 26 70 43  pCol->zType, &pC
9780: 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 7d 0a 0a 2f  ol->szEst);.}../
9790: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
97a0: 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ion is the defau
97b0: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
97c0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
97d0: 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  dded column.** o
97e0: 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  f the table curr
97f0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
9800: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
9810: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78  Default value ex
9820: 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62  pressions must b
9830: 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69  e constant.  Rai
9840: 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  se an exception 
9850: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f  if this.** is no
9860: 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a  t the case..**.*
9870: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9880: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
9890: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
98a0: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
98b0: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
98c0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
98d0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
98e0: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
98f0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
9900: 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e   ExprSpan *pSpan
9910: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
9920: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
9930: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9940: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d  Parse->db;.  p =
9950: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9960: 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29  le;.  if( p!=0 )
9970: 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70  {.    pCol = &(p
9980: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
9990: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c  ]);.    if( !sql
99a0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
99b0: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53 70  ntOrFunction(pSp
99c0: 61 6e 2d 3e 70 45 78 70 72 29 20 29 7b 0a 20 20  an->pExpr) ){.  
99d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
99e0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66  Msg(pParse, "def
99f0: 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f  ault value of co
9a00: 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74  lumn [%s] is not
9a10: 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20   constant",.    
9a20: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
9a30: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
9a40: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
9a50: 66 20 70 45 78 70 72 20 69 73 20 75 73 65 64 20  f pExpr is used 
9a60: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f  instead of the o
9a70: 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70  riginal, as pExp
9a80: 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  r contains.     
9a90: 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20   ** tokens that 
9aa0: 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c  point to volatil
9ab0: 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27 73  e memory. The 's
9ac0: 70 61 6e 27 20 6f 66 20 74 68 65 20 65 78 70 72  pan' of the expr
9ad0: 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ession.      ** 
9ae0: 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 70  is required by p
9af0: 72 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f  ragma table_info
9b00: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
9b10: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
9b20: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
9b30: 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  lt);.      pCol-
9b40: 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >pDflt = sqlite3
9b50: 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 70 61  ExprDup(db, pSpa
9b60: 6e 2d 3e 70 45 78 70 72 2c 20 45 58 50 52 44 55  n->pExpr, EXPRDU
9b70: 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20  P_REDUCE);.     
9b80: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9b90: 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b  b, pCol->zDflt);
9ba0: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 44 66  .      pCol->zDf
9bb0: 6c 74 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  lt = sqlite3DbSt
9bc0: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
9bd0: 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a  )pSpan->zStart,.
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c00: 20 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e       (int)(pSpan
9c10: 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e  ->zEnd - pSpan->
9c20: 7a 53 74 61 72 74 29 29 3b 0a 20 20 20 20 7d 0a  zStart));.    }.
9c30: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
9c40: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 53 70 61  rDelete(db, pSpa
9c50: 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  n->pExpr);.}../*
9c60: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
9c70: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
9c80: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
9c90: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
9ca0: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
9cb0: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
9cc0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
9cd0: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
9ce0: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
9cf0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
9d00: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
9d10: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
9d20: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
9d30: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
9d40: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
9d50: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
9d60: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
9d70: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
9d80: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
9d90: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
9da0: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
9db0: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
9dc0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
9dd0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
9de0: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
9df0: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
9e00: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
9e10: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
9e20: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
9e30: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
9e40: 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62  id.  Set the Tab
9e50: 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c  le.iPKey.** fiel
9e60: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75  d of the table u
9e70: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
9e80: 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65  n to be the inde
9e90: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45  x of the.** INTE
9ea0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
9eb0: 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69  column.  Table.i
9ec0: 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d  PKey is set to -
9ed0: 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  1 if there is.**
9ee0: 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d   no INTEGER PRIM
9ef0: 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49  ARY KEY..**.** I
9f00: 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74  f the key is not
9f10: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
9f20: 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72  ARY KEY, then cr
9f30: 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a  eate a unique.**
9f40: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b   index for the k
9f50: 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73  ey.  No index is
9f60: 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54   created for INT
9f70: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
9f80: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
9f90: 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
9fa0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9fb0: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
9fc0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
9fd0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f  rList *pList,  /
9fe0: 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20  * List of field 
9ff0: 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65  names to be inde
a000: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
a010: 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68  rror,      /* Wh
a020: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20  at to do with a 
a030: 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c  uniqueness confl
a040: 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74  ict */.  int aut
a050: 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72  oInc,      /* Tr
a060: 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e  ue if the AUTOIN
a070: 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20  CREMENT keyword 
a080: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
a090: 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20  int sortOrder   
a0a0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41    /* SQLITE_SO_A
a0b0: 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f  SC or SQLITE_SO_
a0c0: 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  DESC */.){.  Tab
a0d0: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
a0e0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
a0f0: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b  char *zType = 0;
a100: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31  .  int iCol = -1
a110: 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d  , i;.  int nTerm
a120: 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ;.  if( pTab==0 
a130: 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
a140: 41 42 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72  AB ) goto primar
a150: 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66  y_key_exit;.  if
a160: 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73  ( pTab->tabFlags
a170: 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79   & TF_HasPrimary
a180: 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
a190: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
a1a0: 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65  e, .      "table
a1b0: 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65   \"%s\" has more
a1c0: 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72   than one primar
a1d0: 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e  y key", pTab->zN
a1e0: 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70  ame);.    goto p
a1f0: 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b  rimary_key_exit;
a200: 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62  .  }.  pTab->tab
a210: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50  Flags |= TF_HasP
a220: 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28  rimaryKey;.  if(
a230: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
a240: 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43   iCol = pTab->nC
a250: 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62  ol - 1;.    pTab
a260: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c  ->aCol[iCol].col
a270: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
a280: 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 7a 54  _PRIMKEY;.    zT
a290: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
a2a0: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
a2b0: 20 20 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d    nTerm = 1;.  }
a2c0: 65 6c 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20  else{.    nTerm 
a2d0: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
a2e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
a2f0: 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Term; i++){.    
a300: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
a310: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
a320: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
a330: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
a340: 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  mp(pList->a[i].z
a350: 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c  Name, pTab->aCol
a360: 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  [iCol].zName)==0
a370: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54   ){.          pT
a380: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63  ab->aCol[iCol].c
a390: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
a3a0: 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20  AG_PRIMKEY;.    
a3b0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54        zType = pT
a3c0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
a3d0: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
a3e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
a3f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a400: 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d   }.  if( nTerm==
a410: 31 0a 20 20 20 26 26 20 7a 54 79 70 65 20 26 26  1.   && zType &&
a420: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
a430: 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22  zType, "INTEGER"
a440: 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72 74 4f  )==0.   && sortO
a450: 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  rder==SQLITE_SO_
a460: 41 53 43 0a 20 20 29 7b 0a 20 20 20 20 70 54 61  ASC.  ){.    pTa
a470: 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b  b->iPKey = iCol;
a480: 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f  .    pTab->keyCo
a490: 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  nf = (u8)onError
a4a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 75  ;.    assert( au
a4b0: 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f  toInc==0 || auto
a4c0: 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54  Inc==1 );.    pT
a4d0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20  ab->tabFlags |= 
a4e0: 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69  autoInc*TF_Autoi
a4f0: 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66  ncrement;.    if
a500: 28 20 70 4c 69 73 74 20 29 20 70 50 61 72 73 65  ( pList ) pParse
a510: 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d  ->iPkSortOrder =
a520: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72   pList->a[0].sor
a530: 74 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65 20  tOrder;.  }else 
a540: 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23  if( autoInc ){.#
a550: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a560: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
a570: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
a580: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55  rMsg(pParse, "AU
a590: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f  TOINCREMENT is o
a5a0: 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61  nly allowed on a
a5b0: 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45  n ".       "INTE
a5c0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
a5d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
a5e0: 65 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  e{.    Vdbe *v =
a5f0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
a600: 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20      Index *p;.  
a610: 20 20 69 66 28 20 76 20 29 20 70 50 61 72 73 65    if( v ) pParse
a620: 2d 3e 61 64 64 72 53 6b 69 70 50 4b 20 3d 20 73  ->addrSkipPK = s
a630: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
a640: 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20  (v, OP_Noop);.  
a650: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 43 72 65    p = sqlite3Cre
a660: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
a670: 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c   0, 0, 0, pList,
a680: 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20 20   onError, 0,.   
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6a0: 20 20 20 20 20 20 20 20 30 2c 20 73 6f 72 74 4f          0, sortO
a6b0: 72 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  rder, 0);.    if
a6c0: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ( p ){.      p->
a6d0: 69 64 78 54 79 70 65 20 3d 20 53 51 4c 49 54 45  idxType = SQLITE
a6e0: 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59  _IDXTYPE_PRIMARY
a6f0: 4b 45 59 3b 0a 20 20 20 20 20 20 69 66 28 20 76  KEY;.      if( v
a700: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75   ) sqlite3VdbeJu
a710: 6d 70 48 65 72 65 28 76 2c 20 70 50 61 72 73 65  mpHere(v, pParse
a720: 2d 3e 61 64 64 72 53 6b 69 70 50 4b 29 3b 0a 20  ->addrSkipPK);. 
a730: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d     }.    pList =
a740: 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79   0;.  }..primary
a750: 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c  _key_exit:.  sql
a760: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
a770: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
a780: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b  List);.  return;
a790: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
a7a0: 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  new CHECK constr
a7b0: 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c  aint to the tabl
a7c0: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
a7d0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
a7e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
a7f0: 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e  ddCheckConstrain
a800: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
a810: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
a820: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
a830: 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20  xpr *pCheckExpr 
a840: 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78   /* The check ex
a850: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23  pression */.){.#
a860: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
a870: 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65  IT_CHECK.  Table
a880: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
a890: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73 71  >pNewTable;.  sq
a8a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a8b0: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 54  se->db;.  if( pT
a8c0: 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52  ab && !IN_DECLAR
a8d0: 45 5f 56 54 41 42 0a 20 20 20 26 26 20 21 73 71  E_VTAB.   && !sq
a8e0: 6c 69 74 65 33 42 74 72 65 65 49 73 52 65 61 64  lite3BtreeIsRead
a8f0: 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64 62 2d  only(db->aDb[db-
a900: 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74 29 0a  >init.iDb].pBt).
a910: 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70    ){.    pTab->p
a920: 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  Check = sqlite3E
a930: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
a940: 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65  arse, pTab->pChe
a950: 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  ck, pCheckExpr);
a960: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
a970: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e  >constraintName.
a980: 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  n ){.      sqlit
a990: 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
a9a0: 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  e(pParse, pTab->
a9b0: 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73 65 2d  pCheck, &pParse-
a9c0: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2c  >constraintName,
a9d0: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   1);.    }.  }el
a9e0: 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
a9f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
aa00: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
aa10: 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d  pCheckExpr);.  }
aa20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
aa30: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  e collation func
aa40: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
aa50: 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64   recently parsed
aa60: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a   table column.**
aa70: 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20   to the CollSeq 
aa80: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
aa90: 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65  qlite3AddCollate
aaa0: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
aab0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  se, Token *pToke
aac0: 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  n){.  Table *p;.
aad0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
aae0: 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
aaf0: 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64       /* Dequoted
ab00: 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69   name of collati
ab10: 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20  on sequence */. 
ab20: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
ab30: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
ab40: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
ab50: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
ab60: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20  p->nCol-1;.  db 
ab70: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
ab80: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e  zColl = sqlite3N
ab90: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
aba0: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20   pToken);.  if( 
abb0: 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b  !zColl ) return;
abc0: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c  ..  if( sqlite3L
abd0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
abe0: 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  rse, zColl) ){. 
abf0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
ac00: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
ac10: 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d  e(db, p->aCol[i]
ac20: 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e  .zColl);.    p->
ac30: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20  aCol[i].zColl = 
ac40: 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a  zColl;.  .    /*
ac50: 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   If the column i
ac60: 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c  s declared as "<
ac70: 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45  name> PRIMARY KE
ac80: 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e  Y COLLATE <type>
ac90: 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61  ",.    ** then a
aca0: 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65  n index may have
acb0: 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e   been created on
acc0: 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66   this column bef
acd0: 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63  ore the.    ** c
ace0: 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61  ollation type wa
acf0: 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74  s added. Correct
ad00: 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20 74   this if it is t
ad10: 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  he case..    */.
ad20: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e      for(pIdx=p->
ad30: 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
ad40: 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
ad50: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ad60: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20  Idx->nKeyCol==1 
ad70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  );.      if( pId
ad80: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
ad90: 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64  i ){.        pId
ada0: 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70  x->azColl[0] = p
adb0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b  ->aCol[i].zColl;
adc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
add0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
ade0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
adf0: 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  oll);.  }.}../*.
ae00: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
ae10: 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c   returns the col
ae20: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
ae30: 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61 74  for database nat
ae40: 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f  ive text.** enco
ae50: 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20  ding identified 
ae60: 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e  by the string zN
ae70: 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d  ame, length nNam
ae80: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
ae90: 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
aea0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20  ion sequence is 
aeb0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  not available, o
aec0: 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a  r not available.
aed0: 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ** in the databa
aee0: 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69  se native encodi
aef0: 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ng, the collatio
af00: 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76  n factory is inv
af10: 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65  oked to.** reque
af20: 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f  st it. If the co
af30: 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20  llation factory 
af40: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20  does not supply 
af50: 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c  such a sequence,
af60: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75  .** and the sequ
af70: 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  ence is availabl
af80: 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78  e in another tex
af90: 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e  t encoding, then
afa0: 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75   that is.** retu
afb0: 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  rned instead..**
afc0: 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f  .** If no versio
afd0: 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65 73  ns of the reques
afe0: 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73  ted collations s
aff0: 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61 69  equence are avai
b000: 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f  lable, or.** ano
b010: 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72  ther error occur
b020: 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  s, NULL is retur
b030: 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  ned and an error
b040: 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65 6e   message written
b050: 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e   into.** pParse.
b060: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
b070: 69 6e 65 20 69 73 20 61 20 77 72 61 70 70 65 72  ine is a wrapper
b080: 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46   around sqlite3F
b090: 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54  indCollSeq().  T
b0a0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
b0b0: 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61  nvokes the colla
b0c0: 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20  tion factory if 
b0d0: 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74  the named collat
b0e0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ion cannot be fo
b0f0: 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  und.** and gener
b100: 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  ates an error me
b110: 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  ssage..**.** See
b120: 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69   also: sqlite3Fi
b130: 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c  ndCollSeq(), sql
b140: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29  ite3GetCollSeq()
b150: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
b160: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
b170: 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  q(Parse *pParse,
b180: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
b190: 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  me){.  sqlite3 *
b1a0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
b1b0: 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28  .  u8 enc = ENC(
b1c0: 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75  db);.  u8 initbu
b1d0: 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75  sy = db->init.bu
b1e0: 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  sy;.  CollSeq *p
b1f0: 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d  Coll;..  pColl =
b200: 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
b210: 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61  Seq(db, enc, zNa
b220: 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20  me, initbusy);. 
b230: 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20 26   if( !initbusy &
b240: 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43  & (!pColl || !pC
b250: 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20  oll->xCmp) ){.  
b260: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
b270: 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72  3GetCollSeq(pPar
b280: 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20  se, enc, pColl, 
b290: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  zName);.  }..  r
b2a0: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
b2b0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
b2c0: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
b2d0: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68  ncrement the sch
b2e0: 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a  ema cookie..**.*
b2f0: 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * The schema coo
b300: 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  kie is used to d
b310: 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68  etermine when th
b320: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
b330: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
b340: 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63  nges.  After eac
b350: 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c  h schema change,
b360: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75   the cookie valu
b370: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57  e.** changes.  W
b380: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69  hen a process fi
b390: 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63  rst reads the sc
b3a0: 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20  hema it records 
b3b0: 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20  the.** cookie.  
b3c0: 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e  Thereafter, when
b3d0: 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20  ever it goes to 
b3e0: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
b3f0: 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b  ase,.** it check
b400: 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  s the cookie to 
b410: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  make sure the sc
b420: 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61  hema has not cha
b430: 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74  nged.** since it
b440: 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a   was last read..
b450: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20  **.** This plan 
b460: 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  is not completel
b470: 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20  y bullet-proof. 
b480: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
b490: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  for.** the schem
b4a0: 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74  a to change mult
b4b0: 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66  iple times and f
b4c0: 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  or the cookie to
b4d0: 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20   be.** set back 
b4e0: 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20  to prior value. 
b4f0: 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e   But schema chan
b500: 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65  ges are infreque
b510: 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72  nt.** and the pr
b520: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74  obability of hit
b530: 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f  ting the same co
b540: 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e  okie value is on
b550: 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69  ly.** 1 chance i
b560: 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72  n 2^32.  So we'r
b570: 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a  e safe enough..*
b580: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68  /.void sqlite3Ch
b590: 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73 65  angeCookie(Parse
b5a0: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44   *pParse, int iD
b5b0: 62 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  b){.  int r1 = s
b5c0: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
b5d0: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
b5e0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b5f0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
b600: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
b610: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b620: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
b630: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
b640: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
b650: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
b660: 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  er, db->aDb[iDb]
b670: 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
b680: 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72 31 29 3b 0a  _cookie+1, r1);.
b690: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b6a0: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
b6b0: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
b6c0: 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20  SCHEMA_VERSION, 
b6d0: 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  r1);.  sqlite3Re
b6e0: 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
b6f0: 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a  rse, r1);.}../*.
b700: 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e  ** Measure the n
b710: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
b720: 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75  ers needed to ou
b730: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a  tput the given.*
b740: 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54  * identifier.  T
b750: 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
b760: 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20  ed includes any 
b770: 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62  quotes used.** b
b780: 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c  ut does not incl
b790: 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72  ude the null ter
b7a0: 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  minator..**.** T
b7b0: 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63  he estimate is c
b7c0: 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74  onservative.  It
b7d0: 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72   might be larger
b7e0: 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a   that what is.**
b7f0: 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a   really needed..
b800: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64  */.static int id
b810: 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  entLength(const 
b820: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
b830: 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a  n;.  for(n=0; *z
b840: 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20  ; n++, z++){.   
b850: 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20   if( *z=='"' ){ 
b860: 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74  n++; }.  }.  ret
b870: 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a  urn n + 2;.}../*
b880: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61  .** The first pa
b890: 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
b8a0: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75  nter to an outpu
b8b0: 74 20 62 75 66 66 65 72 2e 20 54 68 65 20 73 65  t buffer. The se
b8c0: 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74  cond .** paramet
b8d0: 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
b8e0: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68  to an integer th
b8f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
b900: 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68 69  offset at.** whi
b910: 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f  ch to write into
b920: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
b930: 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
b940: 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20  n copies the.** 
b950: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
b960: 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f  tring pointed to
b970: 20 62 79 20 74 68 65 20 74 68 69 72 64 20 70 61   by the third pa
b980: 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65 64  rameter, zSigned
b990: 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65  Ident,.** to the
b9a0: 20 73 70 65 63 69 66 69 65 64 20 6f 66 66 73 65   specified offse
b9b0: 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  t in the buffer 
b9c0: 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49 64  and updates *pId
b9d0: 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f  x to refer.** to
b9e0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
b9f0: 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 62  after the last b
ba00: 79 74 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f  yte written befo
ba10: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
ba20: 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69   .** If the stri
ba30: 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 20  ng zSignedIdent 
ba40: 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
ba50: 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72  y of alpha-numer
ba60: 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  ic.** characters
ba70: 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  , does not begin
ba80: 20 77 69 74 68 20 61 20 64 69 67 69 74 20 61 6e   with a digit an
ba90: 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20  d is not an SQL 
baa0: 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e  keyword,.** then
bab0: 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
bac0: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
bad0: 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 69 74  er exactly as it
bae0: 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a   is. Otherwise,.
baf0: 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64 20  ** it is quoted 
bb00: 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f  using double-quo
bb10: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
bb20: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
bb30: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
bb40: 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64   char *zSignedId
bb50: 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ent){.  unsigned
bb60: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20   char *zIdent = 
bb70: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
bb80: 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20  zSignedIdent;.  
bb90: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
bba0: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
bbb0: 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ;..  for(j=0; zI
bbc0: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
bbd0: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49     if( !sqlite3I
bbe0: 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d  salnum(zIdent[j]
bbf0: 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  ) && zIdent[j]!=
bc00: 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  '_' ) break;.  }
bc10: 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 73  .  needQuote = s
bc20: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 49  qlite3Isdigit(zI
bc30: 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20  dent[0]).       
bc40: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b       || sqlite3K
bc50: 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e  eywordCode(zIden
bc60: 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20 20 20  t, j)!=TK_ID.   
bc70: 20 20 20 20 20 20 20 20 20 7c 7c 20 7a 49 64 65           || zIde
bc80: 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20 20 20  nt[j]!=0.       
bc90: 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20       || j==0;.. 
bca0: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
bcb0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
bcc0: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
bcd0: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  [j]; j++){.    z
bce0: 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a  [i++] = zIdent[j
bcf0: 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e  ];.    if( zIden
bd00: 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b  t[j]=='"' ) z[i+
bd10: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20  +] = '"';.  }.  
bd20: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
bd30: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
bd40: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64  z[i] = 0;.  *pId
bd50: 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x = i;.}../*.** 
bd60: 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54  Generate a CREAT
bd70: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
bd80: 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  t appropriate fo
bd90: 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74  r the given.** t
bda0: 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f  able.  Memory to
bdb0: 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f   hold the text o
bdc0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
bdd0: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
bde0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
bdf0: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
be00: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
be10: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
be20: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72  .static char *cr
be30: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71  eateTableStmt(sq
be40: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
be50: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b   *p){.  int i, k
be60: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  , n;.  char *zSt
be70: 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70  mt;.  char *zSep
be80: 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b  , *zSep2, *zEnd;
be90: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
bea0: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  n = 0;.  for(
beb0: 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20  pCol = p->aCol, 
bec0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
bed0: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
bee0: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
bef0: 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20  th(pCol->zName) 
bf00: 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  + 5;.  }.  n += 
bf10: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a  identLength(p->z
bf20: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35  Name);.  if( n<5
bf30: 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d  0 ){ .    zSep =
bf40: 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d   "";.    zSep2 =
bf50: 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d   ",";.    zEnd =
bf60: 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   ")";.  }else{. 
bf70: 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22     zSep = "\n  "
bf80: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
bf90: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20  \n  ";.    zEnd 
bfa0: 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e  = "\n)";.  }.  n
bfb0: 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43   += 35 + 6*p->nC
bfc0: 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71  ol;.  zStmt = sq
bfd0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
bfe0: 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53  (0, n);.  if( zS
bff0: 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  tmt==0 ){.    db
c000: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
c010: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   1;.    return 0
c020: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
c030: 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d  snprintf(n, zStm
c040: 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  t, "CREATE TABLE
c050: 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74   ");.  k = sqlit
c060: 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74  e3Strlen30(zStmt
c070: 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53  );.  identPut(zS
c080: 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d  tmt, &k, p->zNam
c090: 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d  e);.  zStmt[k++]
c0a0: 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43   = '(';.  for(pC
c0b0: 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b  ol=p->aCol, i=0;
c0c0: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c   i<p->nCol; i++,
c0d0: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74   pCol++){.    st
c0e0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
c0f0: 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d  * const azType[]
c100: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20   = {.        /* 
c110: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
c120: 20 20 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20     */ " TEXT",. 
c130: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
c140: 5f 41 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20  _AFF_NONE    */ 
c150: 22 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  "",.        /* S
c160: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
c170: 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20  C */ " NUM",.   
c180: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
c190: 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20  FF_INTEGER */ " 
c1a0: 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a  INT",.        /*
c1b0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
c1c0: 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20      */ " REAL". 
c1d0: 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65     };.    int le
c1e0: 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  n;.    const cha
c1f0: 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73  r *zType;..    s
c200: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
c210: 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20  n-k, &zStmt[k], 
c220: 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20  zSep);.    k += 
c230: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
c240: 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20  &zStmt[k]);.    
c250: 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20  zSep = zSep2;.  
c260: 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74    identPut(zStmt
c270: 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  , &k, pCol->zNam
c280: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
c290: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53  pCol->affinity-S
c2a0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3e  QLITE_AFF_TEXT >
c2b0: 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  = 0 );.    asser
c2c0: 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  t( pCol->affinit
c2d0: 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  y-SQLITE_AFF_TEX
c2e0: 54 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a  T < ArraySize(az
c2f0: 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73  Type) );.    tes
c300: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
c310: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
c320: 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65  F_TEXT );.    te
c330: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
c340: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
c350: 46 46 5f 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 74  FF_NONE );.    t
c360: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
c370: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
c380: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20  AFF_NUMERIC );. 
c390: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f     testcase( pCo
c3a0: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
c3b0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
c3c0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c3d0: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d   pCol->affinity=
c3e0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c  =SQLITE_AFF_REAL
c3f0: 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79   );.    .    zTy
c400: 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c  pe = azType[pCol
c410: 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c  ->affinity - SQL
c420: 49 54 45 5f 41 46 46 5f 54 45 58 54 5d 3b 0a 20  ITE_AFF_TEXT];. 
c430: 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33     len = sqlite3
c440: 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b  Strlen30(zType);
c450: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f  .    assert( pCo
c460: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  l->affinity==SQL
c470: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 0a 20 20  ITE_AFF_NONE .  
c480: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f            || pCo
c490: 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c  l->affinity==sql
c4a0: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
c4b0: 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a 20 20  (zType, 0) );.  
c4c0: 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b    memcpy(&zStmt[
c4d0: 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b  k], zType, len);
c4e0: 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20  .    k += len;. 
c4f0: 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20     assert( k<=n 
c500: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
c510: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
c520: 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20  zStmt[k], "%s", 
c530: 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  zEnd);.  return 
c540: 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zStmt;.}../*.** 
c550: 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65 78 20  Resize an Index 
c560: 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 4e  object to hold N
c570: 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e 20   columns total. 
c580: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
c590: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
c5a0: 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  and SQLITE_NOMEM
c5b0: 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   on an OOM error
c5c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c5d0: 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63  resizeIndexObjec
c5e0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  t(sqlite3 *db, I
c5f0: 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20  ndex *pIdx, int 
c600: 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74  N){.  char *zExt
c610: 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  ra;.  int nByte;
c620: 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f  .  if( pIdx->nCo
c630: 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72 6e  lumn>=N ) return
c640: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
c650: 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73 52 65  sert( pIdx->isRe
c660: 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 42  sized==0 );.  nB
c670: 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28 63 68  yte = (sizeof(ch
c680: 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 31  ar*) + sizeof(i1
c690: 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45 78  6) + 1)*N;.  zEx
c6a0: 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  tra = sqlite3DbM
c6b0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
c6c0: 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45 78 74  yte);.  if( zExt
c6d0: 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ra==0 ) return S
c6e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d  QLITE_NOMEM;.  m
c6f0: 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49  emcpy(zExtra, pI
c700: 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65  dx->azColl, size
c710: 6f 66 28 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e  of(char*)*pIdx->
c720: 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78  nColumn);.  pIdx
c730: 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72  ->azColl = (char
c740: 2a 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78  **)zExtra;.  zEx
c750: 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68  tra += sizeof(ch
c760: 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79  ar*)*N;.  memcpy
c770: 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61  (zExtra, pIdx->a
c780: 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28  iColumn, sizeof(
c790: 69 31 36 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75  i16)*pIdx->nColu
c7a0: 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43  mn);.  pIdx->aiC
c7b0: 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45  olumn = (i16*)zE
c7c0: 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b  xtra;.  zExtra +
c7d0: 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b  = sizeof(i16)*N;
c7e0: 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61  .  memcpy(zExtra
c7f0: 2c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  , pIdx->aSortOrd
c800: 65 72 2c 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  er, pIdx->nColum
c810: 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72  n);.  pIdx->aSor
c820: 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 7a 45  tOrder = (u8*)zE
c830: 78 74 72 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43  xtra;.  pIdx->nC
c840: 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64  olumn = N;.  pId
c850: 78 2d 3e 69 73 52 65 73 69 7a 65 64 20 3d 20 31  x->isResized = 1
c860: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
c870: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  E_OK;.}../*.** E
c880: 73 74 69 6d 61 74 65 20 74 68 65 20 74 6f 74 61  stimate the tota
c890: 6c 20 72 6f 77 20 77 69 64 74 68 20 66 6f 72 20  l row width for 
c8a0: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  a table..*/.stat
c8b0: 69 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65  ic void estimate
c8c0: 54 61 62 6c 65 57 69 64 74 68 28 54 61 62 6c 65  TableWidth(Table
c8d0: 20 2a 70 54 61 62 29 7b 0a 20 20 75 6e 73 69 67   *pTab){.  unsig
c8e0: 6e 65 64 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a  ned wTable = 0;.
c8f0: 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a    const Column *
c900: 70 54 61 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69  pTabCol;.  int i
c910: 3b 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e  ;.  for(i=pTab->
c920: 6e 43 6f 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54  nCol, pTabCol=pT
c930: 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69  ab->aCol; i>0; i
c940: 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a  --, pTabCol++){.
c950: 20 20 20 20 77 54 61 62 6c 65 20 2b 3d 20 70 54      wTable += pT
c960: 61 62 43 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20  abCol->szEst;.  
c970: 7d 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50  }.  if( pTab->iP
c980: 4b 65 79 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b  Key<0 ) wTable++
c990: 3b 0a 20 20 70 54 61 62 2d 3e 73 7a 54 61 62 52  ;.  pTab->szTabR
c9a0: 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  ow = sqlite3LogE
c9b0: 73 74 28 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a  st(wTable*4);.}.
c9c0: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
c9d0: 74 68 65 20 61 76 65 72 61 67 65 20 73 69 7a 65  the average size
c9e0: 20 6f 66 20 61 20 72 6f 77 20 66 6f 72 20 61 6e   of a row for an
c9f0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
ca00: 63 20 76 6f 69 64 20 65 73 74 69 6d 61 74 65 49  c void estimateI
ca10: 6e 64 65 78 57 69 64 74 68 28 49 6e 64 65 78 20  ndexWidth(Index 
ca20: 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e  *pIdx){.  unsign
ca30: 65 64 20 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ed wIndex = 0;. 
ca40: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
ca50: 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70  Column *aCol = p
ca60: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
ca70: 6c 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  l;.  for(i=0; i<
ca80: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
ca90: 2b 2b 29 7b 0a 20 20 20 20 69 31 36 20 78 20 3d  ++){.    i16 x =
caa0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
cab0: 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  i];.    assert( 
cac0: 78 3c 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  x<pIdx->pTable->
cad0: 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64  nCol );.    wInd
cae0: 65 78 20 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20  ex += x<0 ? 1 : 
caf0: 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c  aCol[pIdx->aiCol
cb00: 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20  umn[i]].szEst;. 
cb10: 20 7d 0a 20 20 70 49 64 78 2d 3e 73 7a 49 64 78   }.  pIdx->szIdx
cb20: 52 6f 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Row = sqlite3Log
cb30: 45 73 74 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d  Est(wIndex*4);.}
cb40: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65  ../* Return true
cb50: 20 69 66 20 76 61 6c 75 65 20 78 20 69 73 20 66   if value x is f
cb60: 6f 75 6e 64 20 61 6e 79 20 6f 66 20 74 68 65 20  ound any of the 
cb70: 66 69 72 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69  first nCol entri
cb80: 65 73 20 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f  es of aiCol[].*/
cb90: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 43  .static int hasC
cba0: 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20  olumn(const i16 
cbb0: 2a 61 69 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c  *aiCol, int nCol
cbc0: 2c 20 69 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c  , int x){.  whil
cbd0: 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20  e( nCol-- > 0 ) 
cbe0: 69 66 28 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b  if( x==*(aiCol++
cbf0: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ) ) return 1;.  
cc00: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
cc10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
cc20: 72 75 6e 73 20 61 74 20 74 68 65 20 65 6e 64 20  runs at the end 
cc30: 6f 66 20 70 61 72 73 69 6e 67 20 61 20 43 52 45  of parsing a CRE
cc40: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
cc50: 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68 61 73 20  ent that.** has 
cc60: 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
cc70: 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6a 6f 62  clause.  The job
cc80: 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
cc90: 20 69 73 20 74 6f 20 63 6f 6e 76 65 72 74 20 62   is to convert b
cca0: 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e 61 6c 20  oth.** internal 
ccb0: 73 63 68 65 6d 61 20 64 61 74 61 20 73 74 72 75  schema data stru
ccc0: 63 74 75 72 65 73 20 61 6e 64 20 74 68 65 20 67  ctures and the g
ccd0: 65 6e 65 72 61 74 65 64 20 56 44 42 45 20 63 6f  enerated VDBE co
cce0: 64 65 20 73 6f 20 74 68 61 74 20 74 68 65 79 0a  de so that they.
ccf0: 2a 2a 20 61 72 65 20 61 70 70 72 6f 70 72 69 61  ** are appropria
cd00: 74 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54  te for a WITHOUT
cd10: 20 52 4f 57 49 44 20 74 61 62 6c 65 20 69 6e 73   ROWID table ins
cd20: 74 65 61 64 20 6f 66 20 61 20 72 6f 77 69 64 20  tead of a rowid 
cd30: 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 6e 67 65  table..** Change
cd40: 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a  s include:.**.**
cd50: 20 20 20 20 20 28 31 29 20 20 43 6f 6e 76 65 72       (1)  Conver
cd60: 74 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 54  t the OP_CreateT
cd70: 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f  able into an OP_
cd80: 43 72 65 61 74 65 49 6e 64 65 78 2e 20 20 54 68  CreateIndex.  Th
cd90: 65 72 65 20 69 73 0a 2a 2a 20 20 20 20 20 20 20  ere is.**       
cda0: 20 20 20 6e 6f 20 72 6f 77 69 64 20 62 74 72 65     no rowid btre
cdb0: 65 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  e for a WITHOUT 
cdc0: 52 4f 57 49 44 2e 20 20 49 6e 73 74 65 61 64 2c  ROWID.  Instead,
cdd0: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 0a 2a   the canonical.*
cde0: 2a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20  *          data 
cdf0: 73 74 6f 72 61 67 65 20 69 73 20 61 20 63 6f 76  storage is a cov
ce00: 65 72 69 6e 67 20 69 6e 64 65 78 20 62 74 72 65  ering index btre
ce10: 65 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 42  e..**     (2)  B
ce20: 79 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69  ypass the creati
ce30: 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  on of the sqlite
ce40: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e  _master table en
ce50: 74 72 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  try.**          
ce60: 66 6f 72 20 74 68 65 20 50 52 49 4d 41 52 59 20  for the PRIMARY 
ce70: 4b 45 59 20 61 73 20 74 68 65 20 74 68 65 20 70  KEY as the the p
ce80: 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
ce90: 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20   is now.**      
cea0: 20 20 20 20 69 64 65 6e 74 69 66 69 65 64 20 62      identified b
ceb0: 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  y the sqlite_mas
cec0: 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79 20  ter table entry 
ced0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  of the table its
cee0: 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20  elf..**     (3) 
cef0: 20 53 65 74 20 74 68 65 20 49 6e 64 65 78 2e 74   Set the Index.t
cf00: 6e 75 6d 20 6f 66 20 74 68 65 20 50 52 49 4d 41  num of the PRIMA
cf10: 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a  RY KEY Index obj
cf20: 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  ect in the.**   
cf30: 20 20 20 20 20 20 20 73 63 68 65 6d 61 20 74 6f         schema to
cf40: 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 72   the rootpage fr
cf50: 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  om the main tabl
cf60: 65 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53  e..**     (4)  S
cf70: 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  et all columns o
cf80: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
cf90: 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  Y schema object 
cfa0: 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a  to be NOT NULL..
cfb0: 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64 64 20  **     (5)  Add 
cfc0: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
cfd0: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
cfe0: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
cff0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f  t.**          so
d000: 20 74 68 61 74 20 74 68 65 20 50 52 49 4d 41 52   that the PRIMAR
d010: 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72  Y KEY is a cover
d020: 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20  ing index.  The 
d030: 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20  surplus.**      
d040: 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20      columns are 
d050: 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e  part of KeyInfo.
d060: 6e 58 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20  nXField and are 
d070: 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  not used for.** 
d080: 20 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67           sorting
d090: 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e   or lookup or un
d0a0: 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e  iqueness checks.
d0b0: 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65 70  .**     (6)  Rep
d0c0: 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64 20 74  lace the rowid t
d0d0: 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d  ail on all autom
d0e0: 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74  atically generat
d0f0: 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20  ed UNIQUE.**    
d100: 20 20 20 20 20 20 69 6e 64 69 63 65 73 20 77 69        indices wi
d110: 74 68 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  th the PRIMARY K
d120: 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73  EY columns..*/.s
d130: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 76 65  tatic void conve
d140: 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64  rtToWithoutRowid
d150: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
d160: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
d170: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  ){.  Index *pIdx
d180: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a  ;.  Index *pPk;.
d190: 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e 74    int nPk;.  int
d1a0: 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33   i, j;.  sqlite3
d1b0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d1c0: 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  b;.  Vdbe *v = p
d1d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20  Parse->pVdbe;.. 
d1e0: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
d1f0: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 6f  OP_CreateTable o
d200: 70 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64  pcode that would
d210: 20 6e 6f 72 6d 61 6c 6c 79 20 63 72 65 61 74 65   normally create
d220: 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6f 74 2d 70   the.  ** root-p
d230: 61 67 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c  age for the tabl
d240: 65 20 69 6e 74 6f 20 61 20 4f 50 5f 43 72 65 61  e into a OP_Crea
d250: 74 65 49 6e 64 65 78 20 6f 70 63 6f 64 65 2e 20  teIndex opcode. 
d260: 20 54 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   The index.  ** 
d270: 63 72 65 61 74 65 64 20 77 69 6c 6c 20 62 65 63  created will bec
d280: 6f 6d 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ome the PRIMARY 
d290: 4b 45 59 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a  KEY index..  */.
d2a0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64    if( pParse->ad
d2b0: 64 72 43 72 54 61 62 20 29 7b 0a 20 20 20 20 61  drCrTab ){.    a
d2c0: 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 20 20  ssert( v );.    
d2d0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
d2e0: 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64 72  (v, pParse->addr
d2f0: 43 72 54 61 62 29 2d 3e 6f 70 63 6f 64 65 20 3d  CrTab)->opcode =
d300: 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 3b   OP_CreateIndex;
d310: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 79 70 61 73  .  }..  /* Bypas
d320: 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  s the creation o
d330: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
d340: 59 20 62 74 72 65 65 20 61 6e 64 20 74 68 65 20  Y btree and the 
d350: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
d360: 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 0a  ** table entry..
d370: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73    */.  if( pPars
d380: 65 2d 3e 61 64 64 72 53 6b 69 70 50 4b 20 29 7b  e->addrSkipPK ){
d390: 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 20 29  .    assert( v )
d3a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d3b0: 65 47 65 74 4f 70 28 76 2c 20 70 50 61 72 73 65  eGetOp(v, pParse
d3c0: 2d 3e 61 64 64 72 53 6b 69 70 50 4b 29 2d 3e 6f  ->addrSkipPK)->o
d3d0: 70 63 6f 64 65 20 3d 20 4f 50 5f 47 6f 74 6f 3b  pcode = OP_Goto;
d3e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74  .  }..  /* Locat
d3f0: 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  e the PRIMARY KE
d400: 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66  Y index.  Or, if
d410: 20 74 68 69 73 20 74 61 62 6c 65 20 77 61 73 20   this table was 
d420: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20  originally.  ** 
d430: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
d440: 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63 72  RY KEY table, cr
d450: 65 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d 41  eate a new PRIMA
d460: 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20  RY KEY index. . 
d470: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   */.  if( pTab->
d480: 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20  iPKey>=0 ){.    
d490: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
d4a0: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
d4b0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
d4c0: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29  nd(pParse, 0, 0)
d4d0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
d4e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
d4f0: 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e 61   pList->a[0].zNa
d500: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
d510: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
d520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d540: 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61           pTab->a
d550: 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d  Col[pTab->iPKey]
d560: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69  .zName);.    pLi
d570: 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  st->a[0].sortOrd
d580: 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b  er = pParse->iPk
d590: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 61  SortOrder;.    a
d5a0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
d5b0: 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62 20 29  NewTable==pTab )
d5c0: 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69  ;.    pPk = sqli
d5d0: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
d5e0: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
d5f0: 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79  pList, pTab->key
d600: 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Conf, 0, 0, 0, 0
d610: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 6b 3d 3d  );.    if( pPk==
d620: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
d630: 70 50 6b 2d 3e 69 64 78 54 79 70 65 20 3d 20 53  pPk->idxType = S
d640: 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52  QLITE_IDXTYPE_PR
d650: 49 4d 41 52 59 4b 45 59 3b 0a 20 20 20 20 70 54  IMARYKEY;.    pT
d660: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
d670: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b    }else{.    pPk
d680: 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
d690: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
d6a0: 0a 20 20 7d 0a 20 20 70 50 6b 2d 3e 69 73 43 6f  .  }.  pPk->isCo
d6b0: 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 61 73  vering = 1;.  as
d6c0: 73 65 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a  sert( pPk!=0 );.
d6d0: 20 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65    nPk = pPk->nKe
d6e0: 79 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  yCol;..  /* Make
d6f0: 20 73 75 72 65 20 65 76 65 72 79 20 63 6f 6c 75   sure every colu
d700: 6d 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52  mn of the PRIMAR
d710: 59 20 4b 45 59 20 69 73 20 4e 4f 54 20 4e 55 4c  Y KEY is NOT NUL
d720: 4c 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  L */.  for(i=0; 
d730: 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nPk; i++){.   
d740: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d   pTab->aCol[pPk-
d750: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f  >aiColumn[i]].no
d760: 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 7d 0a 20  tNull = 1;.  }. 
d770: 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c   pPk->uniqNotNul
d780: 6c 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 54 68 65  l = 1;..  /* The
d790: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
d7a0: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
d7b0: 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 20   the table root 
d7c0: 70 61 67 65 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74  page */.  pPk->t
d7d0: 6e 75 6d 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d  num = pTab->tnum
d7e0: 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
d7f0: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
d800: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  resentation of a
d810: 6c 6c 20 55 4e 49 51 55 45 20 69 6e 64 69 63 65  ll UNIQUE indice
d820: 73 20 62 79 20 63 6f 6e 76 65 72 74 69 6e 67 0a  s by converting.
d830: 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 72    ** the final r
d840: 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f  owid column into
d850: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 6f 6c   one or more col
d860: 75 6d 6e 73 20 6f 66 20 74 68 65 20 50 52 49 4d  umns of the PRIM
d870: 41 52 59 20 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20  ARY KEY..  */.  
d880: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
d890: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
d8a0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
d8b0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69      int n;.    i
d8c0: 66 28 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49  f( IsPrimaryKeyI
d8d0: 6e 64 65 78 28 70 49 64 78 29 20 29 20 63 6f 6e  ndex(pIdx) ) con
d8e0: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
d8f0: 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b  =n=0; i<nPk; i++
d900: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61  ){.      if( !ha
d910: 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69  sColumn(pIdx->ai
d920: 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b  Column, pIdx->nK
d930: 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f  eyCol, pPk->aiCo
d940: 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a  lumn[i]) ) n++;.
d950: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d      }.    if( n=
d960: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
d970: 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 20 73  his index is a s
d980: 75 70 65 72 73 65 74 20 6f 66 20 74 68 65 20 70  uperset of the p
d990: 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
d9a0: 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d      pIdx->nColum
d9b0: 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  n = pIdx->nKeyCo
d9c0: 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  l;.      continu
d9d0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
d9e0: 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65   resizeIndexObje
d9f0: 63 74 28 64 62 2c 20 70 49 64 78 2c 20 70 49 64  ct(db, pIdx, pId
da00: 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20  x->nKeyCol+n) ) 
da10: 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28  return;.    for(
da20: 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65  i=0, j=pIdx->nKe
da30: 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b  yCol; i<nPk; i++
da40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61  ){.      if( !ha
da50: 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69  sColumn(pIdx->ai
da60: 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b  Column, pIdx->nK
da70: 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f  eyCol, pPk->aiCo
da80: 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20  lumn[i]) ){.    
da90: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
daa0: 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43  mn[j] = pPk->aiC
dab0: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
dac0: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a    pIdx->azColl[j
dad0: 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b  ] = pPk->azColl[
dae0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b  i];.        j++;
daf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
db00: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
db10: 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e  >nColumn>=pIdx->
db20: 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20  nKeyCol+n );.   
db30: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
db40: 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d  Column>=j );.  }
db50: 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74  ..  /* Add all t
db60: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  able columns to 
db70: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
db80: 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28  index.  */.  if(
db90: 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20   nPk<pTab->nCol 
dba0: 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a  ){.    if( resiz
dbb0: 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c  eIndexObject(db,
dbc0: 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c   pPk, pTab->nCol
dbd0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ) ) return;.    
dbe0: 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20  for(i=0, j=nPk; 
dbf0: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
dc00: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
dc10: 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69  asColumn(pPk->ai
dc20: 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b  Column, j, i) ){
dc30: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
dc40: 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20   j<pPk->nColumn 
dc50: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e  );.        pPk->
dc60: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b  aiColumn[j] = i;
dc70: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a  .        pPk->az
dc80: 43 6f 6c 6c 5b 6a 5d 20 3d 20 22 42 49 4e 41 52  Coll[j] = "BINAR
dc90: 59 22 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b  Y";.        j++;
dca0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
dcb0: 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e     assert( pPk->
dcc0: 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20  nColumn==j );.  
dcd0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
dce0: 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c  nCol==j );.  }el
dcf0: 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43 6f  se{.    pPk->nCo
dd00: 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  lumn = pTab->nCo
dd10: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
dd20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
dd30: 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74  called to report
dd40: 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74   the final ")" t
dd50: 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a  hat terminates.*
dd60: 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  * a CREATE TABLE
dd70: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
dd80: 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75  * The table stru
dd90: 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72  cture that other
dda0: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
ddb0: 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64   have been build
ddc0: 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ing.** is added 
ddd0: 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
dde0: 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73  hash tables, ass
ddf0: 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20  uming no errors 
de00: 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64  have.** occurred
de10: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79  ..**.** An entry
de20: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69   for the table i
de30: 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61  s made in the ma
de40: 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69  ster table on di
de50: 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68  sk, unless.** th
de60: 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
de70: 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69  y table or db->i
de80: 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68  nit.busy==1.  Wh
de90: 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  en db->init.busy
dea0: 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20  ==1.** it means 
deb0: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
dec0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
ded0: 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77   table because w
dee0: 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63  e just.** connec
def0: 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ted to the datab
df00: 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74  ase or because t
df10: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
df20: 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65   table has.** re
df30: 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20  cently changed, 
df40: 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  so the entry for
df50: 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65   this table alre
df60: 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a  ady exists in.**
df70: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
df80: 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f  er table.  We do
df90: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65   not want to cre
dfa0: 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a  ate it again..**
dfb0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65  .** If the pSele
dfc0: 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ct argument is n
dfd0: 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ot NULL, it mean
dfe0: 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
dff0: 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65  ine.** was calle
e000: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61  d to create a ta
e010: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72  ble generated fr
e020: 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45  om a .** "CREATE
e030: 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45   TABLE ... AS SE
e040: 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d  LECT ..." statem
e050: 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ent.  The column
e060: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
e070: 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20   new table will 
e080: 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74  match the result
e090: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
e0a0: 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
e0b0: 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50  te3EndTable(.  P
e0c0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
e0d0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
e0e0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
e0f0: 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20  en *pCons,      
e100: 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20       /* The ',' 
e110: 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20  token after the 
e120: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e  last column defn
e130: 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  . */.  Token *pE
e140: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd,            /
e150: 2a 20 54 68 65 20 27 29 27 20 62 65 66 6f 72 65  * The ')' before
e160: 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20   options in the 
e170: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a  CREATE TABLE */.
e180: 20 20 75 38 20 74 61 62 4f 70 74 73 2c 20 20 20    u8 tabOpts,   
e190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
e1a0: 72 61 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73  ra table options
e1b0: 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a  . Usually 0. */.
e1c0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
e1d0: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c  t         /* Sel
e1e0: 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41  ect from a "CREA
e1f0: 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  TE ... AS SELECT
e200: 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  " */.){.  Table 
e210: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
e220: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74      /* The new t
e230: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
e240: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
e250: 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62  db; /* The datab
e260: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
e270: 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
e280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e290: 20 44 61 74 61 62 61 73 65 20 69 6e 20 77 68 69   Database in whi
e2a0: 63 68 20 74 68 65 20 74 61 62 6c 65 20 6c 69 76  ch the table liv
e2b0: 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  es */.  Index *p
e2c0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
e2d0: 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20    /* An implied 
e2e0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  index of the tab
e2f0: 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 45  le */..  if( (pE
e300: 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
e310: 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  ==0) || db->mall
e320: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
e330: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20  return;.  }.  p 
e340: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
e350: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
e360: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
e370: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
e380: 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20  usy || !pSelect 
e390: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
e3a0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
e3b0: 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61   1 it means we a
e3c0: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53  re reading the S
e3d0: 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20  QL off the.  ** 
e3e0: 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20  "sqlite_master" 
e3f0: 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  or "sqlite_temp_
e400: 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
e410: 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20   the disk..  ** 
e420: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
e430: 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69  to the disk agai
e440: 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
e450: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
e460: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  .  ** for the ta
e470: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ble from the db-
e480: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69  >init.newTnum fi
e490: 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20  eld.  (The page 
e4a0: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75  number.  ** shou
e4b0: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74  ld have been put
e4c0: 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71   there by the sq
e4d0: 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69  liteOpenCb routi
e4e0: 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ne.).  */.  if( 
e4f0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
e500: 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64  .    p->tnum = d
e510: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
e520: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69  .  }..  /* Speci
e530: 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  al processing fo
e540: 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
e550: 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20  Tables */.  if( 
e560: 74 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69 74  tabOpts & TF_Wit
e570: 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20 20  houtRowid ){.   
e580: 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67   if( (p->tabFlag
e590: 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
e5a0: 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 73  ment) ){.      s
e5b0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e5c0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
e5d0: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
e5e0: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 57  not allowed on W
e5f0: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
e600: 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74  les");.      ret
e610: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
e620: 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20  f( (p->tabFlags 
e630: 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b  & TF_HasPrimaryK
e640: 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ey)==0 ){.      
e650: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e660: 70 50 61 72 73 65 2c 20 22 50 52 49 4d 41 52 59  pParse, "PRIMARY
e670: 20 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e 20   KEY missing on 
e680: 74 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e  table %s", p->zN
e690: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
e6a0: 0a 20 20 20 20 20 20 70 2d 3e 74 61 62 46 6c 61  .      p->tabFla
e6b0: 67 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74  gs |= TF_Without
e6c0: 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e  Rowid;.      con
e6d0: 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77  vertToWithoutRow
e6e0: 69 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  idTable(pParse, 
e6f0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
e700: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
e710: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
e720: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  p->pSchema);..#i
e730: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e740: 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73  T_CHECK.  /* Res
e750: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c  olve names in al
e760: 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  l CHECK constrai
e770: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  nt expressions..
e780: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43    */.  if( p->pC
e790: 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  heck ){.    sqli
e7a0: 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65  te3ResolveSelfRe
e7b0: 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20  ference(pParse, 
e7c0: 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30  p, NC_IsCheck, 0
e7d0: 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20  , p->pCheck);.  
e7e0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
e7f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
e800: 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a  _CHECK) */..  /*
e810: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76   Estimate the av
e820: 65 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66  erage row size f
e830: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  or the table and
e840: 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64   for all implied
e850: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73   indices */.  es
e860: 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68  timateTableWidth
e870: 28 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  (p);.  for(pIdx=
e880: 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
e890: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
e8a0: 74 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65  t){.    estimate
e8b0: 49 6e 64 65 78 57 69 64 74 68 28 70 49 64 78 29  IndexWidth(pIdx)
e8c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
e8d0: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
e8e0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
e8f0: 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
e900: 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
e910: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
e920: 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
e930: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  atabase..  **.  
e940: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
e950: 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
e960: 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
e970: 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
e980: 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
e990: 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
e9a0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
e9b0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
e9c0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
e9d0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
e9e0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
e9f0: 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f  har *zType;    /
ea00: 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62  * "view" or "tab
ea10: 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  le" */.    char 
ea20: 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56  *zType2;   /* "V
ea30: 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20  IEW" or "TABLE" 
ea40: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
ea50: 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  mt;    /* Text o
ea60: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
ea70: 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45  LE or CREATE VIE
ea80: 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  W statement */..
ea90: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
eaa0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
eab0: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d      if( NEVER(v=
eac0: 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  =0) ) return;.. 
ead0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
eae0: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
eaf0: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20  , 0);..    /* . 
eb00: 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65     ** Initialize
eb10: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e   zType for the n
eb20: 65 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65  ew view or table
eb30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
eb40: 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
eb50: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
eb60: 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
eb70: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62      zType = "tab
eb80: 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  le";.      zType
eb90: 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66  2 = "TABLE";.#if
eba0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ebb0: 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b  _VIEW.    }else{
ebc0: 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
ebd0: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
ebe0: 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20  = "view";.      
ebf0: 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b  zType2 = "VIEW";
ec00: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
ec10: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
ec20: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
ec30: 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
ec40: 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
ec50: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
ec60: 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
ec70: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
ec80: 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
ec90: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
eca0: 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
ecb0: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  s in register pP
ecc0: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20  arse->regRoot.. 
ecd0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63     **.    ** Onc
ece0: 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  e the SELECT has
ecf0: 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73   been coded by s
ed00: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20  qlite3Select(), 
ed10: 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a  it is in a.    *
ed20: 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65  * suitable state
ed30: 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68   to query for th
ed40: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
ed50: 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75  nd types to be u
ed60: 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  sed.    ** by th
ed70: 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20  e new table..   
ed80: 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61   **.    ** A sha
ed90: 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d  red-cache write-
eda0: 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
edb0: 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ired to write to
edc0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a   the new table,.
edd0: 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65      ** as a sche
ede0: 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76  ma-lock must hav
edf0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  e already been o
ee00: 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74  btained to creat
ee10: 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20  e it. Since.    
ee20: 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  ** a schema-lock
ee30: 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74   excludes all ot
ee40: 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65  her database use
ee50: 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  rs, the write-lo
ee60: 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20  ck would.    ** 
ee70: 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20  be redundant..  
ee80: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
ee90: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65  lect ){.      Se
eea0: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
eeb0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c       Table *pSel
eec0: 54 61 62 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  Tab;..      asse
eed0: 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d  rt(pParse->nTab=
eee0: 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  =1);.      sqlit
eef0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ef00: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
ef10: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
ef20: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
ef30: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
ef40: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53  5(v, OPFLAG_P2IS
ef50: 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61 72  REG);.      pPar
ef60: 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
ef70: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
ef80: 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
ef90: 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a   SRT_Table, 1);.
efa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
efb0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
efc0: 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ect, &dest);.   
efd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
efe0: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
eff0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
f000: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
f010: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  ){.        pSelT
f020: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
f030: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
f040: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a  arse, pSelect);.
f050: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c          if( pSel
f060: 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Tab==0 ) return;
f070: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f080: 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20   p->aCol==0 );. 
f090: 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d         p->nCol =
f0a0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
f0b0: 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20          p->aCol 
f0c0: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
f0d0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
f0e0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
f0f0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
f100: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  l = 0;.        s
f110: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
f120: 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a  e(db, pSelTab);.
f130: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
f140: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
f150: 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
f160: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74  of the CREATE st
f170: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
f180: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
f190: 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61      zStmt = crea
f1a0: 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20  teTableStmt(db, 
f1b0: 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
f1c0: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64       Token *pEnd
f1d0: 32 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26 70  2 = tabOpts ? &p
f1e0: 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
f1f0: 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  n : pEnd;.      
f200: 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32 2d  n = (int)(pEnd2-
f210: 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61  >z - pParse->sNa
f220: 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20  meToken.z);.    
f230: 20 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b 30    if( pEnd2->z[0
f240: 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70 45  ]!=';' ) n += pE
f250: 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 53  nd2->n;.      zS
f260: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
f270: 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20  intf(db, .      
f280: 20 20 20 20 22 43 52 45 41 54 45 20 25 73 20 25      "CREATE %s %
f290: 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c  .*s", zType2, n,
f2a0: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
f2b0: 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20  ken.z.      );. 
f2c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73     }..    /* A s
f2d0: 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f  lot for the reco
f2e0: 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  rd has already b
f2f0: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  een allocated in
f300: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c   the .    ** SQL
f310: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
f320: 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20  .  We just need 
f330: 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73  to update that s
f340: 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20  lot with all.   
f350: 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   ** the informat
f360: 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63  ion we've collec
f370: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
f380: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
f390: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
f3a0: 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22   "UPDATE %Q.%s "
f3b0: 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74  .         "SET t
f3c0: 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25  ype='%s', name=%
f3d0: 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20  Q, tbl_name=%Q, 
f3e0: 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71  rootpage=#%d, sq
f3f0: 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57  l=%Q ".       "W
f400: 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c  HERE rowid=#%d",
f410: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
f420: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
f430: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
f440: 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20      zType,.     
f450: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
f460: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
f470: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
f480: 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20  ,.      zStmt,. 
f490: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67       pParse->reg
f4a0: 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20  Rowid.    );.   
f4b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f4c0: 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73  b, zStmt);.    s
f4d0: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
f4e0: 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
f4f0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f500: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
f510: 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ENT.    /* Check
f520: 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
f530: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
f540: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
f550: 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  table for.    **
f560: 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f   keeping track o
f570: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
f580: 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  keys..    */.   
f590: 20 69 66 28 20 70 2d 3e 74 61 62 46 6c 61 67 73   if( p->tabFlags
f5a0: 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
f5b0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 44 62 20  ent ){.      Db 
f5c0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
f5d0: 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  iDb];.      asse
f5e0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
f5f0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
f600: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20  Db, 0) );.      
f610: 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
f620: 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a  ->pSeqTab==0 ){.
f630: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e          sqlite3N
f640: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
f650: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  e,.          "CR
f660: 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71  EATE TABLE %Q.sq
f670: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61  lite_sequence(na
f680: 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20  me,seq)",.      
f690: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20      pDb->zName. 
f6a0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
f6b0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
f6c0: 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65      /* Reparse e
f6d0: 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64  verything to upd
f6e0: 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
f6f0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
f700: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
f710: 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
f720: 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20  aOp(v, iDb,.    
f730: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
f740: 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e  rintf(db, "tbl_n
f750: 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70  ame='%q' AND typ
f760: 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20 70  e!='trigger'", p
f770: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a  ->zName));.  }..
f780: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61  .  /* Add the ta
f790: 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65  ble to the in-me
f7a0: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
f7b0: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
f7c0: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
f7d0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
f7e0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  .    Table *pOld
f7f0: 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  ;.    Schema *pS
f800: 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65  chema = p->pSche
f810: 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
f820: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
f830: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
f840: 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  0) );.    pOld =
f850: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
f860: 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  rt(&pSchema->tbl
f870: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20  Hash, p->zName, 
f880: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
f890: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
f8a0: 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
f8b0: 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
f8c0: 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
f8d0: 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
f8e0: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
f8f0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
f900: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
f910: 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77      pParse->pNew
f920: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64  Table = 0;.    d
f930: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
f940: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
f950: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
f960: 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
f970: 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53  E.    if( !p->pS
f980: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63  elect ){.      c
f990: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
f9a0: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
f9b0: 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f  )pParse->sNameTo
f9c0: 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74  ken.z;.      int
f9d0: 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73   nName;.      as
f9e0: 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20 26  sert( !pSelect &
f9f0: 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20  & pCons && pEnd 
fa00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
fa10: 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  ns->z==0 ){.    
fa20: 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64      pCons = pEnd
fa30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fa40: 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28 28 63  nName = (int)((c
fa50: 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e  onst char *)pCon
fa60: 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20  s->z - zName);. 
fa70: 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66       p->addColOf
fa80: 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69  fset = 13 + sqli
fa90: 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a  te3Utf8CharLen(z
faa0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
fab0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
fac0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
fad0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
fae0: 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c   The parser call
faf0: 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
fb00: 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74  n order to creat
fb10: 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a  e a new VIEW.*/.
fb20: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61  void sqlite3Crea
fb30: 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65 20  teView(.  Parse 
fb40: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
fb50: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
fb60: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
fb70: 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54  pBegin,     /* T
fb80: 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
fb90: 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65 20  that begins the 
fba0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54  statement */.  T
fbb0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
fbc0: 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74    /* The token t
fbd0: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61  hat holds the na
fbe0: 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a  me of the view *
fbf0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
fc00: 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f  2,     /* The to
fc10: 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ken that holds t
fc20: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
fc30: 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  iew */.  Select 
fc40: 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41  *pSelect,   /* A
fc50: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
fc60: 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  t that will beco
fc70: 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77 20  me the new view 
fc80: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c  */.  int isTemp,
fc90: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
fca0: 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59 20  for a TEMPORARY 
fcb0: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  view */.  int no
fcc0: 45 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Err          /* 
fcd0: 53 75 70 70 72 65 73 73 20 65 72 72 6f 72 20 6d  Suppress error m
fce0: 65 73 73 61 67 65 73 20 69 66 20 56 49 45 57 20  essages if VIEW 
fcf0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
fd00: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  /.){.  Table *p;
fd10: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73  .  int n;.  cons
fd20: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b  t char *z;.  Tok
fd30: 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46 69 78  en sEnd;.  DbFix
fd40: 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e  er sFix;.  Token
fd50: 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *pName = 0;.  i
fd60: 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65  nt iDb;.  sqlite
fd70: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
fd80: 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  db;..  if( pPars
fd90: 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20  e->nVar>0 ){.   
fda0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
fdb0: 28 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65  (pParse, "parame
fdc0: 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c  ters are not all
fdd0: 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b  owed in views");
fde0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
fdf0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
fe00: 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72  lect);.    retur
fe10: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
fe20: 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73  StartTable(pPars
fe30: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
fe40: 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c  2, isTemp, 1, 0,
fe50: 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70   noErr);.  p = p
fe60: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
fe70: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
fe80: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a  pParse->nErr ){.
fe90: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
fea0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
feb0: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
fec0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54  ;.  }.  sqlite3T
fed0: 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
fee0: 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
fef0: 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44  2, &pName);.  iD
ff00: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
ff10: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e  aToIndex(db, p->
ff20: 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69  pSchema);.  sqli
ff30: 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
ff40: 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
ff50: 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20  view", pName);. 
ff60: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53   if( sqlite3FixS
ff70: 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65  elect(&sFix, pSe
ff80: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 73 71 6c  lect) ){.    sql
ff90: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
ffa0: 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
ffb0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
ffc0: 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79    /* Make a copy
ffd0: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53   of the entire S
ffe0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
fff0: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
10000 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73   view..  ** This
10010 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20   will force all 
10020 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a  the Expr.token.z
10030 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79   values to be dy
10040 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61  namically.  ** a
10050 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20  llocated rather 
10060 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68  than point to th
10070 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d  e input string -
10080 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61   which means tha
10090 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c  t.  ** they will
100a0 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74   persist after t
100b0 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74  he current sqlit
100c0 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72  e3_exec() call r
100d0 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70  eturns..  */.  p
100e0 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
100f0 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
10100 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55   pSelect, EXPRDU
10110 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 73 71 6c  P_REDUCE);.  sql
10120 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
10130 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
10140 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
10150 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
10160 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  urn;.  }.  if( !
10170 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
10180 0a 20 20 20 20 73 71 6c 69 74 65 33 56 69 65 77  .    sqlite3View
10190 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
101a0 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a  Parse, p);.  }..
101b0 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20    /* Locate the 
101c0 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54  end of the CREAT
101d0 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
101e0 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69  .  Make sEnd poi
101f0 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65  nt to.  ** the e
10200 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20  nd..  */.  sEnd 
10210 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54  = pParse->sLastT
10220 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 41 4c 57 41  oken;.  if( ALWA
10230 59 53 28 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 29  YS(sEnd.z[0]!=0)
10240 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27   && sEnd.z[0]!='
10250 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a  ;' ){.    sEnd.z
10260 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a   += sEnd.n;.  }.
10270 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20    sEnd.n = 0;.  
10280 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a  n = (int)(sEnd.z
10290 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20   - pBegin->z);. 
102a0 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a   z = pBegin->z;.
102b0 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
102c0 6e 3e 30 29 20 26 26 20 73 71 6c 69 74 65 33 49  n>0) && sqlite3I
102d0 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29  sspace(z[n-1]) )
102e0 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e  { n--; }.  sEnd.
102f0 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73  z = &z[n-1];.  s
10300 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a  End.n = 1;..  /*
10310 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54   Use sqlite3EndT
10320 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68  able() to add th
10330 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51  e view to the SQ
10340 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
10350 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e  e */.  sqlite3En
10360 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  dTable(pParse, 0
10370 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a  , &sEnd, 0, 0);.
10380 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
10390 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
103a0 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21  T_VIEW */..#if !
103b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
103c0 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
103d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
103e0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
103f0 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
10400 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
10410 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
10420 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
10430 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
10440 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
10450 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
10460 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
10470 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
10480 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
10490 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
104a0 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
104b0 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
104c0 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  rse->zErrMsg..*/
104d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77  .int sqlite3View
104e0 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
104f0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
10500 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
10510 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20  Table *pSelTab; 
10520 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c    /* A fake tabl
10530 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20  e from which we 
10540 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  get the result s
10550 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  et */.  Select *
10560 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70  pSel;     /* Cop
10570 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
10580 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
10590 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  the view */.  in
105a0 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20  t nErr = 0;     
105b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
105c0 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ors encountered 
105d0 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
105e0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
105f0 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20  arily holds the 
10600 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
10610 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20  s assigned */.  
10620 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
10630 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
10640 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
10650 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  n for malloc err
10660 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ors */.  int (*x
10670 41 75 74 68 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Auth)(void*,int,
10680 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
10690 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
106a0 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
106b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
106c0 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ble );..#ifndef 
106d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
106e0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 73  UALTABLE.  if( s
106f0 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f  qlite3VtabCallCo
10700 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70 54  nnect(pParse, pT
10710 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  able) ){.    ret
10720 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
10730 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69  ;.  }.  if( IsVi
10740 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20  rtual(pTable) ) 
10750 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
10760 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10770 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
10780 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20  A positive nCol 
10790 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e  means the column
107a0 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73  s names for this
107b0 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61   view are.  ** a
107c0 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20  lready known..  
107d0 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
107e0 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e  >nCol>0 ) return
107f0 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61   0;..  /* A nega
10800 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73  tive nCol is a s
10810 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65  pecial marker me
10820 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72  aning that we ar
10830 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
10840 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75   trying to compu
10850 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  te the column na
10860 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65  mes.  If we ente
10870 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
10880 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74  ith.  ** a negat
10890 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61  ive nCol, it mea
108a0 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76  ns two or more v
108b0 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70  iews form a loop
108c0 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a  , like this:.  *
108d0 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  *.  **     CREAT
108e0 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45  E VIEW one AS SE
108f0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b  LECT * FROM two;
10900 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
10910 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c   VIEW two AS SEL
10920 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a  ECT * FROM one;.
10930 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
10940 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61 62  ly, the error ab
10950 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67 68  ove is now caugh
10960 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63 68  t prior to reach
10970 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a  ing this point..
10980 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f 6c    ** But the fol
10990 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20 73  lowing test is s
109a0 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61  till important a
109b0 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20 75  s it does come u
109c0 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f  p.  ** in the fo
109d0 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20  llowing:.  ** . 
109e0 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54   **     CREATE T
109f0 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61 29  ABLE main.ex1(a)
10a00 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
10a10 45 20 54 45 4d 50 20 56 49 45 57 20 65 78 31 20  E TEMP VIEW ex1 
10a20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f 4d  AS SELECT a FROM
10a30 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53   ex1;.  **     S
10a40 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d  ELECT * FROM tem
10a50 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66  p.ex1;.  */.  if
10a60 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30  ( pTable->nCol<0
10a70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
10a80 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10a90 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63  "view %s is circ
10aa0 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c  ularly defined",
10ab0 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
10ac0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
10ad0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61   }.  assert( pTa
10ae0 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a  ble->nCol>=0 );.
10af0 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
10b00 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
10b10 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f  ns we need to co
10b20 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20  mpute the table 
10b30 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65  names..  ** Note
10b40 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
10b50 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  o sqlite3ResultS
10b60 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c  etOfSelect() wil
10b70 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a  l expand any.  *
10b80 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69  * "*" elements i
10b90 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65  n the results se
10ba0 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e  t of the view an
10bb0 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75  d will assign cu
10bc0 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68  rsors.  ** to th
10bd0 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  e elements of th
10be0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
10bf0 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61  But we do not wa
10c00 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73  nt these changes
10c10 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d  .  ** to be perm
10c20 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63  anent.  So the c
10c30 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f  omputation is do
10c40 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20  ne on a copy of 
10c50 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20  the SELECT.  ** 
10c60 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
10c70 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
10c80 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
10c90 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
10ca0 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69  );.  pSel = sqli
10cb0 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
10cc0 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
10cd0 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  , 0);.  if( pSel
10ce0 20 29 7b 0a 20 20 20 20 75 38 20 65 6e 61 62 6c   ){.    u8 enabl
10cf0 65 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 64 62 2d  eLookaside = db-
10d00 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
10d10 6c 65 64 3b 0a 20 20 20 20 6e 20 3d 20 70 50 61  led;.    n = pPa
10d20 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73  rse->nTab;.    s
10d30 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
10d40 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
10d50 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a  e, pSel->pSrc);.
10d60 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
10d70 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c   = -1;.    db->l
10d80 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
10d90 64 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  d = 0;.#ifndef S
10da0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
10db0 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41 75  RIZATION.    xAu
10dc0 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a  th = db->xAuth;.
10dd0 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20      db->xAuth = 
10de0 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d  0;.    pSelTab =
10df0 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
10e00 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
10e10 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d  , pSel);.    db-
10e20 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a  >xAuth = xAuth;.
10e30 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c 54 61  #else.    pSelTa
10e40 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
10e50 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
10e60 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64  rse, pSel);.#end
10e70 69 66 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  if.    db->looka
10e80 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20  side.bEnabled = 
10e90 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 3b  enableLookaside;
10ea0 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  .    pParse->nTa
10eb0 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70  b = n;.    if( p
10ec0 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20  SelTab ){.      
10ed0 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
10ee0 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
10ef0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
10f00 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
10f10 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
10f20 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
10f30 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
10f40 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
10f50 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
10f60 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
10f70 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
10f80 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  , pSelTab);.    
10f90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10fa0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
10fb0 28 64 62 2c 20 30 2c 20 70 54 61 62 6c 65 2d 3e  (db, 0, pTable->
10fc0 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20  pSchema) );.    
10fd0 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
10fe0 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 20 7c  a->schemaFlags |
10ff0 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  = DB_UnresetView
11000 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
11010 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
11020 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72   = 0;.      nErr
11030 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ++;.    }.    sq
11040 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
11050 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 7d  e(db, pSel);.  }
11060 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72   else {.    nErr
11070 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ++;.  }.#endif /
11080 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
11090 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e  EW */.  return n
110a0 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20  Err;  .}.#endif 
110b0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
110c0 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
110d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
110e0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
110f0 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  LE) */..#ifndef 
11100 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
11110 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
11120 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72   column names fr
11130 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e  om every VIEW in
11140 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a   database idx..*
11150 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
11160 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
11170 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
11180 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c  t idx){.  HashEl
11190 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28  em *i;.  assert(
111a0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
111b0 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c  texHeld(db, idx,
111c0 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62   0) );.  if( !Db
111d0 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20  HasProperty(db, 
111e0 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
111f0 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a  iews) ) return;.
11200 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61    for(i=sqliteHa
11210 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62  shFirst(&db->aDb
11220 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  [idx].pSchema->t
11230 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c  blHash); i;i=sql
11240 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b  iteHashNext(i)){
11250 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
11260 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
11270 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54  a(i);.    if( pT
11280 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
11290 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65 74       sqliteDelet
112a0 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c  eColumnNames(db,
112b0 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54   pTab);.      pT
112c0 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
112d0 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
112e0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
112f0 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
11300 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
11310 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c  setViews);.}.#el
11320 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69  se.# define sqli
11330 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41  teViewResetAll(A
11340 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,B).#endif /* SQ
11350 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
11360 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
11370 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
11380 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20   by the VDBE to 
11390 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72  adjust the inter
113a0 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73  nal schema.** us
113b0 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65  ed by SQLite whe
113c0 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  n the btree laye
113d0 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20  r moves a table 
113e0 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a  root page. The.*
113f0 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  * root-page of a
11400 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
11410 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20  in database iDb 
11420 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d  has changed from
11430 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f   iFrom.** to iTo
11440 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23  ..**.** Ticket #
11450 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f  1728:  The symbo
11460 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74  l table might st
11470 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f  ill contain info
11480 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61  rmation.** on ta
11490 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69  bles and/or indi
114a0 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65  ces that are the
114b0 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
114c0 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66  g deleted..** If
114d0 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79   you are unlucky
114e0 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64  , one of those d
114f0 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f  eleted indices o
11500 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a  r tables might.*
11510 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  * have the same 
11520 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20  rootpage number 
11530 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c  as the real tabl
11540 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20  e or index that 
11550 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65  is.** being move
11560 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74  d.  So we cannot
11570 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20   stop searching 
11580 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20  after the first 
11590 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73  match .** becaus
115a0 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  e the first matc
115b0 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f  h might be for o
115c0 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65  ne of the delete
115d0 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20  d indices.** or 
115e0 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74  tables and not t
115f0 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74  he table/index t
11600 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  hat is actually 
11610 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20  being moved..** 
11620 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65  We must continue
11630 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
11640 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  ll tables and in
11650 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f  dices with.** ro
11660 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61  otpage==iFrom ha
11670 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  ve been converte
11680 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74  d to have a root
11690 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69  page of iTo.** i
116a0 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65  n order to be ce
116b0 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f  rtain that we go
116c0 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e  t the right one.
116d0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
116e0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
116f0 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  UM.void sqlite3R
11700 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c  ootPageMoved(sql
11710 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
11720 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  b, int iFrom, in
11730 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c  t iTo){.  HashEl
11740 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
11750 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a  h *pHash;.  Db *
11760 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
11770 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
11780 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
11790 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  0) );.  pDb = &d
117a0 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
117b0 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63  Hash = &pDb->pSc
117c0 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  hema->tblHash;. 
117d0 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
117e0 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
117f0 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
11800 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
11810 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
11820 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
11830 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
11840 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74  .    if( pTab->t
11850 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
11860 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d      pTab->tnum =
11870 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iTo;.    }.  }.
11880 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
11890 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
118a0 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
118b0 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
118c0 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
118d0 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
118e0 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49  t(pElem)){.    I
118f0 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c  ndex *pIdx = sql
11900 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
11910 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  m);.    if( pIdx
11920 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
11930 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75  .      pIdx->tnu
11940 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
11950 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
11960 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f  ** Write code to
11970 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65   erase the table
11980 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
11990 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61  iTable from data
119a0 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73  base iDb..** Als
119b0 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20  o write code to 
119c0 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74  modify the sqlit
119d0 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
119e0 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
119f0 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d  ma.** if a root-
11a00 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  page of another 
11a10 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
11a20 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65  y the btree-laye
11a30 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73  r whilst.** eras
11a40 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73  ing iTable (this
11a50 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
11a60 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
11a70 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73  database)..*/ .s
11a80 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
11a90 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65  oyRootPage(Parse
11aa0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
11ab0 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  able, int iDb){.
11ac0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
11ad0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
11ae0 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  e);.  int r1 = s
11af0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
11b00 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
11b10 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
11b20 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61   OP_Destroy, iTa
11b30 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20  ble, r1, iDb);. 
11b40 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
11b50 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65  (pParse);.#ifnde
11b60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
11b70 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50  TOVACUUM.  /* OP
11b80 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20  _Destroy stores 
11b90 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31  an in integer r1
11ba0 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65  . If this intege
11bb0 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65  r.  ** is non-ze
11bc0 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
11bd0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
11be0 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d  ber of a table m
11bf0 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63  oved to.  ** loc
11c00 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68  ation iTable. Th
11c10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65  e following code
11c20 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71   modifies the sq
11c30 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
11c40 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63  e to.  ** reflec
11c50 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a  t this..  **.  *
11c60 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20  * The "#NNN" in 
11c70 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65  the SQL is a spe
11c80 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68  cial constant th
11c90 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65  at means whateve
11ca0 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20  r value.  ** is 
11cb0 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e  in register NNN.
11cc0 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75    See grammar ru
11cd0 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  les associated w
11ce0 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53  ith the TK_REGIS
11cf0 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66  TER.  ** token f
11d00 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
11d10 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  formation..  */.
11d20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
11d30 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20  arse(pParse, .  
11d40 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73     "UPDATE %Q.%s
11d50 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64   SET rootpage=%d
11d60 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72   WHERE #%d AND r
11d70 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20  ootpage=#%d",.  
11d80 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61     pParse->db->a
11d90 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
11da0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
11db0 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31  , iTable, r1, r1
11dc0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69  );.#endif.  sqli
11dd0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
11de0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d  g(pParse, r1);.}
11df0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44  ../*.** Write VD
11e00 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  BE code to erase
11e10 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20   table pTab and 
11e20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69  all associated i
11e30 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a  ndices on disk..
11e40 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74  ** Code to updat
11e50 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  e the sqlite_mas
11e60 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69  ter tables and i
11e70 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64  nternal schema d
11e80 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e  efinitions.** in
11e90 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67   case a root-pag
11ea0 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61  e belonging to a
11eb0 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
11ec0 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
11ed0 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61  ee layer.** is a
11ee0 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20  lso added (this 
11ef0 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20  can happen with 
11f00 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  an auto-vacuum d
11f10 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61  atabase)..*/.sta
11f20 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
11f30 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
11f40 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
11f50 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
11f60 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
11f70 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
11f80 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
11f90 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
11fa0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
11fb0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64  b->pSchema);.  d
11fc0 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
11fd0 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75  Parse, pTab->tnu
11fe0 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70  m, iDb);.  for(p
11ff0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
12000 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
12010 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64  x->pNext){.    d
12020 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
12030 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75  Parse, pIdx->tnu
12040 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c  m, iDb);.  }.#el
12050 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  se.  /* If the d
12060 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61  atabase may be a
12070 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62  uto-vacuum capab
12080 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d  le (if SQLITE_OM
12090 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
120a0 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  ** is not define
120b0 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69  d), then it is i
120c0 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c  mportant to call
120d0 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74   OP_Destroy on t
120e0 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e  he.  ** table an
120f0 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67  d index root-pag
12100 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61  es in order, sta
12110 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e  rting with the n
12120 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a  umerically .  **
12130 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
12140 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20  ge number. This 
12150 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20  guarantees that 
12160 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74  none of the root
12170 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62  -pages.  ** to b
12180 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72  e destroyed is r
12190 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65  elocated by an e
121a0 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f  arlier OP_Destro
121b0 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20  y. i.e. if the. 
121c0 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65   ** following we
121d0 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20  re coded:.  **. 
121e0 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34   ** OP_Destroy 4
121f0 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a   0.  ** ....  **
12200 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a   OP_Destroy 5 0.
12210 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f    **.  ** and ro
12220 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e  ot page 5 happen
12230 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72  ed to be the lar
12240 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
12250 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a  umber in the.  *
12260 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  * database, then
12270 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75   root page 5 wou
12280 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70  ld be moved to p
12290 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20  age 4 by the .  
122a0 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34  ** "OP_Destroy 4
122b0 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20   0" opcode. The 
122c0 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44  subsequent "OP_D
122d0 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c  estroy 5 0" woul
122e0 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65  d hit.  ** a fre
122f0 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a  e-list page..  *
12300 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70  /.  int iTab = p
12310 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74  Tab->tnum;.  int
12320 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b   iDestroyed = 0;
12330 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
12340 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
12350 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73  .    int iLarges
12360 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
12370 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
12380 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64   iTab<iDestroyed
12390 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65   ){.      iLarge
123a0 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d  st = iTab;.    }
123b0 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
123c0 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
123d0 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
123e0 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  xt){.      int i
123f0 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d  Idx = pIdx->tnum
12400 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
12410 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  pIdx->pSchema==p
12420 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  Tab->pSchema );.
12430 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74        if( (iDest
12440 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64  royed==0 || (iId
12450 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26  x<iDestroyed)) &
12460 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20  & iIdx>iLargest 
12470 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67  ){.        iLarg
12480 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20  est = iIdx;.    
12490 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
124a0 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b  ( iLargest==0 ){
124b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
124c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
124d0 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
124e0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
124f0 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
12500 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  >pSchema);.     
12510 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
12520 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e 64  && iDb<pParse->d
12530 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20 20  b->nDb );.      
12540 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
12550 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74  pParse, iLargest
12560 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44  , iDb);.      iD
12570 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67  estroyed = iLarg
12580 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  est;.    }.  }.#
12590 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
125a0 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72  emove entries fr
125b0 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  om the sqlite_st
125c0 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f 72 20  atN tables (for 
125d0 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a 2a  N in (1,2,3)).**
125e0 20 61 66 74 65 72 20 61 20 44 52 4f 50 20 49 4e   after a DROP IN
125f0 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41 42 4c  DEX or DROP TABL
12600 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74  E command..*/.st
12610 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
12620 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
12630 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
12640 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
12650 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
12660 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12680 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6e 75   The database nu
12690 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  mber */.  const 
126a0 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20  char *zType,    
126b0 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22 74 62   /* "idx" or "tb
126c0 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  l" */.  const ch
126d0 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 2f  ar *zName      /
126e0 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78 20  * Name of index 
126f0 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  or table */.){. 
12700 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
12710 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20  char *zDbName = 
12720 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
12730 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 66 6f  iDb].zName;.  fo
12740 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b  r(i=1; i<=4; i++
12750 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61 62  ){.    char zTab
12760 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  [24];.    sqlite
12770 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
12780 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73 71  f(zTab),zTab,"sq
12790 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29 3b  lite_stat%d",i);
127a0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
127b0 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  FindTable(pParse
127c0 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62 4e  ->db, zTab, zDbN
127d0 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ame) ){.      sq
127e0 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
127f0 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
12800 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
12810 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25 51 22  .%s WHERE %s=%Q"
12820 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61 6d  ,.        zDbNam
12830 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c 20  e, zTab, zType, 
12840 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20  zName.      );. 
12850 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
12860 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
12870 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 2e  to drop a table.
12880 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12890 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50 61  CodeDropTable(Pa
128a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
128b0 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69 44  le *pTab, int iD
128c0 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b 0a  b, int isView){.
128d0 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
128e0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
128f0 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65 72  e->db;.  Trigger
12900 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44 62   *pTrigger;.  Db
12910 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
12920 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73 71  [iDb];..  v = sq
12930 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
12940 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  rse);.  assert( 
12950 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  v!=0 );.  sqlite
12960 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
12970 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20  tion(pParse, 1, 
12980 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
12990 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
129a0 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
129b0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
129c0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
129d0 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65  AddOp0(v, OP_VBe
129e0 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  gin);.  }.#endif
129f0 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20  ..  /* Drop all 
12a00 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61  triggers associa
12a10 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62  ted with the tab
12a20 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
12a30 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20 67  . Code.  ** is g
12a40 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f  enerated to remo
12a50 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20  ve entries from 
12a60 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e  sqlite_master an
12a70 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74 65  d/or.  ** sqlite
12a80 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66 20  _temp_master if 
12a90 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a 20  required..  */. 
12aa0 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c 69   pTrigger = sqli
12ab0 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28 70  te3TriggerList(p
12ac0 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
12ad0 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20  while( pTrigger 
12ae0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
12af0 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
12b00 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
12b10 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72 69  || .        pTri
12b20 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  gger->pSchema==d
12b30 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
12b40 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  a );.    sqlite3
12b50 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70  DropTriggerPtr(p
12b60 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29  Parse, pTrigger)
12b70 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  ;.    pTrigger =
12b80 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74   pTrigger->pNext
12b90 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
12ba0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
12bb0 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65  NCREMENT.  /* Re
12bc0 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65 73  move any entries
12bd0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73   of the sqlite_s
12be0 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61 73  equence table as
12bf0 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20  sociated with.  
12c00 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
12c10 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69 73  ng dropped. This
12c20 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   is done before 
12c30 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72 6f  the table is dro
12c40 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68 65  pped.  ** at the
12c50 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e   btree level, in
12c60 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65   case the sqlite
12c70 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
12c80 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f  needs to.  ** mo
12c90 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ve as a result o
12ca0 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20  f the drop (can 
12cb0 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76  happen in auto-v
12cc0 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a  acuum mode)..  *
12cd0 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61  /.  if( pTab->ta
12ce0 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
12cf0 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20  increment ){.   
12d00 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
12d10 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
12d20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
12d30 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  Q.sqlite_sequenc
12d40 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22  e WHERE name=%Q"
12d50 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61  ,.      pDb->zNa
12d60 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a  me, pTab->zName.
12d70 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69      );.  }.#endi
12d80 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  f..  /* Drop all
12d90 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
12da0 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65  able and index e
12db0 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65  ntries that refe
12dc0 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74 61  r to the.  ** ta
12dd0 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61 6d  ble. The program
12de0 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f   name loops thro
12df0 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20 74  ugh the master t
12e00 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65 73  able and deletes
12e10 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20  .  ** every row 
12e20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61  that refers to a
12e30 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61   table of the sa
12e40 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f  me name as the o
12e50 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64 72  ne being.  ** dr
12e60 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73 20  opped. Triggers 
12e70 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 61  are handled sepa
12e80 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20 61  rately because a
12e90 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a   trigger can be.
12ea0 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20    ** created in 
12eb0 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
12ec0 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f  e that refers to
12ed0 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74   a table in anot
12ee0 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  her.  ** databas
12ef0 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e..  */.  sqlite
12f00 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
12f10 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45 4c  rse, .      "DEL
12f20 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57  ETE FROM %Q.%s W
12f30 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51  HERE tbl_name=%Q
12f40 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67   and type!='trig
12f50 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44 62  ger'",.      pDb
12f60 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f  ->zName, SCHEMA_
12f70 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61 62  TABLE(iDb), pTab
12f80 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ->zName);.  if( 
12f90 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56 69  !isView && !IsVi
12fa0 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
12fb0 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28     destroyTable(
12fc0 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
12fd0 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
12fe0 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20  the table entry 
12ff0 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e  from SQLite's in
13000 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e  ternal schema an
13010 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74 68  d modify.  ** th
13020 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
13030 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56 69  .  */.  if( IsVi
13040 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
13050 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13060 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73 74  dOp4(v, OP_VDest
13070 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  roy, iDb, 0, 0, 
13080 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
13090 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
130a0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44  beAddOp4(v, OP_D
130b0 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30  ropTable, iDb, 0
130c0 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
130d0 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 43  , 0);.  sqlite3C
130e0 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
130f0 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69  se, iDb);.  sqli
13100 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64  teViewResetAll(d
13110 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  b, iDb);.}../*.*
13120 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
13130 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74  s called to do t
13140 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f  he work of a DRO
13150 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  P TABLE statemen
13160 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74  t..** pName is t
13170 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
13180 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70  able to be dropp
13190 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
131a0 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72  te3DropTable(Par
131b0 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
131c0 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20  ist *pName, int 
131d0 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72  isView, int noEr
131e0 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  r){.  Table *pTa
131f0 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
13200 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
13210 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
13220 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  iDb;..  if( db->
13230 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
13240 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
13250 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20  op_table;.  }.  
13260 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
13270 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73 73  nErr==0 );.  ass
13280 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
13290 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e 6f 45  ==1 );.  if( noE
132a0 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73  rr ) db->suppres
132b0 73 45 72 72 2b 2b 3b 0a 20 20 70 54 61 62 20 3d  sErr++;.  pTab =
132c0 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
132d0 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
132e0 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e  isView, &pName->
132f0 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45  a[0]);.  if( noE
13300 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73  rr ) db->suppres
13310 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70  sErr--;..  if( p
13320 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  Tab==0 ){.    if
13330 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65  ( noErr ) sqlite
13340 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64  3CodeVerifyNamed
13350 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70  Schema(pParse, p
13360 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
13370 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  base);.    goto 
13380 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
13390 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
133a0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
133b0 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
133c0 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ema);.  assert( 
133d0 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
133e0 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49  ->nDb );..  /* I
133f0 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74  f pTab is a virt
13400 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20  ual table, call 
13410 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
13420 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20  es() to ensure. 
13430 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61   ** it is initia
13440 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  lized..  */.  if
13450 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
13460 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77  ) && sqlite3View
13470 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
13480 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
13490 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
134a0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69  op_table;.  }.#i
134b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
134c0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
134d0 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
134e0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
134f0 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
13500 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
13510 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
13520 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
13530 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
13540 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b  char *zArg2 = 0;
13550 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13560 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
13570 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
13580 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b   zTab, 0, zDb)){
13590 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
135a0 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
135b0 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
135c0 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
135d0 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
135e0 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
135f0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
13600 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ROP_TEMP_VIEW;. 
13610 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13620 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
13630 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20  E_DROP_VIEW;.   
13640 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
13650 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
13660 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20  TABLE.    }else 
13670 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
13680 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ab) ){.      cod
13690 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
136a0 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41  VTABLE;.      zA
136b0 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74  rg2 = sqlite3Get
136c0 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
136d0 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23  ->pMod->zName;.#
136e0 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
136f0 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
13700 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
13710 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
13720 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
13730 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  TEMP_TABLE;.    
13740 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13750 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
13760 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  ROP_TABLE;.     
13770 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
13780 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
13790 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
137a0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72  pTab->zName, zAr
137b0 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  g2, zDb) ){.    
137c0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
137d0 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
137e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
137f0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
13800 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54  QLITE_DELETE, pT
13810 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44  ab->zName, 0, zD
13820 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
13830 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
13840 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
13850 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  if.  if( sqlite3
13860 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
13870 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
13880 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20 73   7)==0 .    && s
13890 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
138a0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
138b0 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21 3d  ite_stat", 11)!=
138c0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
138d0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
138e0 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
138f0 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
13900 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
13910 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
13920 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66  _table;.  }..#if
13930 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13940 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72  _VIEW.  /* Ensur
13950 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20  e DROP TABLE is 
13960 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69  not used on a vi
13970 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45  ew, and DROP VIE
13980 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20  W is not used.  
13990 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20  ** on a table.. 
139a0 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77   */.  if( isView
139b0 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
139c0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  t==0 ){.    sqli
139d0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
139e0 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41  se, "use DROP TA
139f0 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61  BLE to delete ta
13a00 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  ble %s", pTab->z
13a10 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
13a20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
13a30 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69  .  }.  if( !isVi
13a40 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c  ew && pTab->pSel
13a50 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
13a60 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
13a70 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49 45  e, "use DROP VIE
13a80 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77  W to delete view
13a90 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
13aa0 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
13ab0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
13ac0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
13ad0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
13ae0 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65  remove the table
13af0 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72   from the master
13b00 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64   table.  ** on d
13b10 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20  isk..  */.  v = 
13b20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
13b30 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
13b40 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
13b50 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
13b60 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62  n(pParse, 1, iDb
13b70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c  );.    sqlite3Cl
13b80 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70 50  earStatTables(pP
13b90 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62 6c 22  arse, iDb, "tbl"
13ba0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
13bb0 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72 6f      sqlite3FkDro
13bc0 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  pTable(pParse, p
13bd0 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20 20  Name, pTab);.   
13be0 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70   sqlite3CodeDrop
13bf0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
13c00 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77 29  ab, iDb, isView)
13c10 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70  ;.  }..exit_drop
13c20 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65  _table:.  sqlite
13c30 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
13c40 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  b, pName);.}../*
13c50 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13c60 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72   is called to cr
13c70 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69  eate a new forei
13c80 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61  gn key on the ta
13c90 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ble.** currently
13ca0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
13cb0 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64  ion.  pFromCol d
13cc0 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
13cd0 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68  columns.** in th
13ce0 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20  e current table 
13cf0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72  point to the for
13d00 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46  eign key.  If pF
13d10 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a  romCol==0 then.*
13d20 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65  * connect the ke
13d30 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f  y to the last co
13d40 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20  lumn inserted.  
13d50 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20  pTo is the name 
13d60 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  of.** the table 
13d70 72 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e 6b  referred to (a.k
13d80 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74 22 20  .a the "parent" 
13d90 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c 20  table).  pToCol 
13da0 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66 20  is a list.** of 
13db0 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 61  tables in the pa
13dc0 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e 20  rent pTo table. 
13dd0 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20   flags contains 
13de0 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  all.** informati
13df0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  on about the con
13e00 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
13e10 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63   algorithms spec
13e20 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20  ified.** in the 
13e30 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50  ON DELETE, ON UP
13e40 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45  DATE and ON INSE
13e50 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a  RT clauses..**.*
13e60 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74  * An FKey struct
13e70 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ure is created a
13e80 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
13e90 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a  table currently.
13ea0 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ** under constru
13eb0 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61  ction in the pPa
13ec0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66  rse->pNewTable f
13ed0 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ield..**.** The 
13ee0 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73  foreign key is s
13ef0 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45  et for IMMEDIATE
13f00 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20   processing.  A 
13f10 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
13f20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66  ** to sqlite3Def
13f30 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d  erForeignKey() m
13f40 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73  ight change this
13f50 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f   to DEFERRED..*/
13f60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
13f70 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20  ateForeignKey(. 
13f80 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
13f90 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
13fa0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
13fb0 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c  prList *pFromCol
13fc0 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e  ,  /* Columns in
13fd0 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74   this table that
13fe0 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20   point to other 
13ff0 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  table */.  Token
14000 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20   *pTo,          
14010 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
14020 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
14030 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c  ExprList *pToCol
14040 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20  ,    /* Columns 
14050 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62  in the other tab
14060 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
14070 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
14080 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  Conflict resolut
14090 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20  ion algorithms. 
140a0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
140b0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
140c0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
140d0 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
140e0 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20  Y.  FKey *pFKey 
140f0 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65  = 0;.  FKey *pNe
14100 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70  xtTo;.  Table *p
14110 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
14120 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74  able;.  int nByt
14130 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  e;.  int i;.  in
14140 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a  t nCol;.  char *
14150 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  z;..  assert( pT
14160 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  o!=0 );.  if( p=
14170 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45  =0 || IN_DECLARE
14180 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f  _VTAB ) goto fk_
14190 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  end;.  if( pFrom
141a0 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Col==0 ){.    in
141b0 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c  t iCol = p->nCol
141c0 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  -1;.    if( NEVE
141d0 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f  R(iCol<0) ) goto
141e0 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28   fk_end;.    if(
141f0 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
14200 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  l->nExpr!=1 ){. 
14210 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
14220 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f  rMsg(pParse, "fo
14230 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22  reign key on %s"
14240 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75  .         " shou
14250 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  ld reference onl
14260 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  y one column of 
14270 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20  table %T",.     
14280 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c      p->aCol[iCol
14290 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20  ].zName, pTo);. 
142a0 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
142b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c  ;.    }.    nCol
142c0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
142d0 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
142e0 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d  ol->nExpr!=pFrom
142f0 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  Col->nExpr ){.  
14300 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14310 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
14320 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c    "number of col
14330 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20  umns in foreign 
14340 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
14350 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
14360 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75   ".        "colu
14370 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  mns in the refer
14380 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20  enced table");. 
14390 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
143a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
143b0 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  l = pFromCol->nE
143c0 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  xpr;.  }.  nByte
143d0 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79   = sizeof(*pFKey
143e0 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a  ) + (nCol-1)*siz
143f0 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b  eof(pFKey->aCol[
14400 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31  0]) + pTo->n + 1
14410 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  ;.  if( pToCol )
14420 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
14430 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20  <pToCol->nExpr; 
14440 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  i++){.      nByt
14450 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
14460 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69  en30(pToCol->a[i
14470 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ].zName) + 1;.  
14480 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20    }.  }.  pFKey 
14490 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
144a0 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20  cZero(db, nByte 
144b0 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d  );.  if( pFKey==
144c0 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b  0 ){.    goto fk
144d0 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65  _end;.  }.  pFKe
144e0 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20  y->pFrom = p;.  
144f0 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d  pFKey->pNextFrom
14500 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a   = p->pFKey;.  z
14510 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79   = (char*)&pFKey
14520 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20  ->aCol[nCol];.  
14530 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a  pFKey->zTo = z;.
14540 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d    memcpy(z, pTo-
14550 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a  >z, pTo->n);.  z
14560 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20  [pTo->n] = 0;.  
14570 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
14580 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e  );.  z += pTo->n
14590 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f  +1;.  pFKey->nCo
145a0 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20  l = nCol;.  if( 
145b0 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
145c0 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30     pFKey->aCol[0
145d0 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f  ].iFrom = p->nCo
145e0 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l-1;.  }else{.  
145f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
14600 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
14610 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
14620 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20  j=0; j<p->nCol; 
14630 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
14640 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
14650 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  (p->aCol[j].zNam
14660 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69  e, pFromCol->a[i
14670 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
14680 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e           pFKey->
14690 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20  aCol[i].iFrom = 
146a0 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  j;.          bre
146b0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
146c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
146d0 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  j>=p->nCol ){.  
146e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
146f0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
14700 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77           "unknow
14710 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20  n column \"%s\" 
14720 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64  in foreign key d
14730 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20  efinition", .   
14740 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d         pFromCol-
14750 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  >a[i].zName);.  
14760 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
14770 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
14780 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f  .  }.  if( pToCo
14790 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  l ){.    for(i=0
147a0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
147b0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
147c0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54  lite3Strlen30(pT
147d0 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  oCol->a[i].zName
147e0 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e  );.      pFKey->
147f0 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a  aCol[i].zCol = z
14800 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a  ;.      memcpy(z
14810 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  , pToCol->a[i].z
14820 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Name, n);.      
14830 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[n] = 0;.      
14840 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a  z += n+1;.    }.
14850 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44    }.  pFKey->isD
14860 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70  eferred = 0;.  p
14870 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d  FKey->aAction[0]
14880 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26 20   = (u8)(flags & 
14890 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20 20  0xff);          
148a0 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61    /* ON DELETE a
148b0 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79  ction */.  pFKey
148c0 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28  ->aAction[1] = (
148d0 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38 20  u8)((flags >> 8 
148e0 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f 2a  ) & 0xff);    /*
148f0 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f   ON UPDATE actio
14900 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  n */..  assert( 
14910 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
14920 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d  exHeld(db, 0, p-
14930 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 70  >pSchema) );.  p
14940 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a  NextTo = (FKey *
14950 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65  )sqlite3HashInse
14960 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e  rt(&p->pSchema->
14970 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20 20  fkeyHash, .     
14980 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f   pFKey->zTo, (vo
14990 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a  id *)pFKey.  );.
149a0 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70    if( pNextTo==p
149b0 46 4b 65 79 20 29 7b 0a 20 20 20 20 64 62 2d 3e  FKey ){.    db->
149c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
149d0 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  ;.    goto fk_en
149e0 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65  d;.  }.  if( pNe
149f0 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65  xtTo ){.    asse
14a00 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72  rt( pNextTo->pPr
14a10 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70  evTo==0 );.    p
14a20 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
14a30 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65  pNextTo;.    pNe
14a40 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20  xtTo->pPrevTo = 
14a50 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pFKey;.  }..  /*
14a60 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67   Link the foreig
14a70 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62  n key to the tab
14a80 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73  le as the last s
14a90 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  tep..  */.  p->p
14aa0 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20  FKey = pFKey;.  
14ab0 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65  pFKey = 0;..fk_e
14ac0 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  nd:.  sqlite3DbF
14ad0 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a  ree(db, pFKey);.
14ae0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
14af0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
14b00 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20  OREIGN_KEY) */. 
14b10 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
14b20 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d  Delete(db, pFrom
14b30 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Col);.  sqlite3E
14b40 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
14b50 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  , pToCol);.}../*
14b60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14b70 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
14b80 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
14b90 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
14ba0 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
14bb0 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
14bc0 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
14bd0 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
14be0 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
14bf0 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
14c00 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
14c10 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
14c20 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
14c30 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
14c40 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
14c50 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
14c60 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
14c70 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
14c80 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
14c90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14ca0 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
14cb0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
14cc0 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a  nt isDeferred){.
14cd0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14ce0 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
14cf0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
14d00 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
14d10 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72  if( (pTab = pPar
14d20 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
14d30 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54  0 || (pFKey = pT
14d40 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20  ab->pFKey)==0 ) 
14d50 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
14d60 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20  ( isDeferred==0 
14d70 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31  || isDeferred==1
14d80 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33   ); /* EV: R-303
14d90 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46  23-21917 */.  pF
14da0 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
14db0 3d 20 28 75 38 29 69 73 44 65 66 65 72 72 65 64  = (u8)isDeferred
14dc0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
14dd0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14de0 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20  that will erase 
14df0 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78  and refill index
14e00 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69 73   *pIdx.  This is
14e10 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74  .** used to init
14e20 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63  ialize a newly c
14e30 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20  reated index or 
14e40 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65  to recompute the
14e50 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  .** content of a
14e60 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f  n index in respo
14e70 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58  nse to a REINDEX
14e80 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
14e90 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  if memRootPage i
14ea0 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20  s not negative, 
14eb0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
14ec0 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79  e index is newly
14ed0 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68  .** created.  Th
14ee0 65 20 72 65 67 69 73 74 65 72 20 73 70 65 63 69  e register speci
14ef0 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50  fied by memRootP
14f00 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  age contains the
14f10 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  .** root page nu
14f20 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
14f30 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61  x.  If memRootPa
14f40 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
14f50 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65  then.** the inde
14f60 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
14f70 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65   and must be cle
14f80 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ared before bein
14f90 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a  g refilled and.*
14fa0 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * the root page 
14fb0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e  number of the in
14fc0 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f  dex is taken fro
14fd0 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a  m pIndex->tnum..
14fe0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
14ff0 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
15000 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
15010 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20   Index *pIndex, 
15020 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29  int memRootPage)
15030 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
15040 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
15050 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  ;  /* The table 
15060 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64 20  that is indexed 
15070 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
15080 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
15090 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
150a0 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54 61  sor used for pTa
150b0 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20  b */.  int iIdx 
150c0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
150d0 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63  ;     /* Btree c
150e0 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70  ursor used for p
150f0 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  Index */.  int i
15100 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20 20 20  Sorter;         
15110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
15120 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 4f 70  sor opened by Op
15130 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69 6e 20  enSorter (if in 
15140 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64  use) */.  int ad
15150 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dr1;            
15160 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
15170 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f  ess of top of lo
15180 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  op */.  int addr
15190 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2;              
151a0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
151b0 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72  s to jump to for
151c0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
151d0 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20  */.  int tnum;  
151e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151f0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
15200 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   of index */.  i
15210 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c  nt iPartIdxLabel
15220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
15230 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61   Jump to this la
15240 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20 72 6f  bel to skip a ro
15250 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  w */.  Vdbe *v; 
15260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15270 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
15280 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73  e code into this
15290 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
152a0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70   */.  KeyInfo *p
152b0 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  Key;            
152c0 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20       /* KeyInfo 
152d0 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  for index */.  i
152e0 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20  nt regRecord;   
152f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15300 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
15310 67 20 61 73 73 65 6d 62 6c 69 65 64 20 69 6e 64  g assemblied ind
15320 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73  ex record */.  s
15330 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
15340 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a  rse->db;      /*
15350 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
15360 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
15370 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
15380 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
15390 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
153a0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
153b0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
153c0 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69  ATION.  if( sqli
153d0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
153e0 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e  rse, SQLITE_REIN
153f0 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  DEX, pIndex->zNa
15400 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d  me, 0,.      db-
15410 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20  >aDb[iDb].zName 
15420 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
15430 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
15440 2a 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74  * Require a writ
15450 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  e-lock on the ta
15460 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74  ble to perform t
15470 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  his operation */
15480 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c  .  sqlite3TableL
15490 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
154a0 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20   pTab->tnum, 1, 
154b0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
154c0 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
154d0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
154e0 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
154f0 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50  ;.  if( memRootP
15500 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e  age>=0 ){.    tn
15510 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65  um = memRootPage
15520 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
15530 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e  num = pIndex->tn
15540 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d  um;.  }.  pKey =
15550 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f   sqlite3KeyInfoO
15560 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  fIndex(pParse, p
15570 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 4f 70  Index);..  /* Op
15580 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63 75  en the sorter cu
15590 72 73 6f 72 20 69 66 20 77 65 20 61 72 65 20 74  rsor if we are t
155a0 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20  o use one. */.  
155b0 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65  iSorter = pParse
155c0 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69  ->nTab++;.  sqli
155d0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
155e0 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20   OP_SorterOpen, 
155f0 69 53 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e 64  iSorter, 0, pInd
15600 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63 68  ex->nKeyCol, (ch
15610 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20  ar*).           
15620 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15630 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 29  KeyInfoRef(pKey)
15640 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a  , P4_KEYINFO);..
15650 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74 61    /* Open the ta
15660 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ble. Loop throug
15670 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68  h all rows of th
15680 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72 74 69  e table, inserti
15690 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65  ng index.  ** re
156a0 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20 73  cords into the s
156b0 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69  orter. */.  sqli
156c0 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
156d0 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
156e0 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
156f0 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  d);.  addr1 = sq
15700 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15710 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
15720 61 62 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  ab, 0); VdbeCove
15730 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67 52 65  rage(v);.  regRe
15740 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
15750 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
15760 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  ;..  sqlite3Gene
15770 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
15780 72 73 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c  rse,pIndex,iTab,
15790 72 65 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61  regRecord,0,&iPa
157a0 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b  rtIdxLabel,0,0);
157b0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
157c0 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
157d0 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72  rInsert, iSorter
157e0 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
157f0 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61  sqlite3ResolvePa
15800 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73  rtIdxLabel(pPars
15810 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c  e, iPartIdxLabel
15820 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15830 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
15840 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31  t, iTab, addr1+1
15850 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
15860 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
15870 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
15880 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  r1);.  if( memRo
15890 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74  otPage<0 ) sqlit
158a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
158b0 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20  OP_Clear, tnum, 
158c0 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  iDb);.  sqlite3V
158d0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
158e0 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c  OpenWrite, iIdx,
158f0 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20   tnum, iDb, .   
15900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15910 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50   (char *)pKey, P
15920 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  4_KEYINFO);.  sq
15930 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
15940 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b  5(v, OPFLAG_BULK
15950 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67  CSR|((memRootPag
15960 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49  e>=0)?OPFLAG_P2I
15970 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64  SREG:0));..  add
15980 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
15990 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
159a0 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72  terSort, iSorter
159b0 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
159c0 67 65 28 76 29 3b 0a 20 20 61 73 73 65 72 74 28  ge(v);.  assert(
159d0 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e   pKey!=0 || db->
159e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
159f0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a  pParse->nErr );.
15a00 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e    if( IsUniqueIn
15a10 64 65 78 28 70 49 6e 64 65 78 29 20 26 26 20 70  dex(pIndex) && p
15a20 4b 65 79 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Key!=0 ){.    in
15a30 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t j2 = sqlite3Vd
15a40 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
15a50 20 2b 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65   + 3;.    sqlite
15a60 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
15a70 50 5f 47 6f 74 6f 2c 20 30 2c 20 6a 32 29 3b 0a  P_Goto, 0, j2);.
15a80 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
15a90 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
15aa0 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74  dr(v);.    sqlit
15ab0 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
15ac0 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70  v, OP_SorterComp
15ad0 61 72 65 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32  are, iSorter, j2
15ae0 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20  , regRecord,.   
15af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b00 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 4b        pIndex->nK
15b10 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65  eyCol); VdbeCove
15b20 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c  rage(v);.    sql
15b30 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72  ite3UniqueConstr
15b40 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f 45 5f  aint(pParse, OE_
15b50 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29 3b 0a  Abort, pIndex);.
15b60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64    }else{.    add
15b70 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
15b80 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
15b90 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
15ba0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
15bb0 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74 65  rterData, iSorte
15bc0 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  r, regRecord);. 
15bd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15be0 70 33 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p3(v, OP_IdxInse
15bf0 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65 63  rt, iIdx, regRec
15c00 6f 72 64 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  ord, 1);.  sqlit
15c10 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
15c20 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b  , OPFLAG_USESEEK
15c30 52 45 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74  RESULT);.  sqlit
15c40 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
15c50 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
15c60 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
15c70 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53  beAddOp2(v, OP_S
15c80 6f 72 74 65 72 4e 65 78 74 2c 20 69 53 6f 72 74  orterNext, iSort
15c90 65 72 2c 20 61 64 64 72 32 29 3b 20 56 64 62 65  er, addr2); Vdbe
15ca0 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73  Coverage(v);.  s
15cb0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
15cc0 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20  re(v, addr1);.. 
15cd0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15ce0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
15cf0 69 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  iTab);.  sqlite3
15d00 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
15d10 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a 20  _Close, iIdx);. 
15d20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15d30 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
15d40 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  iSorter);.}../*.
15d50 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68 65 61 70  ** Allocate heap
15d60 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 61   space to hold a
15d70 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 77  n Index object w
15d80 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75 6d 6e 73  ith nCol columns
15d90 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65 61 73 65  ..**.** Increase
15da0 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
15db0 73 69 7a 65 20 74 6f 20 70 72 6f 76 69 64 65 20  size to provide 
15dc0 61 6e 20 65 78 74 72 61 20 6e 45 78 74 72 61 20  an extra nExtra 
15dd0 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38 2d 62 79  bytes.** of 8-by
15de0 74 65 20 61 6c 69 67 6e 65 64 20 73 70 61 63 65  te aligned space
15df0 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65 78   after the Index
15e00 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75   object and retu
15e10 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  rn a.** pointer 
15e20 74 6f 20 74 68 69 73 20 65 78 74 72 61 20 73 70  to this extra sp
15e30 61 63 65 20 69 6e 20 2a 70 70 45 78 74 72 61 2e  ace in *ppExtra.
15e40 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74  .*/.Index *sqlit
15e50 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f  e3AllocateIndexO
15e60 62 6a 65 63 74 28 0a 20 20 73 71 6c 69 74 65 33  bject(.  sqlite3
15e70 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 2f 2a   *db,         /*
15e80 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
15e90 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36 20 6e 43  tion */.  i16 nC
15ea0 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ol,            /
15eb0 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
15ec0 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
15ed0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
15ee0 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
15ef0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
15f00 74 65 73 20 6f 66 20 65 78 74 72 61 20 73 70 61  tes of extra spa
15f10 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a 2f 0a 20  ce to alloc */. 
15f20 20 63 68 61 72 20 2a 2a 70 70 45 78 74 72 61 20   char **ppExtra 
15f30 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
15f40 20 74 6f 20 74 68 65 20 22 65 78 74 72 61 22 20   to the "extra" 
15f50 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e  space */.){.  In
15f60 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20  dex *p;         
15f70 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
15f80 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a  index object */.
15f90 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
15fa0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
15fb0 6f 66 20 73 70 61 63 65 20 66 6f 72 20 49 6e 64  of space for Ind
15fc0 65 78 20 6f 62 6a 65 63 74 20 2b 20 61 72 72 61  ex object + arra
15fd0 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74 65 20 3d  ys */..  nByte =
15fe0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49   ROUND8(sizeof(I
15ff0 6e 64 65 78 29 29 20 2b 20 20 20 20 20 20 20 20  ndex)) +        
16000 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
16010 74 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20  tructure  */.   
16020 20 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69         ROUND8(si
16030 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c  zeof(char*)*nCol
16040 29 20 2b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ) +         /* I
16050 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20  ndex.azColl     
16060 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55  */.          ROU
16070 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f 67 45 73  ND8(sizeof(LogEs
16080 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20  t)*(nCol+1) +   
16090 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77    /* Index.aiRow
160a0 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20 20 20 20  LogEst   */.    
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
160c0 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 20 2b 20  eof(i16)*nCol + 
160d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
160e0 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a  dex.aiColumn   *
160f0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
16100 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43     sizeof(u8)*nC
16110 6f 6c 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ol);            
16120 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f   /* Index.aSortO
16130 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d 20 73 71  rder */.  p = sq
16140 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
16150 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b 20 6e 45  o(db, nByte + nE
16160 78 74 72 61 29 3b 0a 20 20 69 66 28 20 70 20 29  xtra);.  if( p )
16170 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 45 78 74  {.    char *pExt
16180 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29 2b  ra = ((char*)p)+
16190 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 49 6e  ROUND8(sizeof(In
161a0 64 65 78 29 29 3b 0a 20 20 20 20 70 2d 3e 61 7a  dex));.    p->az
161b0 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 70  Coll = (char**)p
161c0 45 78 74 72 61 3b 20 20 20 20 20 20 20 70 45 78  Extra;       pEx
161d0 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38 28 73 69  tra += ROUND8(si
161e0 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43 6f 6c  zeof(char*)*nCol
161f0 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52 6f 77 4c  );.    p->aiRowL
16200 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45 73 74 2a  ogEst = (LogEst*
16210 29 70 45 78 74 72 61 3b 20 70 45 78 74 72 61 20  )pExtra; pExtra 
16220 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  += sizeof(LogEst
16230 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20 20 20  )*(nCol+1);.    
16240 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69  p->aiColumn = (i
16250 31 36 2a 29 70 45 78 74 72 61 3b 20 20 20 20 20  16*)pExtra;     
16260 20 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65    pExtra += size
16270 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20 20  of(i16)*nCol;.  
16280 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20    p->aSortOrder 
16290 3d 20 28 75 38 2a 29 70 45 78 74 72 61 3b 0a 20  = (u8*)pExtra;. 
162a0 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20     p->nColumn = 
162b0 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b 65  nCol;.    p->nKe
162c0 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31 3b  yCol = nCol - 1;
162d0 0a 20 20 20 20 2a 70 70 45 78 74 72 61 20 3d 20  .    *ppExtra = 
162e0 28 28 63 68 61 72 2a 29 70 29 20 2b 20 6e 42 79  ((char*)p) + nBy
162f0 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  te;.  }.  return
16300 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   p;.}../*.** Cre
16310 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20  ate a new index 
16320 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65  for an SQL table
16330 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32  .  pName1.pName2
16340 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
16350 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e  the index .** an
16360 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68  d pTblList is th
16370 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
16380 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
16390 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68  e indexed.  Both
163a0 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c   will .** be NUL
163b0 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20  L for a primary 
163c0 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  key or an index 
163d0 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
163e0 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20  to satisfy a.** 
163f0 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
16400 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e  t.  If pTable an
16410 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c  d pIndex are NUL
16420 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70  L, use pParse->p
16430 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74  NewTable.** as t
16440 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
16450 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d  ndexed.  pParse-
16460 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20  >pNewTable is a 
16470 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a  table that is.**
16480 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
16490 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
164a0 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
164b0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
164c0 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
164d0 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
164e0 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74   indexed.  pList
164f0 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66   will be NULL if
16500 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72   this.** is a pr
16510 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69  imary key or uni
16520 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f  que-constraint o
16530 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
16540 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a  t column added.*
16550 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  * to the table c
16560 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
16570 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a  onstruction.  .*
16580 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 64 65  *.** If the inde
16590 78 20 69 73 20 63 72 65 61 74 65 64 20 73 75 63  x is created suc
165a0 63 65 73 73 66 75 6c 6c 79 2c 20 72 65 74 75 72  cessfully, retur
165b0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
165c0 68 65 20 6e 65 77 20 49 6e 64 65 78 0a 2a 2a 20  he new Index.** 
165d0 73 74 72 75 63 74 75 72 65 2e 20 54 68 69 73 20  structure. This 
165e0 69 73 20 75 73 65 64 20 62 79 20 73 71 6c 69 74  is used by sqlit
165f0 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
16600 29 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 69 6e  ) to mark the in
16610 64 65 78 0a 2a 2a 20 61 73 20 74 68 65 20 74 61  dex.** as the ta
16620 62 6c 65 73 20 70 72 69 6d 61 72 79 20 6b 65 79  bles primary key
16630 20 28 49 6e 64 65 78 2e 69 64 78 54 79 70 65 3d   (Index.idxType=
16640 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
16650 50 52 49 4d 41 52 59 4b 45 59 29 0a 2a 2f 0a 49  PRIMARYKEY).*/.I
16660 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 43 72 65  ndex *sqlite3Cre
16670 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ateIndex(.  Pars
16680 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
16690 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  * All informatio
166a0 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61 72  n about this par
166b0 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  se */.  Token *p
166c0 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46 69  Name1,     /* Fi
166d0 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64 65  rst part of inde
166e0 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e  x name. May be N
166f0 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
16700 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 53  pName2,     /* S
16710 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69 6e  econd part of in
16720 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
16730 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c 69   NULL */.  SrcLi
16740 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a  st *pTblName, /*
16750 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78 2e   Table to index.
16760 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e 65   Use pParse->pNe
16770 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a 20  wTable if 0 */. 
16780 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
16790 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66  ,   /* A list of
167a0 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20 69   columns to be i
167b0 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
167c0 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f  onError,       /
167d0 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f 49  * OE_Abort, OE_I
167e0 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61 63  gnore, OE_Replac
167f0 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f  e, or OE_None */
16800 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72 74  .  Token *pStart
16810 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45  ,     /* The CRE
16820 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62  ATE token that b
16830 65 67 69 6e 73 20 74 68 69 73 20 73 74 61 74 65  egins this state
16840 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ment */.  Expr *
16850 70 50 49 57 68 65 72 65 2c 20 20 20 20 2f 2a 20  pPIWhere,    /* 
16860 57 48 45 52 45 20 63 6c 61 75 73 65 20 66 6f 72  WHERE clause for
16870 20 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73   partial indices
16880 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
16890 64 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74  der,     /* Sort
168a0 20 6f 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72   order of primar
168b0 79 20 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74  y key when pList
168c0 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  ==NULL */.  int 
168d0 69 66 4e 6f 74 45 78 69 73 74 20 20 20 20 20 2f  ifNotExist     /
168e0 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20  * Omit error if 
168f0 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
16900 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  ists */.){.  Ind
16910 65 78 20 2a 70 52 65 74 20 3d 20 30 3b 20 20 20  ex *pRet = 0;   
16920 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
16930 72 65 74 75 72 6e 20 2a 2f 0a 20 20 54 61 62 6c  return */.  Tabl
16940 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
16950 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
16960 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64  indexed */.  Ind
16970 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20  ex *pIndex = 0; 
16980 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
16990 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  o be created */.
169a0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
169b0 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  0;     /* Name o
169c0 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  f the index */. 
169d0 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
169e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
169f0 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
16a00 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20   zName */.  int 
16a10 69 2c 20 6a 3b 0a 20 20 44 62 46 69 78 65 72 20  i, j;.  DbFixer 
16a20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  sFix;        /* 
16a30 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61  For assigning da
16a40 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20  tabase names to 
16a50 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  pTable */.  int 
16a60 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20  sortOrderMask;  
16a70 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44   /* 1 to honor D
16a80 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30  ESC in index.  0
16a90 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20   to ignore. */. 
16aa0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
16ab0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20  Parse->db;.  Db 
16ac0 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *pDb;           
16ad0 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69    /* The specifi
16ae0 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  c table containi
16af0 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 20 64  ng the indexed d
16b00 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
16b10 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
16b20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
16b30 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
16b40 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
16b50 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
16b60 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e  me = 0;    /* Un
16b70 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f  qualified name o
16b80 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63  f the index to c
16b90 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  reate */.  struc
16ba0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
16bb0 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46  *pListItem; /* F
16bc0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
16bd0 70 4c 69 73 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  pList */.  const
16be0 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c   Column *pTabCol
16bf0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
16c00 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74   column in the t
16c10 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  able */.  int nE
16c20 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20  xtra = 0;       
16c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
16c40 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
16c50 72 20 7a 45 78 74 72 61 5b 5d 20 2a 2f 0a 20 20  r zExtra[] */.  
16c60 69 6e 74 20 6e 45 78 74 72 61 43 6f 6c 3b 20 20  int nExtraCol;  
16c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78   /* Number of ex
16c90 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64  tra columns need
16ca0 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  ed */.  char *zE
16cb0 78 74 72 61 20 3d 20 30 3b 20 20 20 20 20 20 20  xtra = 0;       
16cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
16cd0 61 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68  a space after th
16ce0 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  e Index object *
16cf0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d  /.  Index *pPk =
16d00 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 52 49 4d   0;      /* PRIM
16d10 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 66 6f  ARY KEY index fo
16d20 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
16d30 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 61 73 73  tables */..  ass
16d40 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
16d50 72 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a 20  r==0 );      /* 
16d60 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  Never called wit
16d70 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a  h prior errors *
16d80 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
16d90 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44  ocFailed || IN_D
16da0 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20  ECLARE_VTAB ){. 
16db0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
16dc0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
16dd0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
16de0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
16df0 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
16e00 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
16e10 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20  e_index;.  }..  
16e20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
16e30 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
16e40 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52  o be indexed.  R
16e50 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e  eturn early if n
16e60 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
16e70 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30   if( pTblName!=0
16e80 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20   ){..    /* Use 
16e90 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64  the two-part ind
16ea0 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72  ex name to deter
16eb0 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73  mine the databas
16ec0 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61  e .    ** to sea
16ed0 72 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c  rch for the tabl
16ee0 65 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62  e. 'Fix' the tab
16ef0 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20  le name to this 
16f00 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  db.    ** before
16f10 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20   looking up the 
16f20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
16f30 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31    assert( pName1
16f40 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20   && pName2 );.  
16f50 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
16f60 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
16f70 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
16f80 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20  2, &pName);.    
16f90 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f  if( iDb<0 ) goto
16fa0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
16fb0 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ex;.    assert( 
16fc0 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e  pName && pName->
16fd0 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  z );..#ifndef SQ
16fe0 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42  LITE_OMIT_TEMPDB
16ff0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
17000 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e  ndex name was un
17010 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b  qualified, check
17020 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20   if the table.  
17030 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74    ** is a temp t
17040 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74  able. If so, set
17050 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
17060 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68   1. Do not do th
17070 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69  is.    ** if ini
17080 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61  tialising a data
17090 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20  base schema..   
170a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d   */.    if( !db-
170b0 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
170c0 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
170d0 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28  e3SrcListLookup(
170e0 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65  pParse, pTblName
170f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61  );.      if( pNa
17100 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61  me2->n==0 && pTa
17110 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65  b && pTab->pSche
17120 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  ma==db->aDb[1].p
17130 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
17140 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20    iDb = 1;.     
17150 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
17160 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 49  .    sqlite3FixI
17170 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73  nit(&sFix, pPars
17180 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c  e, iDb, "index",
17190 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   pName);.    if(
171a0 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
171b0 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61  st(&sFix, pTblNa
171c0 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  me) ){.      /* 
171d0 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73  Because the pars
171e0 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54  er constructs pT
171f0 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69  blName from a si
17200 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c  ngle identifier,
17210 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
17220 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20  3FixSrcList can 
17230 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20  never fail. */. 
17240 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
17250 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d      }.    pTab =
17260 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
17270 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20  bleItem(pParse, 
17280 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b  0, &pTblName->a[
17290 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0]);.    assert(
172a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
172b0 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20  d==0 || pTab==0 
172c0 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d  );.    if( pTab=
172d0 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
172e0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
172f0 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64   if( iDb==1 && d
17300 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
17310 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema!=pTab->pSche
17320 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ma ){.      sqli
17330 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
17340 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
17350 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61  "cannot create a
17360 20 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e   TEMP index on n
17370 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22  on-TEMP table \"
17380 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\"",.         
17390 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a    pTab->zName);.
173a0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
173b0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
173c0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73    }.    if( !Has
173d0 52 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 50  Rowid(pTab) ) pP
173e0 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61  k = sqlite3Prima
173f0 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29  ryKeyIndex(pTab)
17400 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
17410 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20  ssert( pName==0 
17420 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
17430 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Start==0 );.    
17440 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
17450 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66  NewTable;.    if
17460 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65  ( !pTab ) goto e
17470 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
17480 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
17490 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
174a0 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
174b0 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d  ma);.  }.  pDb =
174c0 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
174d0 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21  .  assert( pTab!
174e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
174f0 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
17500 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
17510 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
17520 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
17530 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26   7)==0 .       &
17540 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  & sqlite3StrNICm
17550 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37  p(&pTab->zName[7
17560 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29  ],"altertab_",9)
17570 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
17580 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
17590 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79  e, "table %s may
175a0 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
175b0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
175c0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
175d0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
175e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
175f0 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70  MIT_VIEW.  if( p
17600 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
17610 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
17620 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65  Msg(pParse, "vie
17630 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  ws may not be in
17640 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74  dexed");.    got
17650 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
17660 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  dex;.  }.#endif.
17670 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17680 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
17690 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
176a0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
176b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
176c0 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74  arse, "virtual t
176d0 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65  ables may not be
176e0 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20   indexed");.    
176f0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
17700 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64  _index;.  }.#end
17710 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69  if..  /*.  ** Fi
17720 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  nd the name of t
17730 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  he index.  Make 
17740 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f  sure there is no
17750 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65  t already anothe
17760 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  r.  ** index or 
17770 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
17780 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a  ame name.  .  **
17790 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a  .  ** Exception:
177a0 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64    If we are read
177b0 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  ing the names of
177c0 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63   permanent indic
177d0 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  es from the.  **
177e0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
177f0 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f  able (because so
17800 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
17810 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68   changed the sch
17820 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e  ema) and.  ** on
17830 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e  e of the index n
17840 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69  ames collides wi
17850 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  th the name of a
17860 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
17870 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20   or.  ** index, 
17880 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e  then we will con
17890 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73  tinue to process
178a0 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a   this index..  *
178b0 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d  *.  ** If pName=
178c0 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  =0 it means that
178d0 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61   we are.  ** dea
178e0 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d  ling with a prim
178f0 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55  ary key or UNIQU
17900 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57  E constraint.  W
17910 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74  e have to invent
17920 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61   our.  ** own na
17930 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  me..  */.  if( p
17940 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  Name ){.    zNam
17950 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
17960 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
17970 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  me);.    if( zNa
17980 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  me==0 ) goto exi
17990 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
179a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
179b0 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69  e->z!=0 );.    i
179c0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
179d0 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74  lite3CheckObject
179e0 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61  Name(pParse, zNa
179f0 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  me) ){.      got
17a00 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
17a10 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  dex;.    }.    i
17a20 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
17a30 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  y ){.      if( s
17a40 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
17a50 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30  db, zName, 0)!=0
17a60 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
17a70 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
17a80 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
17a90 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61  ready a table na
17aa0 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
17ab0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
17ac0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
17ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17ae0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
17af0 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
17b00 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d  e, pDb->zName)!=
17b10 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
17b20 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20  ifNotExist ){.  
17b30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
17b40 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
17b50 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20  ndex %s already 
17b60 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b  exists", zName);
17b70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17b80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
17b90 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
17ba0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
17bb0 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
17bc0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
17bd0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
17be0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
17bf0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ex;.    }.  }els
17c00 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  e{.    int n;.  
17c10 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a    Index *pLoop;.
17c20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54      for(pLoop=pT
17c30 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b  ab->pIndex, n=1;
17c40 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
17c50 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29  oop->pNext, n++)
17c60 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  {}.    zName = s
17c70 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
17c80 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
17c90 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62  dex_%s_%d", pTab
17ca0 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ->zName, n);.   
17cb0 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
17cc0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
17cd0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
17ce0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
17cf0 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69  heck for authori
17d00 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  zation to create
17d10 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   an index..  */.
17d20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17d30 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
17d40 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  N.  {.    const 
17d50 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d  char *zDb = pDb-
17d60 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  >zName;.    if( 
17d70 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
17d80 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
17d90 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
17da0 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44  ABLE(iDb), 0, zD
17db0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
17dc0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
17dd0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  ex;.    }.    i 
17de0 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
17df0 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21  INDEX;.    if( !
17e00 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
17e10 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49  Db==1 ) i = SQLI
17e20 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
17e30 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
17e40 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
17e50 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c  Parse, i, zName,
17e60 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
17e70 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
17e80 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
17e90 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
17ea0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  ndif..  /* If pL
17eb0 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73  ist==0, it means
17ec0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
17ed0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65  s called to make
17ee0 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20   a primary.  ** 
17ef0 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  key out of the l
17f00 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
17f10 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
17f20 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
17f30 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65  ..  ** So create
17f40 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20   a fake list to 
17f50 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20  simulate this.. 
17f60 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
17f70 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
17f80 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
17f90 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
17fa0 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
17fb0 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65  List==0 ) goto e
17fc0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
17fd0 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30  ;.    pList->a[0
17fe0 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
17ff0 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65  3DbStrDup(pParse
18000 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
18010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
18030 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
18040 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  Col-1].zName);. 
18050 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73     pList->a[0].s
18060 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 73  ortOrder = (u8)s
18070 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
18080 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
18090 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ow many bytes of
180a0 20 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69   space are requi
180b0 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70  red to store exp
180c0 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65  licitly.  ** spe
180d0 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  cified collation
180e0 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e   sequence names.
180f0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
18100 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
18110 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
18120 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  *pExpr = pList->
18130 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
18140 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20  if( pExpr ){.   
18150 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
18160 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
18170 20 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   );.      nExtra
18180 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33   += (1 + sqlite3
18190 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e  Strlen30(pExpr->
181a0 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20  u.zToken));.    
181b0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a  }.  }..  /* .  *
181c0 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69  * Allocate the i
181d0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20  ndex structure. 
181e0 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20  .  */.  nName = 
181f0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
18200 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61  zName);.  nExtra
18210 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d  Col = pPk ? pPk-
18220 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20  >nKeyCol : 1;.  
18230 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
18240 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a  AllocateIndexObj
18250 65 63 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e  ect(db, pList->n
18260 45 78 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c  Expr + nExtraCol
18270 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18290 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20          nName + 
182a0 6e 45 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78  nExtra + 1, &zEx
182b0 74 72 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tra);.  if( db->
182c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
182d0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
182e0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
182f0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
18300 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
18310 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45  Index->aiRowLogE
18320 73 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  st) );.  assert(
18330 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
18340 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a  NMENT(pIndex->az
18350 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65  Coll) );.  pInde
18360 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72  x->zName = zExtr
18370 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e  a;.  zExtra += n
18380 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63  Name + 1;.  memc
18390 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  py(pIndex->zName
183a0 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31  , zName, nName+1
183b0 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61  );.  pIndex->pTa
183c0 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49  ble = pTab;.  pI
183d0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  ndex->onError = 
183e0 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70  (u8)onError;.  p
183f0 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75  Index->uniqNotNu
18400 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45  ll = onError!=OE
18410 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d  _None;.  pIndex-
18420 3e 69 64 78 54 79 70 65 20 3d 20 70 4e 61 6d 65  >idxType = pName
18430 20 3f 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50   ? SQLITE_IDXTYP
18440 45 5f 41 50 50 44 45 46 20 3a 20 53 51 4c 49 54  E_APPDEF : SQLIT
18450 45 5f 49 44 58 54 59 50 45 5f 55 4e 49 51 55 45  E_IDXTYPE_UNIQUE
18460 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  ;.  pIndex->pSch
18470 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
18480 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49  b].pSchema;.  pI
18490 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20  ndex->nKeyCol = 
184a0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
184b0 69 66 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a  if( pPIWhere ){.
184c0 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
184d0 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28  veSelfReference(
184e0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43  pParse, pTab, NC
184f0 5f 50 61 72 74 49 64 78 2c 20 70 50 49 57 68 65  _PartIdx, pPIWhe
18500 72 65 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64  re, 0);.    pInd
18510 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  ex->pPartIdxWher
18520 65 20 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20  e = pPIWhere;.  
18530 20 20 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a    pPIWhere = 0;.
18540 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
18550 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
18560 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
18570 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
18580 74 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f  to see if we sho
18590 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72  uld honor DESC r
185a0 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78  equests on index
185b0 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20   columns.  */.  
185c0 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
185d0 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  ->file_format>=4
185e0 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65   ){.    sortOrde
185f0 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a  rMask = -1;   /*
18600 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20   Honor DESC */. 
18610 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74   }else{.    sort
18620 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20  OrderMask = 0;  
18630 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43    /* Ignore DESC
18640 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63   */.  }..  /* Sc
18650 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  an the names of 
18660 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
18670 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
18680 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20  ndexed and.  ** 
18690 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  load the column 
186a0 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68 65  indices into the
186b0 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   Index structure
186c0 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  .  Report an err
186d0 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20 63  or.  ** if any c
186e0 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75  olumn is not fou
186f0 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  nd..  **.  ** TO
18700 44 4f 3a 20 20 41 64 64 20 61 20 74 65 73 74 20  DO:  Add a test 
18710 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
18720 74 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  t the same colum
18730 6e 20 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20  n is not named. 
18740 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   ** more than on
18750 63 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ce within the sa
18760 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20  me index.  Only 
18770 74 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e  the first instan
18780 63 65 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63  ce of.  ** the c
18790 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20  olumn will ever 
187a0 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20 6f  be used by the o
187b0 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20  ptimizer.  Note 
187c0 74 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20  that using the. 
187d0 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20   ** same column 
187e0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 63  more than once c
187f0 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72 72 6f  annot be an erro
18800 72 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77  r because that w
18810 6f 75 6c 64 20 0a 20 20 2a 2a 20 62 72 65 61 6b  ould .  ** break
18820 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
18830 74 69 62 69 6c 69 74 79 20 2d 20 69 74 20 6e 65  tibility - it ne
18840 65 64 73 20 74 6f 20 62 65 20 61 20 77 61 72 6e  eds to be a warn
18850 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ing..  */.  for(
18860 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70  i=0, pListItem=p
18870 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
18880 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c  ->nExpr; i++, pL
18890 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  istItem++){.    
188a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
188b0 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d  Name = pListItem
188c0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74  ->zName;.    int
188d0 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72   requestedSortOr
188e0 64 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  der;.    char *z
188f0 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
18900 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
18910 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
18920 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a  me */..    for(j
18930 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62  =0, pTabCol=pTab
18940 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e  ->aCol; j<pTab->
18950 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43  nCol; j++, pTabC
18960 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ol++){.      if(
18970 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
18980 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f  zColName, pTabCo
18990 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  l->zName)==0 ) b
189a0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
189b0 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f  if( j>=pTab->nCo
189c0 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  l ){.      sqlit
189d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
189e0 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61 73  e, "table %s has
189f0 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64   no column named
18a00 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54   %s",.        pT
18a10 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e  ab->zName, zColN
18a20 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 50 61 72  ame);.      pPar
18a30 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20  se->checkSchema 
18a40 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
18a50 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18a60 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  x;.    }.    ass
18a70 65 72 74 28 20 6a 3c 3d 30 78 37 66 66 66 20 29  ert( j<=0x7fff )
18a80 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69  ;.    pIndex->ai
18a90 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 28 69 31 36  Column[i] = (i16
18aa0 29 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  )j;.    if( pLis
18ab0 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 29 7b 0a  tItem->pExpr ){.
18ac0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b        int nColl;
18ad0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
18ae0 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
18af0 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
18b00 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  );.      zColl =
18b10 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
18b20 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
18b30 20 20 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     nColl = sqlit
18b40 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c  e3Strlen30(zColl
18b50 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73  ) + 1;.      ass
18b60 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f  ert( nExtra>=nCo
18b70 6c 6c 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ll );.      memc
18b80 70 79 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c  py(zExtra, zColl
18b90 2c 20 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , nColl);.      
18ba0 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a  zColl = zExtra;.
18bb0 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20        zExtra += 
18bc0 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78  nColl;.      nEx
18bd0 74 72 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20  tra -= nColl;.  
18be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
18bf0 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Coll = pTab->aCo
18c00 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[j].zColl;.    
18c10 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a    if( !zColl ) z
18c20 43 6f 6c 6c 20 3d 20 22 42 49 4e 41 52 59 22 3b  Coll = "BINARY";
18c30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
18c40 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
18c50 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   !sqlite3LocateC
18c60 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
18c70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 67  Coll) ){.      g
18c80 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18c90 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
18ca0 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
18cb0 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20  i] = zColl;.    
18cc0 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64  requestedSortOrd
18cd0 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e  er = pListItem->
18ce0 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74  sortOrder & sort
18cf0 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70  OrderMask;.    p
18d00 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
18d10 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65  r[i] = (u8)reque
18d20 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20  stedSortOrder;. 
18d30 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f     if( pTab->aCo
18d40 6c 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20  l[j].notNull==0 
18d50 29 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f  ) pIndex->uniqNo
18d60 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  tNull = 0;.  }. 
18d70 20 69 66 28 20 70 50 6b 20 29 7b 0a 20 20 20 20   if( pPk ){.    
18d80 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 50 6b 2d 3e  for(j=0; j<pPk->
18d90 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nKeyCol; j++){. 
18da0 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50 6b       int x = pPk
18db0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
18dc0 20 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75       if( hasColu
18dd0 6d 6e 28 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  mn(pIndex->aiCol
18de0 75 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65  umn, pIndex->nKe
18df0 79 43 6f 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20  yCol, x) ){.    
18e00 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c      pIndex->nCol
18e10 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65  umn--; .      }e
18e20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  lse{.        pIn
18e30 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
18e40 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 49   = x;.        pI
18e50 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
18e60 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d  = pPk->azColl[j]
18e70 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ;.        pIndex
18e80 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
18e90 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65  = pPk->aSortOrde
18ea0 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b  r[j];.        i+
18eb0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
18ec0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
18ed0 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
18ee0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18ef0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
18f00 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 70 49  [i] = -1;.    pI
18f10 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
18f20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a  = "BINARY";.  }.
18f30 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74    sqlite3Default
18f40 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a  RowEst(pIndex);.
18f50 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e    if( pParse->pN
18f60 65 77 54 61 62 6c 65 3d 3d 30 20 29 20 65 73 74  ewTable==0 ) est
18f70 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28  imateIndexWidth(
18f80 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28 20  pIndex);..  if( 
18f90 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e  pTab==pParse->pN
18fa0 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f  ewTable ){.    /
18fb0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68  * This routine h
18fc0 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74  as been called t
18fd0 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f  o create an auto
18fe0 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61  matic index as a
18ff0 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f  .    ** result o
19000 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  f a PRIMARY KEY 
19010 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
19020 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66   on a column def
19030 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20  inition, or.    
19040 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  ** a PRIMARY KEY
19050 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73   or UNIQUE claus
19060 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  e following the 
19070 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
19080 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20  ns..    ** i.e. 
19090 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20  one of:.    **. 
190a0 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42     ** CREATE TAB
190b0 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b  LE t(x PRIMARY K
190c0 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43  EY, y);.    ** C
190d0 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c  REATE TABLE t(x,
190e0 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29   y, UNIQUE(x, y)
190f0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
19100 20 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65   Either way, che
19110 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
19120 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68   table already h
19130 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78  as such an index
19140 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20  . If.    ** so, 
19150 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65  don't bother cre
19160 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20  ating this one. 
19170 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65  This only applie
19180 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f  s to.    ** auto
19190 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65  matically create
191a0 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73  d indices. Users
191b0 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20   can do as they 
191c0 77 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a  wish with.    **
191d0 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65   explicit indice
191e0 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s..    **.    **
191f0 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50   Two UNIQUE or P
19200 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
19210 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69  raints are consi
19220 64 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74  dered equivalent
19230 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75  .    ** (and thu
19240 73 20 73 75 70 70 72 65 73 73 69 6e 67 20 74 68  s suppressing th
19250 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76  e second one) ev
19260 65 6e 20 69 66 20 74 68 65 79 20 68 61 76 65 20  en if they have 
19270 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a  different.    **
19280 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20   sort orders..  
19290 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
192a0 68 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65  here are differe
192b0 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  nt collating seq
192c0 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65  uences or if the
192d0 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20   columns of.    
192e0 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  ** the constrain
192f0 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65  t occur in diffe
19300 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65  rent orders, the
19310 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  n the constraint
19320 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e  s are.    ** con
19330 73 69 64 65 72 65 64 20 64 69 73 74 69 6e 63 74  sidered distinct
19340 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74   and both result
19350 20 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64   in separate ind
19360 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ices..    */.   
19370 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
19380 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
19390 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
193a0 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
193b0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20  {.      int k;. 
193c0 20 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55       assert( IsU
193d0 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29  niqueIndex(pIdx)
193e0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
193f0 28 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 21  ( pIdx->idxType!
19400 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f  =SQLITE_IDXTYPE_
19410 41 50 50 44 45 46 20 29 3b 0a 20 20 20 20 20 20  APPDEF );.      
19420 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75 65  assert( IsUnique
19430 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 3b  Index(pIndex) );
19440 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ..      if( pIdx
19450 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65  ->nKeyCol!=pInde
19460 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e  x->nKeyCol ) con
19470 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
19480 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b  (k=0; k<pIdx->nK
19490 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20  eyCol; k++){.   
194a0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
194b0 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  *z1;.        con
194c0 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20  st char *z2;.   
194d0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
194e0 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64  iColumn[k]!=pInd
194f0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20  ex->aiColumn[k] 
19500 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
19510 20 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f   z1 = pIdx->azCo
19520 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 7a  ll[k];.        z
19530 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  2 = pIndex->azCo
19540 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[k];.        i
19550 66 28 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c  f( z1!=z2 && sql
19560 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20  ite3StrICmp(z1, 
19570 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  z2) ) break;.   
19580 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b     }.      if( k
19590 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 20  ==pIdx->nKeyCol 
195a0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
195b0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49  Idx->onError!=pI
195c0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b  ndex->onError ){
195d0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
195e0 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72  is constraint cr
195f0 65 61 74 65 73 20 74 68 65 20 73 61 6d 65 20 69  eates the same i
19600 6e 64 65 78 20 61 73 20 61 20 70 72 65 76 69 6f  ndex as a previo
19610 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  us.          ** 
19620 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69  constraint speci
19630 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69  fied somewhere i
19640 6e 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  n the CREATE TAB
19650 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  LE statement..  
19660 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76          ** Howev
19670 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49  er the ON CONFLI
19680 43 54 20 63 6c 61 75 73 65 73 20 61 72 65 20 64  CT clauses are d
19690 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74  ifferent. If bot
196a0 68 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  h this .        
196b0 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20    ** constraint 
196c0 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f 75 73  and the previous
196d0 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73   equivalent cons
196e0 74 72 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c  traint have expl
196f0 69 63 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a  icit.          *
19700 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  * ON CONFLICT cl
19710 61 75 73 65 73 20 74 68 69 73 20 69 73 20 61 6e  auses this is an
19720 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73   error. Otherwis
19730 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  e, use the.     
19740 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74       ** explicit
19750 6c 79 20 73 70 65 63 69 66 69 65 64 20 62 65 68  ly specified beh
19760 61 76 69 6f 72 20 66 6f 72 20 74 68 65 20 69 6e  avior for the in
19770 64 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  dex..          *
19780 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
19790 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  !(pIdx->onError=
197a0 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70  =OE_Default || p
197b0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  Index->onError==
197c0 4f 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20  OE_Default) ){. 
197d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
197e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
197f0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
19800 20 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67      "conflicting
19810 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
19820 75 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c  uses specified",
19830 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   0);.          }
19840 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
19850 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  Idx->onError==OE
19860 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  _Default ){.    
19870 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e          pIdx->on
19880 45 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e  Error = pIndex->
19890 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20  onError;.       
198a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
198b0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74         goto exit
198c0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
198d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
198e0 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
198f0 6e 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74  new Index struct
19900 75 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65  ure to its table
19910 20 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65   and to the othe
19920 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  r.  ** in-memory
19930 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
19940 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66  ures. .  */.  if
19950 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
19960 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  ){.    Index *p;
19970 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
19980 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
19990 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65  eld(db, 0, pInde
199a0 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  x->pSchema) );. 
199b0 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61     p = sqlite3Ha
199c0 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 78  shInsert(&pIndex
199d0 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
199e0 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  sh, .           
199f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
19a00 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49  Index->zName, pI
19a10 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70  ndex);.    if( p
19a20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
19a30 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20  ( p==pIndex );  
19a40 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68  /* Malloc must h
19a50 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
19a60 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
19a70 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  iled = 1;.      
19a80 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19a90 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
19aa0 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
19ab0 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
19ac0 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62  ges;.    if( pTb
19ad0 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20  lName!=0 ){.    
19ae0 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d    pIndex->tnum =
19af0 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75   db->init.newTnu
19b00 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  m;.    }.  }..  
19b10 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
19b20 65 20 69 6e 69 74 69 61 6c 20 43 52 45 41 54 45  e initial CREATE
19b30 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
19b40 20 28 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c   (or CREATE TABL
19b50 45 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e  E if the.  ** in
19b60 64 65 78 20 69 73 20 61 6e 20 69 6d 70 6c 69 65  dex is an implie
19b70 64 20 69 6e 64 65 78 20 66 6f 72 20 61 20 55 4e  d index for a UN
19b80 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20  IQUE or PRIMARY 
19b90 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  KEY constraint) 
19ba0 74 68 65 6e 0a 20 20 2a 2a 20 65 6d 69 74 20 63  then.  ** emit c
19bb0 6f 64 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ode to allocate 
19bc0 74 68 65 20 69 6e 64 65 78 20 72 6f 6f 74 70 61  the index rootpa
19bd0 67 65 20 6f 6e 20 64 69 73 6b 20 61 6e 64 20 6d  ge on disk and m
19be0 61 6b 65 20 61 6e 20 65 6e 74 72 79 20 66 6f 72  ake an entry for
19bf0 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  .  ** the index 
19c00 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  in the sqlite_ma
19c10 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70  ster table and p
19c20 6f 70 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65  opulate the inde
19c30 78 20 77 69 74 68 0a 20 20 2a 2a 20 63 6f 6e 74  x with.  ** cont
19c40 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f  ent.  But, do no
19c50 74 20 64 6f 20 74 68 69 73 20 69 66 20 77 65 20  t do this if we 
19c60 61 72 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69  are simply readi
19c70 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
19c80 73 74 65 72 0a 20 20 2a 2a 20 74 61 62 6c 65 20  ster.  ** table 
19c90 74 6f 20 70 61 72 73 65 20 74 68 65 20 73 63 68  to parse the sch
19ca0 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69 73 20  ema, or if this 
19cb0 69 6e 64 65 78 20 69 73 20 74 68 65 20 50 52 49  index is the PRI
19cc0 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20  MARY KEY index. 
19cd0 20 2a 2a 20 6f 66 20 61 20 57 49 54 48 4f 55 54   ** of a WITHOUT
19ce0 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a 20 20   ROWID table..  
19cf0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e  **.  ** If pTblN
19d00 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  ame==0 it means 
19d10 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65  this index is ge
19d20 6e 65 72 61 74 65 64 20 61 73 20 61 6e 20 69 6d  nerated as an im
19d30 70 6c 69 65 64 20 50 52 49 4d 41 52 59 20 4b 45  plied PRIMARY KE
19d40 59 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45  Y.  ** or UNIQUE
19d50 20 69 6e 64 65 78 20 69 6e 20 61 20 43 52 45 41   index in a CREA
19d60 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
19d70 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74  nt.  Since the t
19d80 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75  able.  ** has ju
19d90 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  st been created,
19da0 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   it contains no 
19db0 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64  data and the ind
19dc0 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
19dd0 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20  n.  ** step can 
19de0 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  be skipped..  */
19df0 0a 20 20 65 6c 73 65 20 69 66 28 20 70 50 61 72  .  else if( pPar
19e00 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 28  se->nErr==0 && (
19e10 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c  HasRowid(pTab) |
19e20 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30 29 20 29  | pTblName!=0) )
19e30 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  {.    Vdbe *v;. 
19e40 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a     char *zStmt;.
19e50 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b      int iMem = +
19e60 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a  +pParse->nMem;..
19e70 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
19e80 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
19e90 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67      if( v==0 ) g
19ea0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19eb0 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20  index;...    /* 
19ec0 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70  Create the rootp
19ed0 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65  age for the inde
19ee0 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  x.    */.    sql
19ef0 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
19f00 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
19f10 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  1, iDb);.    sql
19f20 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
19f30 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  , OP_CreateIndex
19f40 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20  , iDb, iMem);.. 
19f50 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65     /* Gather the
19f60 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
19f70 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  f the CREATE IND
19f80 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74  EX statement int
19f90 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74  o.    ** the zSt
19fa0 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  mt variable.    
19fb0 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  */.    if( pStar
19fc0 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t ){.      int n
19fd0 20 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d   = (int)(pParse-
19fe0 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20  >sLastToken.z - 
19ff0 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72  pName->z) + pPar
1a000 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e  se->sLastToken.n
1a010 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d  ;.      if( pNam
1a020 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29  e->z[n-1]==';' )
1a030 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a 20 41   n--;.      /* A
1a040 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74   named index wit
1a050 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52  h an explicit CR
1a060 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1a070 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ment */.      zS
1a080 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
1a090 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45  intf(db, "CREATE
1a0a0 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a  %s INDEX %.*s",.
1a0b0 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d          onError=
1a0c0 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20  =OE_None ? "" : 
1a0d0 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e  " UNIQUE", n, pN
1a0e0 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c  ame->z);.    }el
1a0f0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
1a100 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
1a110 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49  created by a PRI
1a120 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
1a130 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
1a140 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20  .      /* zStmt 
1a150 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1a160 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a  (""); */.      z
1a170 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Stmt = 0;.    }.
1a180 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65  .    /* Add an e
1a190 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d  ntry in sqlite_m
1a1a0 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69  aster for this i
1a1b0 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ndex.    */.    
1a1c0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
1a1d0 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
1a1e0 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
1a1f0 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69   %Q.%s VALUES('i
1a200 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c  ndex',%Q,%Q,#%d,
1a210 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64  %Q);",.        d
1a220 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
1a230 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
1a240 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49  iDb),.        pI
1a250 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  ndex->zName,.   
1a260 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
1a270 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a  ,.        iMem,.
1a280 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20          zStmt.  
1a290 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
1a2a0 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74  DbFree(db, zStmt
1a2b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20  );..    /* Fill 
1a2c0 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64  the index with d
1a2d0 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20  ata and reparse 
1a2e0 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65  the schema. Code
1a2f0 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20   an OP_Expire.  
1a300 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61    ** to invalida
1a310 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69  te all pre-compi
1a320 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
1a330 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1a340 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  TblName ){.     
1a350 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
1a360 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
1a370 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ex, iMem);.     
1a380 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
1a390 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
1a3a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a3b0 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
1a3c0 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20  maOp(v, iDb,.   
1a3d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
1a3e0 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27  intf(db, "name='
1a3f0 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e  %q' AND type='in
1a400 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  dex'", pIndex->z
1a410 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71  Name));.      sq
1a420 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1a430 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 29  v, OP_Expire, 0)
1a440 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1a450 2a 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e  * When adding an
1a460 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69   index to the li
1a470 73 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f  st of indices fo
1a480 72 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a  r a table, make.
1a490 20 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e    ** sure all in
1a4a0 64 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45  dices labeled OE
1a4b0 5f 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66  _Replace come af
1a4c0 74 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61  ter all those la
1a4d0 62 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67  beled.  ** OE_Ig
1a4e0 6e 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e  nore.  This is n
1a4f0 65 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65  ecessary for the
1a500 20 63 6f 72 72 65 63 74 20 63 6f 6e 73 74 72 61   correct constra
1a510 69 6e 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70  int check.  ** p
1a520 72 6f 63 65 73 73 69 6e 67 20 28 69 6e 20 73 71  rocessing (in sq
1a530 6c 69 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e  lite3GenerateCon
1a540 73 74 72 61 69 6e 74 43 68 65 63 6b 73 28 29 29  straintChecks())
1a550 20 61 73 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a   as part of.  **
1a560 20 55 50 44 41 54 45 20 61 6e 64 20 49 4e 53 45   UPDATE and INSE
1a570 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  RT statements.  
1a580 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
1a590 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62  init.busy || pTb
1a5a0 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  lName==0 ){.    
1a5b0 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  if( onError!=OE_
1a5c0 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d  Replace || pTab-
1a5d0 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20  >pIndex==0.     
1a5e0 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e      || pTab->pIn
1a5f0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45  dex->onError==OE
1a600 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20  _Replace){.     
1a610 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d   pIndex->pNext =
1a620 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
1a630 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65       pTab->pInde
1a640 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20  x = pIndex;.    
1a650 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
1a660 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61  ex *pOther = pTa
1a670 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
1a680 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e   while( pOther->
1a690 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d  pNext && pOther-
1a6a0 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21  >pNext->onError!
1a6b0 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20  =OE_Replace ){. 
1a6c0 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20         pOther = 
1a6d0 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pOther->pNext;. 
1a6e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e       }.      pIn
1a6f0 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74  dex->pNext = pOt
1a700 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  her->pNext;.    
1a710 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20    pOther->pNext 
1a720 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  = pIndex;.    }.
1a730 20 20 20 20 70 52 65 74 20 3d 20 70 49 6e 64 65      pRet = pInde
1a740 78 3b 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20  x;.    pIndex = 
1a750 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65  0;.  }..  /* Cle
1a760 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65 78 69  an up before exi
1a770 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65  ting */.exit_cre
1a780 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28  ate_index:.  if(
1a790 20 70 49 6e 64 65 78 20 29 20 66 72 65 65 49 6e   pIndex ) freeIn
1a7a0 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b  dex(db, pIndex);
1a7b0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
1a7c0 6c 65 74 65 28 64 62 2c 20 70 50 49 57 68 65 72  lete(db, pPIWher
1a7d0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  e);.  sqlite3Exp
1a7e0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
1a7f0 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
1a800 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
1a810 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  b, pTblName);.  
1a820 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1a830 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  , zName);.  retu
1a840 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pRet;.}../*.*
1a850 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78  * Fill the Index
1a860 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61  .aiRowEst[] arra
1a870 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69  y with default i
1a880 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66  nformation - inf
1a890 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  ormation.** to b
1a8a0 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68  e used when we h
1a8b0 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20  ave not run the 
1a8c0 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e  ANALYZE command.
1a8d0 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b  .**.** aiRowEst[
1a8e0 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f  0] is suppose to
1a8f0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d   contain the num
1a900 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
1a910 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a  in the index..**
1a920 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74   Since we do not
1a930 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d   know, guess 1 m
1a940 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73  illion.  aiRowEs
1a950 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[1] is an estim
1a960 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75  ate of the.** nu
1a970 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1a980 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d  the table that m
1a990 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75  atch any particu
1a9a0 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65  lar value of the
1a9b0 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e  .** first column
1a9c0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
1a9d0 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61  aiRowEst[2] is a
1a9e0 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
1a9f0 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72  e number.** of r
1aa00 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61  ows that match a
1aa10 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f  ny particular co
1aa20 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
1aa30 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73   first 2 columns
1aa40 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78  .** of the index
1aa50 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
1aa60 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73    It must always
1aa70 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
1aa80 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  t.*.**          
1aa90 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69   aiRowEst[N]<=ai
1aaa0 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20  RowEst[N-1].**  
1aab0 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
1aac0 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70  t[N]>=1.**.** Ap
1aad0 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77  art from that, w
1aae0 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f  e have little to
1aaf0 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69   go on besides i
1ab00 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a  ntuition as to.*
1ab10 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d  * how aiRowEst[]
1ab20 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
1ab30 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d  alized.  The num
1ab40 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68  bers generated h
1ab50 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64  ere.** are based
1ab60 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75   on typical valu
1ab70 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75  es found in actu
1ab80 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76  al indices..*/.v
1ab90 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75  oid sqlite3Defau
1aba0 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a  ltRowEst(Index *
1abb0 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20  pIdx){.  /*     
1abc0 20 20 20 20 20 20 20 20 20 20 20 31 30 2c 20 20             10,  
1abd0 39 2c 20 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f  9,  8,  7,  6 */
1abe0 0a 20 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d  .  LogEst aVal[]
1abf0 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c   = { 33, 32, 30,
1ac00 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67   28, 26 };.  Log
1ac10 45 73 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61  Est *a = pIdx->a
1ac20 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e  iRowLogEst;.  in
1ac30 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72  t nCopy = MIN(Ar
1ac40 72 61 79 53 69 7a 65 28 61 56 61 6c 29 2c 20 70  raySize(aVal), p
1ac50 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20  Idx->nKeyCol);. 
1ac60 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 65   int i;..  /* Se
1ac70 74 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  t the first entr
1ac80 79 20 28 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  y (number of row
1ac90 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 29 20  s in the index) 
1aca0 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  to the estimated
1acb0 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66   .  ** number of
1acc0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1acd0 6c 65 2e 20 4f 72 20 31 30 2c 20 69 66 20 74 68  le. Or 10, if th
1ace0 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62  e estimated numb
1acf0 65 72 20 6f 66 20 72 6f 77 73 20 0a 20 20 2a 2a  er of rows .  **
1ad00 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73   in the table is
1ad10 20 6c 65 73 73 20 74 68 61 6e 20 74 68 61 74 2e   less than that.
1ad20 20 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20 70 49    */.  a[0] = pI
1ad30 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77  dx->pTable->nRow
1ad40 4c 6f 67 45 73 74 3b 0a 20 20 69 66 28 20 61 5b  LogEst;.  if( a[
1ad50 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d 20 33  0]<33 ) a[0] = 3
1ad60 33 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74  3;        assert
1ad70 28 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  ( 33==sqlite3Log
1ad80 45 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a  Est(10) );..  /*
1ad90 20 45 73 74 69 6d 61 74 65 20 74 68 61 74 20 61   Estimate that a
1ada0 5b 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20  [1] is 10, a[2] 
1adb0 69 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c  is 9, a[3] is 8,
1adc0 20 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d   a[4] is 7, a[5]
1add0 20 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65   is.  ** 6 and e
1ade0 61 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 76  ach subsequent v
1adf0 61 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69 73  alue (if any) is
1ae00 20 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79   5.  */.  memcpy
1ae10 28 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43  (&a[1], aVal, nC
1ae20 6f 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73  opy*sizeof(LogEs
1ae30 74 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f  t));.  for(i=nCo
1ae40 70 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e  py+1; i<=pIdx->n
1ae50 4b 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  KeyCol; i++){.  
1ae60 20 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20    a[i] = 23;    
1ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae80 61 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69  assert( 23==sqli
1ae90 74 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a  te3LogEst(5) );.
1aea0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30    }..  assert( 0
1aeb0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
1aec0 31 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e  1) );.  if( IsUn
1aed0 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
1aee0 29 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ) a[pIdx->nKeyCo
1aef0 6c 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  l] = 0;.}../*.**
1af00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
1af10 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74  ll drop an exist
1af20 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  ing named index.
1af30 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1af40 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
1af50 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74   DROP INDEX stat
1af60 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
1af70 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28  qlite3DropIndex(
1af80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
1af90 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
1afa0 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20  nt ifExists){.  
1afb0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
1afc0 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
1afd0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1afe0 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
1aff0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1b000 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20  se->nErr==0 );  
1b010 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64   /* Never called
1b020 20 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f   with prior erro
1b030 72 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  rs */.  if( db->
1b040 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1b050 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1b060 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  op_index;.  }.  
1b070 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e  assert( pName->n
1b080 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  Src==1 );.  if( 
1b090 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
1b0a0 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61  e3ReadSchema(pPa
1b0b0 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  rse) ){.    goto
1b0c0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1b0d0 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d  ;.  }.  pIndex =
1b0e0 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65   sqlite3FindInde
1b0f0 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  x(db, pName->a[0
1b100 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
1b110 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
1b120 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30  .  if( pIndex==0
1b130 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45   ){.    if( !ifE
1b140 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73  xists ){.      s
1b150 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1b160 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
1b170 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d  index: %S", pNam
1b180 65 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  e, 0);.    }else
1b190 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  {.      sqlite3C
1b1a0 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
1b1b0 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61  hema(pParse, pNa
1b1c0 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
1b1d0 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  se);.    }.    p
1b1e0 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
1b1f0 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ma = 1;.    goto
1b200 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
1b210 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64  ;.  }.  if( pInd
1b220 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c  ex->idxType!=SQL
1b230 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
1b240 45 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EF ){.    sqlite
1b250 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1b260 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61  , "index associa
1b270 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20  ted with UNIQUE 
1b280 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d  ".      "or PRIM
1b290 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
1b2a0 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f  nt cannot be dro
1b2b0 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67  pped", 0);.    g
1b2c0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e  oto exit_drop_in
1b2d0 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  dex;.  }.  iDb =
1b2e0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
1b2f0 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
1b300 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e  ->pSchema);.#ifn
1b310 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b320 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
1b330 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d  {.    int code =
1b340 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44   SQLITE_DROP_IND
1b350 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  EX;.    Table *p
1b360 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
1b370 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  able;.    const 
1b380 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
1b390 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
1b3a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1b3b0 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
1b3c0 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66  BLE(iDb);.    if
1b3d0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1b3e0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1b3f0 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20  E_DELETE, zTab, 
1b400 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
1b410 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1b420 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
1b430 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
1b440 42 20 26 26 20 69 44 62 20 29 20 63 6f 64 65 20  B && iDb ) code 
1b450 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
1b460 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  MP_INDEX;.    if
1b470 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1b480 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
1b490 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
1b4a0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
1b4b0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1b4c0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1b4d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1b4e0 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  f..  /* Generate
1b4f0 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20   code to remove 
1b500 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72  the index and fr
1b510 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
1b520 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ble */.  v = sql
1b530 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
1b540 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
1b550 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1b560 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1b570 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a  Parse, 1, iDb);.
1b580 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
1b590 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
1b5a0 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
1b5b0 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e  OM %Q.%s WHERE n
1b5c0 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65 3d  ame=%Q AND type=
1b5d0 27 69 6e 64 65 78 27 22 2c 0a 20 20 20 20 20 20  'index'",.      
1b5e0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
1b5f0 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
1b600 45 28 69 44 62 29 2c 20 70 49 6e 64 65 78 2d 3e  E(iDb), pIndex->
1b610 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20  zName.    );.   
1b620 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61   sqlite3ClearSta
1b630 74 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20  tTables(pParse, 
1b640 69 44 62 2c 20 22 69 64 78 22 2c 20 70 49 6e 64  iDb, "idx", pInd
1b650 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ex->zName);.    
1b660 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
1b670 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
1b680 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
1b690 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
1b6a0 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  ndex->tnum, iDb)
1b6b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1b6c0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72  eAddOp4(v, OP_Dr
1b6d0 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c  opIndex, iDb, 0,
1b6e0 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d   0, pIndex->zNam
1b6f0 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  e, 0);.  }..exit
1b700 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73  _drop_index:.  s
1b710 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1b720 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ete(db, pName);.
1b730 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20  }../*.** pArray 
1b740 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1b750 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65  an array of obje
1b760 63 74 73 2e 20 45 61 63 68 20 6f 62 6a 65 63 74  cts. Each object
1b770 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79   in the.** array
1b780 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65   is szEntry byte
1b790 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73 20  s in size. This 
1b7a0 72 6f 75 74 69 6e 65 20 75 73 65 73 20 73 71 6c  routine uses sql
1b7b0 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a  ite3DbRealloc().
1b7c0 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  ** to extend the
1b7d0 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 74   array so that t
1b7e0 68 65 72 65 20 69 73 20 73 70 61 63 65 20 66 6f  here is space fo
1b7f0 72 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 20 61  r a new object a
1b800 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a  t the end..**.**
1b810 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
1b820 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a  ion is called, *
1b830 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73  pnEntry contains
1b840 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
1b850 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72 61  e of.** the arra
1b860 79 20 28 69 6e 20 65 6e 74 72 69 65 73 20 2d 20  y (in entries - 
1b870 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  so the allocatio
1b880 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74 72 79 29  n is ((*pnEntry)
1b890 20 2a 20 73 7a 45 6e 74 72 79 29 20 62 79 74 65   * szEntry) byte
1b8a0 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a  s.** in total)..
1b8b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 61  **.** If the rea
1b8c0 6c 6c 6f 63 28 29 20 69 73 20 73 75 63 63 65 73  lloc() is succes
1b8d0 73 66 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f  sful (i.e. if no
1b8e0 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f   OOM condition o
1b8f0 63 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73  ccurs), the.** s
1b900 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
1b910 6f 72 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  or the new objec
1b920 74 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e  t is zeroed, *pn
1b930 45 6e 74 72 79 20 75 70 64 61 74 65 64 20 74 6f  Entry updated to
1b940 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 65 20  .** reflect the 
1b950 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20  new size of the 
1b960 61 72 72 61 79 20 61 6e 64 20 61 20 70 6f 69 6e  array and a poin
1b970 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 61  ter to the new a
1b980 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74  llocation.** ret
1b990 75 72 6e 65 64 2e 20 2a 70 49 64 78 20 69 73 20  urned. *pIdx is 
1b9a0 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78  set to the index
1b9b0 20 6f 66 20 74 68 65 20 6e 65 77 20 61 72 72 61   of the new arra
1b9c0 79 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20  y entry in this 
1b9d0 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  case..**.** Othe
1b9e0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 72 65  rwise, if the re
1b9f0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a  alloc() fails, *
1ba00 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 2d  pIdx is set to -
1ba10 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61  1, *pnEntry rema
1ba20 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64  ins.** unchanged
1ba30 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 70   and a copy of p
1ba40 41 72 72 61 79 20 72 65 74 75 72 6e 65 64 2e 0a  Array returned..
1ba50 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
1ba60 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
1ba70 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
1ba80 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1ba90 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61   to notify of ma
1baa0 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f  lloc failures */
1bab0 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c  .  void *pArray,
1bac0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
1bad0 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74   objects.  Might
1bae0 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20   be reallocated 
1baf0 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79  */.  int szEntry
1bb00 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  ,      /* Size o
1bb10 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e  f each object in
1bb20 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20   the array */.  
1bb30 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20  int *pnEntry,   
1bb40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
1bb50 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79  bjects currently
1bb60 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74   in use */.  int
1bb70 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f   *pIdx         /
1bb80 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65  * Write the inde
1bb90 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20  x of a new slot 
1bba0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  here */.){.  cha
1bbb0 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  r *z;.  int n = 
1bbc0 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28 20  *pnEntry;.  if( 
1bbd0 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29  (n & (n-1))==0 )
1bbe0 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 28  {.    int sz = (
1bbf0 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b  n==0) ? 1 : 2*n;
1bc00 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20  .    void *pNew 
1bc10 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
1bc20 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20 73  oc(db, pArray, s
1bc30 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20  z*szEntry);.    
1bc40 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1bc50 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b       *pIdx = -1;
1bc60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41  .      return pA
1bc70 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rray;.    }.    
1bc80 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20  pArray = pNew;. 
1bc90 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29   }.  z = (char*)
1bca0 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74  pArray;.  memset
1bcb0 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d  (&z[n * szEntry]
1bcc0 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20  , 0, szEntry);. 
1bcd0 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b   *pIdx = n;.  ++
1bce0 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75  *pnEntry;.  retu
1bcf0 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a  rn pArray;.}../*
1bd00 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77  .** Append a new
1bd10 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
1bd20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43  given IdList.  C
1bd30 72 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69  reate a new IdLi
1bd40 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65  st if.** need be
1bd50 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64  ..**.** A new Id
1bd60 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
1bd70 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c  , or NULL if mal
1bd80 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
1bd90 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
1bda0 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69  dListAppend(sqli
1bdb0 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20  te3 *db, IdList 
1bdc0 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
1bdd0 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  Token){.  int i;
1bde0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
1bdf0 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
1be00 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1be10 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64  ro(db, sizeof(Id
1be20 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
1be30 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1be40 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
1be50 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72  t->a = sqlite3Ar
1be60 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
1be70 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69     db,.      pLi
1be80 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a  st->a,.      siz
1be90 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
1bea0 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e  ,.      &pList->
1beb0 6e 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20  nId,.      &i.  
1bec0 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  );.  if( i<0 ){.
1bed0 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
1bee0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
1bef0 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
1bf00 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  ;.  }.  pList->a
1bf10 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  [i].zName = sqli
1bf20 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1bf30 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
1bf40 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
1bf50 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
1bf60 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64   IdList..*/.void
1bf70 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1bf80 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
1bf90 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29  , IdList *pList)
1bfa0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1bfb0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1bfc0 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
1bfd0 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b  <pList->nId; i++
1bfe0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1bff0 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
1c000 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
1c010 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1c020 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a  (db, pList->a);.
1c030 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1c040 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
1c050 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1c060 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
1c070 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
1c080 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
1c090 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
1c0a0 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
1c0b0 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
1c0c0 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
1c0d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1c0e0 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
1c0f0 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1c100 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
1c110 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
1c120 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
1c130 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1c140 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
1c150 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
1c160 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
1c170 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
1c180 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73 70  ** Expand the sp
1c190 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
1c1a0 72 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  r the given SrcL
1c1b0 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a  ist object by.**
1c1c0 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61   creating nExtra
1c1d0 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e   new slots begin
1c1e0 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20  ning at iStart. 
1c1f0 20 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20   iStart is zero 
1c200 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c  based..** New sl
1c210 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a  ots are zeroed..
1c220 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1c230 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72 63  e, suppose a Src
1c240 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63  List initially c
1c250 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72  ontains two entr
1c260 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20  ies: A,B..** To 
1c270 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74  append 3 new ent
1c280 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e  ries onto the en
1c290 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a  d, do this:.**.*
1c2a0 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  *    sqlite3SrcL
1c2b0 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
1c2c0 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a  Srclist, 3, 2);.
1c2d0 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  **.** After the 
1c2e0 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f  call above it wo
1c2f0 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c  uld contain:  A,
1c300 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69   B, nil, nil, ni
1c310 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74  l..** If the iSt
1c320 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64  art argument had
1c330 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20   been 1 instead 
1c340 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72  of 2, then the r
1c350 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68  esult.** would h
1c360 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69  ave been:  A, ni
1c370 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20  l, nil, nil, B. 
1c380 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20   To prepend the 
1c390 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68  new slots,.** th
1c3a0 65 20 69 53 74 61 72 74 20 76 61 6c 75 65 20 77  e iStart value w
1c3b0 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20  ould be 0.  The 
1c3c0 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c  result then woul
1c3d0 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69  d.** be: nil, ni
1c3e0 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a  l, nil, A, B..**
1c3f0 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
1c400 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73  allocation fails
1c410 20 74 68 65 20 53 72 63 4c 69 73 74 20 69 73 20   the SrcList is 
1c420 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 65 0a  unchanged.  The.
1c430 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ** db->mallocFai
1c440 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20 62 65  led flag will be
1c450 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f   set to true..*/
1c460 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
1c470 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
1c480 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1c490 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
1c4a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
1c4b0 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72  notify of OOM er
1c4c0 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73  rors */.  SrcLis
1c4d0 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  t *pSrc,     /* 
1c4e0 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62  The SrcList to b
1c4f0 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20  e enlarged */.  
1c500 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
1c510 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1c520 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64  new slots to add
1c530 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f   to pSrc->a[] */
1c540 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20 20 20  .  int iStart   
1c550 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
1c560 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66  n pSrc->a[] of f
1c570 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f  irst new slot */
1c580 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
1c590 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69  /* Sanity checki
1c5a0 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61  ng on calling pa
1c5b0 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73  rameters */.  as
1c5c0 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20  sert( iStart>=0 
1c5d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78  );.  assert( nEx
1c5e0 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  tra>=1 );.  asse
1c5f0 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
1c600 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
1c610 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a  =pSrc->nSrc );..
1c620 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64    /* Allocate ad
1c630 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69  ditional space i
1c640 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66  f needed */.  if
1c650 28 20 28 75 33 32 29 70 53 72 63 2d 3e 6e 53 72  ( (u32)pSrc->nSr
1c660 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e  c+nExtra>pSrc->n
1c670 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63  Alloc ){.    Src
1c680 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
1c690 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72  int nAlloc = pSr
1c6a0 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a  c->nSrc+nExtra;.
1c6b0 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20      int nGot;.  
1c6c0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
1c6d0 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53  DbRealloc(db, pS
1c6e0 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rc,.            
1c6f0 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29     sizeof(*pSrc)
1c700 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69   + (nAlloc-1)*si
1c710 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29  zeof(pSrc->a[0])
1c720 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77   );.    if( pNew
1c730 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
1c740 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
1c750 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
1c760 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20  eturn pSrc;.    
1c770 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65  }.    pSrc = pNe
1c780 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73  w;.    nGot = (s
1c790 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69  qlite3DbMallocSi
1c7a0 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73  ze(db, pNew) - s
1c7b0 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69  izeof(*pSrc))/si
1c7c0 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29  zeof(pSrc->a[0])
1c7d0 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41  +1;.    pSrc->nA
1c7e0 6c 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a 20 20 7d  lloc = nGot;.  }
1c7f0 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73  ..  /* Move exis
1c800 74 69 6e 67 20 73 6c 6f 74 73 20 74 68 61 74 20  ting slots that 
1c810 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65 20 6e  come after the n
1c820 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20 73 6c  ewly inserted sl
1c830 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20  ots.  ** out of 
1c840 74 68 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72  the way */.  for
1c850 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b  (i=pSrc->nSrc-1;
1c860 20 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29   i>=iStart; i--)
1c870 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b  {.    pSrc->a[i+
1c880 6e 45 78 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e  nExtra] = pSrc->
1c890 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63  a[i];.  }.  pSrc
1c8a0 2d 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74 72 61  ->nSrc += nExtra
1c8b0 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65  ;..  /* Zero the
1c8c0 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   newly allocated
1c8d0 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73   slots */.  mems
1c8e0 65 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61  et(&pSrc->a[iSta
1c8f0 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  rt], 0, sizeof(p
1c900 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72  Src->a[0])*nExtr
1c910 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61  a);.  for(i=iSta
1c920 72 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78  rt; i<iStart+nEx
1c930 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  tra; i++){.    p
1c940 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
1c950 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f  r = -1;.  }..  /
1c960 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1c970 65 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67  er to the enlarg
1c980 65 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  ed SrcList */.  
1c990 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a  return pSrc;.}..
1c9a0 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
1c9b0 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  new table name t
1c9c0 6f 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c  o the given SrcL
1c9d0 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e  ist.  Create a n
1c9e0 65 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a  ew SrcList if.**
1c9f0 20 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77   need be.  A new
1ca00 20 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65   entry is create
1ca10 64 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74  d in the SrcList
1ca20 20 65 76 65 6e 20 69 66 20 70 54 61 62 6c 65 20   even if pTable 
1ca30 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41  is NULL..**.** A
1ca40 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75   SrcList is retu
1ca50 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
1ca60 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d   there is an OOM
1ca70 20 65 72 72 6f 72 2e 20 20 54 68 65 20 72 65 74   error.  The ret
1ca80 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74  urned.** SrcList
1ca90 20 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61   might be the sa
1caa0 6d 65 20 61 73 20 74 68 65 20 53 72 63 4c 69 73  me as the SrcLis
1cab0 74 20 74 68 61 74 20 77 61 73 20 69 6e 70 75 74  t that was input
1cac0 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a   or it might be.
1cad0 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49  ** a new one.  I
1cae0 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64  f an OOM error d
1caf0 6f 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  oes occurs, then
1cb00 20 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65   the prior value
1cb10 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61   of pList.** tha
1cb20 74 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68  t is input to th
1cb30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75  is routine is au
1cb40 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65  tomatically free
1cb50 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74  d..**.** If pDat
1cb60 61 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c  abase is not nul
1cb70 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  l, it means that
1cb80 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
1cb90 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61  n optional.** da
1cba0 74 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66  tabase name pref
1cbb0 69 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20  ix.  Like this: 
1cbc0 20 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65   "database.table
1cbd0 22 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73  ".  The pDatabas
1cbe0 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  e.** points to t
1cbf0 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
1cc00 64 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69  d the pTable poi
1cc10 6e 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  nts to the datab
1cc20 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65  ase name..** The
1cc30 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61   SrcList.a[].zNa
1cc40 6d 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c  me field is fill
1cc50 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
1cc60 65 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67  e name which mig
1cc70 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20  ht.** come from 
1cc80 70 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61  pTable (if pData
1cc90 62 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72  base is NULL) or
1cca0 20 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e   from pDatabase.
1ccb0 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b    .** SrcList.a[
1ccc0 5d 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66  ].zDatabase is f
1ccd0 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64  illed with the d
1cce0 61 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f  atabase name fro
1ccf0 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20  m pTable,.** or 
1cd00 77 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20  with NULL if no 
1cd10 64 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63  database is spec
1cd20 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ified..**.** In 
1cd30 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
1cd40 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  call like this:.
1cd50 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
1cd60 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1cd70 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a  nd(D,A,B,0);.**.
1cd80 2a 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74  ** Then B is a t
1cd90 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
1cda0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
1cdb0 69 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20  is unspecified. 
1cdc0 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69   If called.** li
1cdd0 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1cde0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1cdf0 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
1ce00 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,C);.**.** Then
1ce10 20 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20   C is the table 
1ce20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68  name and B is th
1ce30 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
1ce40 20 20 49 66 20 43 20 69 73 20 64 65 66 69 6e 65    If C is define
1ce50 64 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73 20  d.** then so is 
1ce60 42 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  B.  In other wor
1ce70 64 73 2c 20 77 65 20 6e 65 76 65 72 20 68 61 76  ds, we never hav
1ce80 65 20 61 20 63 61 73 65 20 77 68 65 72 65 3a 0a  e a case where:.
1ce90 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
1cea0 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
1ceb0 6e 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a  nd(D,A,0,C);.**.
1cec0 2a 2a 20 42 6f 74 68 20 70 54 61 62 6c 65 20 61  ** Both pTable a
1ced0 6e 64 20 70 44 61 74 61 62 61 73 65 20 61 72 65  nd pDatabase are
1cee0 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 71   assumed to be q
1cef0 75 6f 74 65 64 2e 20 20 54 68 65 79 20 61 72 65  uoted.  They are
1cf00 20 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66   dequoted.** bef
1cf10 6f 72 65 20 62 65 69 6e 67 20 61 64 64 65 64 20  ore being added 
1cf20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 2e 0a  to the SrcList..
1cf30 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
1cf40 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1cf50 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
1cf60 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
1cf70 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
1cf80 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  of malloc failur
1cf90 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  es */.  SrcList 
1cfa0 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41  *pList,     /* A
1cfb0 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72  ppend to this Sr
1cfc0 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61  cList. NULL crea
1cfd0 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73  tes a new SrcLis
1cfe0 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  t */.  Token *pT
1cff0 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61  able,      /* Ta
1d000 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  ble to append */
1d010 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  .  Token *pDatab
1d020 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ase    /* Databa
1d030 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  se of the table 
1d040 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
1d050 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1d060 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44  em;.  assert( pD
1d070 61 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54  atabase==0 || pT
1d080 61 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43  able!=0 );  /* C
1d090 61 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74  annot have C wit
1d0a0 68 6f 75 74 20 42 20 2a 2f 0a 20 20 69 66 28 20  hout B */.  if( 
1d0b0 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
1d0c0 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
1d0d0 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
1d0e0 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20  sizeof(SrcList) 
1d0f0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
1d100 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1d110 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
1d120 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 69  c = 1;.  }.  pLi
1d130 73 74 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  st = sqlite3SrcL
1d140 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70  istEnlarge(db, p
1d150 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e  List, 1, pList->
1d160 6e 53 72 63 29 3b 0a 20 20 69 66 28 20 64 62 2d  nSrc);.  if( db-
1d170 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
1d180 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c  .    sqlite3SrcL
1d190 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
1d1a0 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ist);.    return
1d1b0 20 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20   0;.  }.  pItem 
1d1c0 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73  = &pList->a[pLis
1d1d0 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66  t->nSrc-1];.  if
1d1e0 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70  ( pDatabase && p
1d1f0 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29  Database->z==0 )
1d200 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  {.    pDatabase 
1d210 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
1d220 44 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20  Database ){.    
1d230 54 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70  Token *pTemp = p
1d240 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44  Database;.    pD
1d250 61 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65  atabase = pTable
1d260 3b 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70  ;.    pTable = p
1d270 54 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65  Temp;.  }.  pIte
1d280 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
1d290 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1d2a0 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 70  db, pTable);.  p
1d2b0 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
1d2c0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1d2d0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61  mToken(db, pData
1d2e0 62 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  base);.  return 
1d2f0 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
1d300 41 73 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f  Assign VdbeCurso
1d310 72 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20  r index numbers 
1d320 74 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  to all tables in
1d330 20 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f   a SrcList.*/.vo
1d340 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1d350 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50  tAssignCursors(P
1d360 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1d370 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
1d380 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
1d390 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1d3a0 49 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70  Item;.  assert(p
1d3b0 4c 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e  List || pParse->
1d3c0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1d3d0 20 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   );.  if( pList 
1d3e0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  ){.    for(i=0, 
1d3f0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20  pItem=pList->a; 
1d400 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  i<pList->nSrc; i
1d410 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
1d420 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69      if( pItem->i
1d430 43 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61  Cursor>=0 ) brea
1d440 6b 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  k;.      pItem->
1d450 69 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65  iCursor = pParse
1d460 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  ->nTab++;.      
1d470 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
1d480 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
1d490 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
1d4a0 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
1d4b0 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
1d4c0 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d  ->pSrc);.      }
1d4d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1d4e0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e  .** Delete an en
1d4f0 74 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63  tire SrcList inc
1d500 6c 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73  luding all its s
1d510 75 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  ubstructure..*/.
1d520 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
1d530 69 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65  istDelete(sqlite
1d540 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a  3 *db, SrcList *
1d550 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1d560 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1d570 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1d580 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1d590 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49  return;.  for(pI
1d5a0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d  tem=pList->a, i=
1d5b0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63  0; i<pList->nSrc
1d5c0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1d5d0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1d5e0 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44  ee(db, pItem->zD
1d5f0 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71  atabase);.    sq
1d600 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1d610 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
1d620 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1d630 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  (db, pItem->zAli
1d640 61 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  as);.    sqlite3
1d650 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
1d660 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20 73  ->zIndex);.    s
1d670 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
1d680 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61  e(db, pItem->pTa
1d690 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  b);.    sqlite3S
1d6a0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
1d6b0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pItem->pSelect);
1d6c0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
1d6d0 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
1d6e0 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ->pOn);.    sqli
1d6f0 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
1d700 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e  db, pItem->pUsin
1d710 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
1d720 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
1d730 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
1d740 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1d750 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
1d760 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74  r to add a new t
1d770 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  erm to the.** en
1d780 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46  d of a growing F
1d790 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ROM clause.  The
1d7a0 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
1d7b0 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a  s the part of.**
1d7c0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1d7d0 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
1d7e0 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74  y been construct
1d7f0 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c  ed.  "p" is NULL
1d800 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74  .** if this is t
1d810 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66  he first term of
1d820 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1d830 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  .  pTable and pD
1d840 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74  atabase.** are t
1d850 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
1d860 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73  able and databas
1d870 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
1d880 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ROM clause term.
1d890 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73  .** pDatabase is
1d8a0 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74   NULL if the dat
1d8b0 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69  abase name quali
1d8c0 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20  fier is missing 
1d8d0 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63  - the.** usual c
1d8e0 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72  ase.  If the ter
1d8f0 6d 20 68 61 73 20 61 20 61 6c 69 61 73 2c 20 74  m has a alias, t
1d900 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74  hen pAlias point
1d910 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61  s to the.** alia
1d920 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65  s token.  If the
1d930 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71 75   term is a subqu
1d940 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75  ery, then pSubqu
1d950 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45  ery is the.** SE
1d960 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
1d970 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79  hat the subquery
1d980 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70   encodes.  The p
1d990 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61  Table and.** pDa
1d9a0 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72  tabase parameter
1d9b0 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73  s are NULL for s
1d9c0 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20  ubqueries.  The 
1d9d0 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a  pOn and pUsing.*
1d9e0 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  * parameters are
1d9f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1da00 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
1da10 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
1da20 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63  Return a new Src
1da30 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64  List which encod
1da40 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77  es is the FROM w
1da50 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74  ith the new.** t
1da60 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72  erm added..*/.Sr
1da70 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
1da80 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
1da90 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
1daa0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
1dab0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1dac0 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
1dad0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1dae0 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74 20  * The left part 
1daf0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1db00 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20  se already seen 
1db10 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
1db20 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
1db30 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
1db40 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  e to add to the 
1db50 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
1db60 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
1db70 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  e,       /* Name
1db80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1db90 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62   containing pTab
1dba0 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
1dbb0 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20 20  Alias,          
1dbc0 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  /* The right-han
1dbd0 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41 53  d side of the AS
1dbe0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a   subexpression *
1dbf0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
1dc00 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41  query,      /* A
1dc10 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20 69   subquery used i
1dc20 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62  n place of a tab
1dc30 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70  le name */.  Exp
1dc40 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20  r *pOn,         
1dc50 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63       /* The ON c
1dc60 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
1dc70 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73  */.  IdList *pUs
1dc80 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ing          /* 
1dc90 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  The USING clause
1dca0 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b   of a join */.){
1dcb0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1dcc0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1dcd0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1dce0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
1dcf0 20 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70   !p && (pOn || p
1dd00 55 73 69 6e 67 29 20 29 7b 0a 20 20 20 20 73 71  Using) ){.    sq
1dd10 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1dd20 61 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c  arse, "a JOIN cl
1dd30 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64  ause is required
1dd40 20 62 65 66 6f 72 65 20 25 73 22 2c 20 0a 20 20   before %s", .  
1dd50 20 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20      (pOn ? "ON" 
1dd60 3a 20 22 55 53 49 4e 47 22 29 0a 20 20 20 20 29  : "USING").    )
1dd70 3b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e  ;.    goto appen
1dd80 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20  d_from_error;.  
1dd90 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53  }.  p = sqlite3S
1dda0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
1ddb0 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74   p, pTable, pDat
1ddc0 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  abase);.  if( p=
1ddd0 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e  =0 || NEVER(p->n
1dde0 53 72 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 67  Src==0) ){.    g
1ddf0 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f  oto append_from_
1de00 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 49 74  error;.  }.  pIt
1de10 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53  em = &p->a[p->nS
1de20 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  rc-1];.  assert(
1de30 20 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20   pAlias!=0 );.  
1de40 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b  if( pAlias->n ){
1de50 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  .    pItem->zAli
1de60 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  as = sqlite3Name
1de70 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41  FromToken(db, pA
1de80 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74  lias);.  }.  pIt
1de90 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53  em->pSelect = pS
1dea0 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d  ubquery;.  pItem
1deb0 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70  ->pOn = pOn;.  p
1dec0 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70  Item->pUsing = p
1ded0 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20  Using;.  return 
1dee0 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d  p;.. append_from
1def0 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74  _error:.  assert
1df00 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( p==0 );.  sqli
1df10 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1df20 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65  , pOn);.  sqlite
1df30 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
1df40 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c  , pUsing);.  sql
1df50 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1df60 28 64 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b  (db, pSubquery);
1df70 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1df80 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44  /*.** Add an IND
1df90 45 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49  EXED BY or NOT I
1dfa0 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f  NDEXED clause to
1dfb0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
1dfc0 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65  ly added .** ele
1dfd0 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72  ment of the sour
1dfe0 63 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61  ce-list passed a
1dff0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
1e000 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
1e010 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64  qlite3SrcListInd
1e020 65 78 65 64 42 79 28 50 61 72 73 65 20 2a 70 50  exedBy(Parse *pP
1e030 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
1e040 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65  , Token *pIndexe
1e050 64 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20  dBy){.  assert( 
1e060 70 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b  pIndexedBy!=0 );
1e070 0a 20 20 69 66 28 20 70 20 26 26 20 41 4c 57 41  .  if( p && ALWA
1e080 59 53 28 70 2d 3e 6e 53 72 63 3e 30 29 20 29 7b  YS(p->nSrc>0) ){
1e090 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
1e0a0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
1e0b0 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
1e0c0 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
1e0d0 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65  pItem->notIndexe
1e0e0 64 3d 3d 30 20 26 26 20 70 49 74 65 6d 2d 3e 7a  d==0 && pItem->z
1e0f0 49 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Index==0 );.    
1e100 69 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d 3e  if( pIndexedBy->
1e110 6e 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78 65  n==1 && !pIndexe
1e120 64 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20  dBy->z ){.      
1e130 2f 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58 45  /* A "NOT INDEXE
1e140 44 22 20 63 6c 61 75 73 65 20 77 61 73 20 73 75  D" clause was su
1e150 70 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72 73  pplied. See pars
1e160 65 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  e.y .      ** co
1e170 6e 73 74 72 75 63 74 20 22 69 6e 64 65 78 65 64  nstruct "indexed
1e180 5f 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69 6c  _opt" for detail
1e190 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65  s. */.      pIte
1e1a0 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20  m->notIndexed = 
1e1b0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1e1c0 20 20 20 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65      pItem->zInde
1e1d0 78 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  x = sqlite3NameF
1e1e0 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d  romToken(pParse-
1e1f0 3e 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29  >db, pIndexedBy)
1e200 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1e210 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69  *.** When buildi
1e220 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61  ng up a FROM cla
1e230 75 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65  use in the parse
1e240 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  r, the join oper
1e250 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69  ator.** is initi
1e260 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f  ally attached to
1e270 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
1e280 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65  d.  But the code
1e290 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78   generator.** ex
1e2a0 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f  pects the join o
1e2b0 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e  perator to be on
1e2c0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
1e2d0 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
1e2e0 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20  e.** Shifts all 
1e2f0 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66  join operators f
1e300 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68  rom left to righ
1e310 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20  t for an entire 
1e320 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a  FROM.** clause..
1e330 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53  **.** Example: S
1e340 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20  uppose the join 
1e350 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  is like this:.**
1e360 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20  .**           A 
1e370 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f  natural cross jo
1e380 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  in B.**.** The o
1e390 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75  perator is "natu
1e3a0 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e  ral cross join".
1e3b0 20 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70    The A and B op
1e3c0 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65  erands are store
1e3d0 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20  d.** in p->a[0] 
1e3e0 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73  and p->a[1], res
1e3f0 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20  pectively.  The 
1e400 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79  parser initially
1e410 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f   stores the.** o
1e420 70 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20  perator with A. 
1e430 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
1e440 69 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74  ifts that operat
1e450 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f  or over to B..*/
1e460 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63  .void sqlite3Src
1e470 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70  ListShiftJoinTyp
1e480 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20  e(SrcList *p){. 
1e490 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
1e4a0 74 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28  t i;.    assert(
1e4b0 20 70 2d 3e 61 20 7c 7c 20 70 2d 3e 6e 53 72 63   p->a || p->nSrc
1e4c0 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ==0 );.    for(i
1e4d0 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b  =p->nSrc-1; i>0;
1e4e0 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i--){.      p->
1e4f0 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  a[i].jointype = 
1e500 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79  p->a[i-1].jointy
1e510 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  pe;.    }.    p-
1e520 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  >a[0].jointype =
1e530 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1e540 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63   Begin a transac
1e550 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
1e560 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63  ite3BeginTransac
1e570 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
1e580 73 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20  se, int type){. 
1e590 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1e5a0 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69  Vdbe *v;.  int i
1e5b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1e5c0 72 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d  rse!=0 );.  db =
1e5d0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61   pParse->db;.  a
1e5e0 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
1e5f0 2f 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  /*  if( db->aDb[
1e600 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
1e610 72 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  rn; */.  if( sql
1e620 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1e630 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41  arse, SQLITE_TRA
1e640 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e  NSACTION, "BEGIN
1e650 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  ", 0, 0) ){.    
1e660 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20  return;.  }.  v 
1e670 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
1e680 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
1e690 21 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  !v ) return;.  i
1e6a0 66 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45  f( type!=TK_DEFE
1e6b0 52 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28  RRED ){.    for(
1e6c0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
1e6d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
1e6e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1e6f0 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c   OP_Transaction,
1e700 20 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58   i, (type==TK_EX
1e710 43 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20  CLUSIVE)+1);.   
1e720 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
1e730 65 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20  esBtree(v, i);. 
1e740 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1e750 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e760 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30  OP_AutoCommit, 0
1e770 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  , 0);.}../*.** C
1e780 6f 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74  ommit a transact
1e790 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
1e7a0 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63  te3CommitTransac
1e7b0 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72  tion(Parse *pPar
1e7c0 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  se){.  Vdbe *v;.
1e7d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1e7e0 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
1e7f0 28 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20  ( pParse->db!=0 
1e800 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1e810 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1e820 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
1e830 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  TION, "COMMIT", 
1e840 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  0, 0) ){.    ret
1e850 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73  urn;.  }.  v = s
1e860 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1e870 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
1e880 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1e890 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
1e8a0 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b  toCommit, 1, 0);
1e8b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  .  }.}../*.** Ro
1e8c0 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1e8d0 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
1e8e0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  ite3RollbackTran
1e8f0 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
1e900 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a  Parse){.  Vdbe *
1e910 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  v;..  assert( pP
1e920 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  arse!=0 );.  ass
1e930 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21  ert( pParse->db!
1e940 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  =0 );.  if( sqli
1e950 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1e960 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
1e970 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41  SACTION, "ROLLBA
1e980 43 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  CK", 0, 0) ){.  
1e990 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1e9a0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1e9b0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1e9c0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1e9d0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e9e0 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
1e9f0 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
1ea00 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1ea10 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1ea20 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74  e parser when it
1ea30 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e   parses a comman
1ea40 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20  d to create,.** 
1ea50 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
1ea60 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70  ack an SQL savep
1ea70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  oint. .*/.void s
1ea80 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28  qlite3Savepoint(
1ea90 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1eaa0 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e  nt op, Token *pN
1eab0 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
1eac0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
1ead0 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
1eae0 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  e->db, pName);. 
1eaf0 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
1eb00 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
1eb10 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1eb20 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
1eb30 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
1eb40 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63  ATION.    static
1eb50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f   const char * co
1eb60 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 45  nst az[] = { "BE
1eb70 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c  GIN", "RELEASE",
1eb80 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20   "ROLLBACK" };. 
1eb90 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56 45     assert( !SAVE
1eba0 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53  POINT_BEGIN && S
1ebb0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
1ebc0 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54  ==1 && SAVEPOINT
1ebd0 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a  _ROLLBACK==2 );.
1ebe0 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21  #endif.    if( !
1ebf0 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68  v || sqlite3Auth
1ec00 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1ec10 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20  LITE_SAVEPOINT, 
1ec20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30  az[op], zName, 0
1ec30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1ec40 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
1ec50 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
1ec60 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
1ec70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1ec80 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76  AddOp4(v, OP_Sav
1ec90 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30  epoint, op, 0, 0
1eca0 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41  , zName, P4_DYNA
1ecb0 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  MIC);.  }.}../*.
1ecc0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
1ecd0 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 69   TEMP database i
1ece0 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c  s open and avail
1ecf0 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52  able for use.  R
1ed00 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
1ed10 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
1ed20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
1ed30 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 20  messages in the 
1ed40 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65  pParse structure
1ed50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ed60 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
1ed70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
1ed80 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1ed90 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1eda0 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  f( db->aDb[1].pB
1edb0 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d  t==0 && !pParse-
1edc0 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  >explain ){.    
1edd0 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 65  int rc;.    Btre
1ede0 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 74  e *pBt;.    stat
1edf0 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61  ic const int fla
1ee00 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  gs = .          
1ee10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1ee20 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20  WRITE |.        
1ee30 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52    SQLITE_OPEN_CR
1ee40 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20  EATE |.         
1ee50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
1ee60 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20  LUSIVE |.       
1ee70 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44     SQLITE_OPEN_D
1ee80 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
1ee90 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1eea0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20  OPEN_TEMP_DB;.. 
1eeb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1eec0 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66  treeOpen(db->pVf
1eed0 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c 20  s, 0, db, &pBt, 
1eee0 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69  0, flags);.    i
1eef0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ef00 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ef10 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1ef20 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65  , "unable to ope
1ef30 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61  n a temporary da
1ef40 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 20  tabase ".       
1ef50 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69   "file for stori
1ef60 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ng temporary tab
1ef70 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61  les");.      pPa
1ef80 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20  rse->rc = rc;.  
1ef90 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1efa0 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 5b    }.    db->aDb[
1efb0 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  1].pBt = pBt;.  
1efc0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
1efd0 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
1efe0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4e      if( SQLITE_N
1eff0 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 72  OMEM==sqlite3Btr
1f000 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 42  eeSetPageSize(pB
1f010 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  t, db->nextPages
1f020 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a 20  ize, -1, 0) ){. 
1f030 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
1f040 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
1f050 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1f060 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1f070 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  .}../*.** Record
1f080 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
1f090 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
1f0a0 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
1f0b0 20 76 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72   verified.** for
1f0c0 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 20   database iDb.  
1f0d0 54 68 65 20 63 6f 64 65 20 74 6f 20 61 63 74 75  The code to actu
1f0e0 61 6c 6c 79 20 76 65 72 69 66 79 20 74 68 65 20  ally verify the 
1f0f0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a  schema cookie.**
1f100 20 77 69 6c 6c 20 6f 63 63 75 72 20 61 74 20 74   will occur at t
1f110 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 6f  he end of the to
1f120 70 2d 6c 65 76 65 6c 20 56 44 42 45 20 61 6e 64  p-level VDBE and
1f130 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74   will be generat
1f140 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20  ed.** later, by 
1f150 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64  sqlite3FinishCod
1f160 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ing()..*/.void s
1f170 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1f180 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50  Schema(Parse *pP
1f190 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
1f1a0 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
1f1b0 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
1f1c0 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
1f1d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  );.  sqlite3 *db
1f1e0 20 3d 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 64 62   = pToplevel->db
1f1f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 62  ;..  assert( iDb
1f200 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e  >=0 && iDb<db->n
1f210 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Db );.  assert( 
1f220 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
1f230 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b  !=0 || iDb==1 );
1f240 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 53  .  assert( iDb<S
1f250 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
1f260 45 44 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 74  ED+2 );.  assert
1f270 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
1f280 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
1f290 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 44 62  , 0) );.  if( Db
1f2a0 4d 61 73 6b 54 65 73 74 28 70 54 6f 70 6c 65 76  MaskTest(pToplev
1f2b0 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20  el->cookieMask, 
1f2c0 69 44 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44  iDb)==0 ){.    D
1f2d0 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76  bMaskSet(pToplev
1f2e0 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20  el->cookieMask, 
1f2f0 69 44 62 29 3b 0a 20 20 20 20 70 54 6f 70 6c 65  iDb);.    pTople
1f300 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  vel->cookieValue
1f310 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  [iDb] = db->aDb[
1f320 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63  iDb].pSchema->sc
1f330 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20  hema_cookie;.   
1f340 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
1f350 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
1f360 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e       sqlite3Open
1f370 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 54 6f  TempDatabase(pTo
1f380 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  plevel);.    }. 
1f390 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61   }.}../*.** If a
1f3a0 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 20 4e  rgument zDb is N
1f3b0 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c 20 73  ULL, then call s
1f3c0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1f3d0 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65 61 63  Schema() for eac
1f3e0 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64  h .** attached d
1f3f0 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72 77 69  atabase. Otherwi
1f400 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 66 6f  se, invoke it fo
1f410 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  r the database n
1f420 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a  amed zDb only..*
1f430 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
1f440 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
1f450 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73  ema(Parse *pPars
1f460 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
1f470 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Db){.  sqlite3 *
1f480 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1f490 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
1f4a0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
1f4b0 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44  i++){.    Db *pD
1f4c0 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
1f4d0 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
1f4e0 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 30 3d  t && (!zDb || 0=
1f4f0 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
1f500 7a 44 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29  zDb, pDb->zName)
1f510 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1f520 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
1f530 6d 61 28 70 50 61 72 73 65 2c 20 69 29 3b 0a 20  ma(pParse, i);. 
1f540 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1f550 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42 45 20  * Generate VDBE 
1f560 63 6f 64 65 20 74 68 61 74 20 70 72 65 70 61 72  code that prepar
1f570 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61 6e 20  es for doing an 
1f580 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 0a 2a  operation that.*
1f590 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74  * might change t
1f5a0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  he database..**.
1f5b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1f5c0 73 74 61 72 74 73 20 61 20 6e 65 77 20 74 72 61  starts a new tra
1f5d0 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65 20 61  nsaction if we a
1f5e0 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 77  re not already w
1f5f0 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61 6e 73  ithin.** a trans
1f600 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65 20 61  action.  If we a
1f610 72 65 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  re already withi
1f620 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
1f630 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70 6f 69   then a checkpoi
1f640 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69 66 20  nt.** is set if 
1f650 74 68 65 20 73 65 74 53 74 61 74 65 6d 65 6e 74  the setStatement
1f660 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72   parameter is tr
1f670 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f 69 6e  ue.  A checkpoin
1f680 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 73  t should.** be s
1f690 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69 6f 6e  et for operation
1f6a0 73 20 74 68 61 74 20 6d 69 67 68 74 20 66 61 69  s that might fai
1f6b0 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f 6e 73  l (due to a cons
1f6c0 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f 66 0a  traint) part of.
1f6d0 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72 6f 75  ** the way throu
1f6e0 67 68 20 61 6e 64 20 77 68 69 63 68 20 77 69 6c  gh and which wil
1f6f0 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f 20 73  l need to undo s
1f700 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74 68 6f  ome writes witho
1f710 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a 2a 20  ut having to.** 
1f720 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77 68 6f  rollback the who
1f730 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  le transaction. 
1f740 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20   For operations 
1f750 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73 74 72  where all constr
1f760 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20  aints.** can be 
1f770 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65 20 61  checked before a
1f780 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  ny changes are m
1f790 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ade to the datab
1f7a0 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76 65 72  ase, it is never
1f7b0 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f  .** necessary to
1f7c0 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20 61 6e   undo a write an
1f7d0 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  d the checkpoint
1f7e0 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 73   should not be s
1f7f0 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  et..*/.void sqli
1f800 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
1f810 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  ration(Parse *pP
1f820 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53 74 61  arse, int setSta
1f830 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44 62 29  tement, int iDb)
1f840 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c  {.  Parse *pTopl
1f850 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61  evel = sqlite3Pa
1f860 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72  rseToplevel(pPar
1f870 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  se);.  sqlite3Co
1f880 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
1f890 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 44  Parse, iDb);.  D
1f8a0 62 4d 61 73 6b 53 65 74 28 70 54 6f 70 6c 65 76  bMaskSet(pToplev
1f8b0 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 2c 20 69  el->writeMask, i
1f8c0 44 62 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c  Db);.  pToplevel
1f8d0 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 7c  ->isMultiWrite |
1f8e0 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b 0a  = setStatement;.
1f8f0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  }../*.** Indicat
1f900 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65  e that the state
1f910 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 75  ment currently u
1f920 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
1f930 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a 2a  n might write.**
1f940 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 65   more than one e
1f950 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20 64  ntry (example: d
1f960 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77 20  eleting one row 
1f970 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 61  then inserting a
1f980 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65 72  nother,.** inser
1f990 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ting multiple ro
1f9a0 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20 6f  ws in a table, o
1f9b0 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72 6f  r inserting a ro
1f9c0 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72  w and index entr
1f9d0 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20 61  ies.).** If an a
1f9e0 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74 65  bort occurs afte
1f9f0 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65 20  r some of these 
1fa00 77 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d 70  writes have comp
1fa10 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20 77  leted, then it w
1fa20 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73  ill.** be necess
1fa30 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65 20  ary to undo the 
1fa40 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65 73  completed writes
1fa50 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1fa60 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72 73  3MultiWrite(Pars
1fa70 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 61  e *pParse){.  Pa
1fa80 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
1fa90 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
1faa0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
1fab0 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75   pToplevel->isMu
1fac0 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d 0a  ltiWrite = 1;.}.
1fad0 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64 65  ./* .** The code
1fae0 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c 73   generator calls
1faf0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 66   this routine if
1fb00 20 69 73 20 64 69 73 63 6f 76 65 72 73 20 74 68   is discovers th
1fb10 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73  at it is.** poss
1fb20 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61 20  ible to abort a 
1fb30 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72 20  statement prior 
1fb40 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20  to completion.  
1fb50 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a 20  In order to .** 
1fb60 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62 6f  perform this abo
1fb70 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72 75  rt without corru
1fb80 70 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  pting the databa
1fb90 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6d  se, we need to m
1fba0 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61 74  ake.** sure that
1fbb0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
1fbc0 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 61  s protected by a
1fbd0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
1fbe0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65  action..**.** Te
1fbf0 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f 6e  chnically, we on
1fc00 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20 74  ly need to set t
1fc10 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61 67  he mayAbort flag
1fc20 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75 6c   if the.** isMul
1fc30 74 69 57 72 69 74 65 20 66 6c 61 67 20 77 61 73  tiWrite flag was
1fc40 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 2e   previously set.
1fc50 20 20 54 68 65 72 65 20 69 73 20 61 20 74 69 6d    There is a tim
1fc60 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20  e dependency.** 
1fc70 73 75 63 68 20 74 68 61 74 20 74 68 65 20 61 62  such that the ab
1fc80 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20 61  ort must occur a
1fc90 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77 72  fter the multiwr
1fca0 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73  ite.  This makes
1fcb0 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d 65  .** some stateme
1fcc0 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74 68  nts involving th
1fcd0 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c 69  e REPLACE confli
1fce0 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
1fcf0 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61 20  gorithm.** go a 
1fd00 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20 20  little faster.  
1fd10 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61 6e  But taking advan
1fd20 74 61 67 65 20 6f 66 20 74 68 69 73 20 74 69 6d  tage of this tim
1fd30 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a 20  e dependency.** 
1fd40 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64 69  makes it more di
1fd50 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76 65  fficult to prove
1fd60 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 69   that the code i
1fd70 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a 2a  s correct (in .*
1fd80 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69 74  * particular, it
1fd90 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f   prevents us fro
1fda0 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66 66  m writing an eff
1fdb0 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d  ective.** implem
1fdc0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c 69  entation of sqli
1fdd0 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72  te3AssertMayAbor
1fde0 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20 68  t()) and so we h
1fdf0 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f  ave chosen.** to
1fe00 20 74 61 6b 65 20 74 68 65 20 73 61 66 65 20 72   take the safe r
1fe10 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74 68  oute and skip th
1fe20 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  e optimization..
1fe30 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d  */.void sqlite3M
1fe40 61 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a 70  ayAbort(Parse *p
1fe50 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20  Parse){.  Parse 
1fe60 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
1fe70 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
1fe80 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f  l(pParse);.  pTo
1fe90 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72 74  plevel->mayAbort
1fea0 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 1;.}../*.** C
1feb0 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 74  ode an OP_Halt t
1fec0 68 61 74 20 63 61 75 73 65 73 20 74 68 65 20 76  hat causes the v
1fed0 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  dbe to return an
1fee0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
1fef0 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68 65  NT.** error. The
1ff00 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65 74   onError paramet
1ff10 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  er determines wh
1ff20 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66 20  ich (if any) of 
1ff30 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
1ff40 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74 20   and/or current 
1ff50 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
1ff60 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76  olled back..*/.v
1ff70 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74 43  oid sqlite3HaltC
1ff80 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
1ff90 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
1ffa0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1ffb0 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  t */.  int errCo
1ffc0 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78 74 65  de,      /* exte
1ffd0 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65 20  nded error code 
1ffe0 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
1fff0 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72  ,      /* Constr
20000 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 63  aint type */.  c
20010 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20 20 20  har *p4,        
20020 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67   /* Error messag
20030 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79 70 65  e */.  i8 p4type
20040 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34 5f 53  ,        /* P4_S
20050 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52 41 4e  TATIC or P4_TRAN
20060 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70 35  SIENT */.  u8 p5
20070 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f 2a 20  Errmsg       /* 
20080 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65 20 2a  P5_ErrMsg type *
20090 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  /.){.  Vdbe *v =
200a0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
200b0 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72  pParse);.  asser
200c0 74 28 20 28 65 72 72 43 6f 64 65 26 30 78 66 66  t( (errCode&0xff
200d0 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  )==SQLITE_CONSTR
200e0 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f 6e  AINT );.  if( on
200f0 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74 20  Error==OE_Abort 
20100 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61  ){.    sqlite3Ma
20110 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
20120 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
20130 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61  eAddOp4(v, OP_Ha
20140 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e 45  lt, errCode, onE
20150 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34 74  rror, 0, p4, p4t
20160 79 70 65 29 3b 0a 20 20 69 66 28 20 70 35 45 72  ype);.  if( p5Er
20170 72 6d 73 67 20 29 20 73 71 6c 69 74 65 33 56 64  rmsg ) sqlite3Vd
20180 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 35  beChangeP5(v, p5
20190 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Errmsg);.}../*.*
201a0 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c  * Code an OP_Hal
201b0 74 20 64 75 65 20 74 6f 20 55 4e 49 51 55 45 20  t due to UNIQUE 
201c0 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
201d0 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
201e0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
201f0 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72  ite3UniqueConstr
20200 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
20210 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
20220 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
20230 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
20240 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e      /* Constrain
20250 74 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e 64 65  t type */.  Inde
20260 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 2f 2a  x *pIdx       /*
20270 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74 20   The index that 
20280 74 72 69 67 67 65 72 73 20 74 68 65 20 63 6f 6e  triggers the con
20290 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20  straint */.){.  
202a0 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 69 6e  char *zErr;.  in
202b0 74 20 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d 20  t j;.  StrAccum 
202c0 65 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c 65 20  errMsg;.  Table 
202d0 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54  *pTab = pIdx->pT
202e0 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33  able;..  sqlite3
202f0 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 65 72  StrAccumInit(&er
20300 72 4d 73 67 2c 20 30 2c 20 30 2c 20 32 30 30 29  rMsg, 0, 0, 200)
20310 3b 0a 20 20 65 72 72 4d 73 67 2e 64 62 20 3d 20  ;.  errMsg.db = 
20320 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66 6f  pParse->db;.  fo
20330 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
20340 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20  KeyCol; j++){.  
20350 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70    char *zCol = p
20360 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e  Tab->aCol[pIdx->
20370 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61  aiColumn[j]].zNa
20380 6d 65 3b 0a 20 20 20 20 69 66 28 20 6a 20 29 20  me;.    if( j ) 
20390 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
203a0 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22  ppend(&errMsg, "
203b0 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20 73 71 6c  , ", 2);.    sql
203c0 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
203d0 6e 64 41 6c 6c 28 26 65 72 72 4d 73 67 2c 20 70  ndAll(&errMsg, p
203e0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
203f0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
20400 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20  Append(&errMsg, 
20410 22 2e 22 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c  ".", 1);.    sql
20420 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
20430 6e 64 41 6c 6c 28 26 65 72 72 4d 73 67 2c 20 7a  ndAll(&errMsg, z
20440 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 7a 45 72 72  Col);.  }.  zErr
20450 20 3d 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   = sqlite3StrAcc
20460 75 6d 46 69 6e 69 73 68 28 26 65 72 72 4d 73 67  umFinish(&errMsg
20470 29 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74  );.  sqlite3Halt
20480 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
20490 65 2c 20 0a 20 20 20 20 49 73 50 72 69 6d 61 72  e, .    IsPrimar
204a0 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
204b0 3f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  ? SQLITE_CONSTRA
204c0 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a  INT_PRIMARYKEY .
204d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204e0 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 53 51              : SQ
204f0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
20500 55 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72  UNIQUE,.    onEr
20510 72 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59  ror, zErr, P4_DY
20520 4e 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72  NAMIC, P5_Constr
20530 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a  aintUnique);.}..
20540 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
20550 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f  P_Halt due to no
20560 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a  n-unique rowid..
20570 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
20580 6f 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a  owidConstraint(.
20590 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
205a0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
205b0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
205c0 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a  onError,      /*
205d0 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
205e0 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a  tion algorithm *
205f0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  /.  Table *pTab 
20600 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
20610 6c 65 20 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d  le with the non-
20620 75 6e 69 71 75 65 20 72 6f 77 69 64 20 2a 2f 20  unique rowid */ 
20630 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67  .){.  char *zMsg
20640 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
20650 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30  ( pTab->iPKey>=0
20660 20 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73   ){.    zMsg = s
20670 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
20680 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73  arse->db, "%s.%s
20690 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a  ", pTab->zName,.
206a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206b0 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
206c0 61 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79  aCol[pTab->iPKey
206d0 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  ].zName);.    rc
206e0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
206f0 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b  AINT_PRIMARYKEY;
20700 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d  .  }else{.    zM
20710 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
20720 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
20730 22 25 73 2e 72 6f 77 69 64 22 2c 20 70 54 61 62  "%s.rowid", pTab
20740 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63  ->zName);.    rc
20750 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
20760 41 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a  AINT_ROWID;.  }.
20770 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e    sqlite3HaltCon
20780 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
20790 72 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73  rc, onError, zMs
207a0 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20  g, P4_DYNAMIC,. 
207b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207c0 20 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74 72         P5_Constr
207d0 61 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a  aintUnique);.}..
207e0 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
207f0 65 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65  ee if pIndex use
20800 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  s the collating 
20810 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20  sequence pColl. 
20820 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20   Return.** true 
20830 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66  if it does and f
20840 61 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20  alse if it does 
20850 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  not..*/.#ifndef 
20860 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
20870 44 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63  DEX.static int c
20880 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f  ollationMatch(co
20890 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c  nst char *zColl,
208a0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b   Index *pIndex){
208b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
208c0 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a  rt( zColl!=0 );.
208d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e    for(i=0; i<pIn
208e0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  dex->nColumn; i+
208f0 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  +){.    const ch
20900 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e  ar *z = pIndex->
20910 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61  azColl[i];.    a
20920 73 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70  ssert( z!=0 || p
20930 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
20940 69 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20  i]<0 );.    if( 
20950 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
20960 5b 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c  [i]>=0 && 0==sql
20970 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a  ite3StrICmp(z, z
20980 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72  Coll) ){.      r
20990 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
209a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
209b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
209c0 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64  ecompute all ind
209d0 69 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61  ices of pTab tha
209e0 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  t use the collat
209f0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
20a00 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d  ll..** If pColl=
20a10 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
20a20 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
20a30 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65   pTab..*/.#ifnde
20a40 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
20a50 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69  INDEX.static voi
20a60 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50  d reindexTable(P
20a70 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
20a80 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20  ble *pTab, char 
20a90 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20  const *zColl){. 
20aa0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
20ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20ac0 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61  An index associa
20ad0 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f  ted with pTab */
20ae0 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70  ..  for(pIndex=p
20af0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e  Tab->pIndex; pIn
20b00 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64  dex; pIndex=pInd
20b10 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ex->pNext){.    
20b20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20  if( zColl==0 || 
20b30 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a  collationMatch(z
20b40 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b  Coll, pIndex) ){
20b50 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d  .      int iDb =
20b60 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
20b70 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
20b80 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
20b90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
20ba0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
20bb0 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
20bc0 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
20bd0 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61  3RefillIndex(pPa
20be0 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29  rse, pIndex, -1)
20bf0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
20c00 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  ndif../*.** Reco
20c10 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  mpute all indice
20c20 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  s of all tables 
20c30 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  in all databases
20c40 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e   where the.** in
20c50 64 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f  dices use the co
20c60 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
20c70 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c   pColl.  If pCol
20c80 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
20c90 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63  ute.** all indic
20ca0 65 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a  es everywhere..*
20cb0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
20cc0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
20cd0 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65  atic void reinde
20ce0 78 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65  xDatabases(Parse
20cf0 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 63   *pParse, char c
20d00 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20  onst *zColl){.  
20d10 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
20d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
20d30 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65   single database
20d40 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d60 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
20d70 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
20d80 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
20d90 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
20da0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
20db0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
20dc0 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20  HashElem *k;    
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
20de0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
20df0 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f  tables in pDb */
20e00 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
20e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20e20 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65  * A table in the
20e30 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20   database */..  
20e40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
20e50 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65  treeHoldsAllMute
20e60 78 65 73 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e  xes(db) );  /* N
20e70 65 65 64 65 64 20 66 6f 72 20 73 63 68 65 6d 61  eeded for schema
20e80 20 61 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72   access */.  for
20e90 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e  (iDb=0, pDb=db->
20ea0 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  aDb; iDb<db->nDb
20eb0 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b  ; iDb++, pDb++){
20ec0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62  .    assert( pDb
20ed0 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b  !=0 );.    for(k
20ee0 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
20ef0 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e  (&pDb->pSchema->
20f00 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d  tblHash);  k; k=
20f10 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b  sqliteHashNext(k
20f20 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d  )){.      pTab =
20f30 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48   (Table*)sqliteH
20f40 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20  ashData(k);.    
20f50 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70    reindexTable(p
20f60 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f  Parse, pTab, zCo
20f70 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ll);.    }.  }.}
20f80 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
20f90 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
20fa0 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d   the REINDEX com
20fb0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mand..**.**     
20fc0 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20     REINDEX      
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fe0 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20        -- 1.**   
20ff0 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63       REINDEX  <c
21000 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20  ollation>       
21010 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20          -- 2.** 
21020 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20         REINDEX  
21030 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61  ?<database>.?<ta
21040 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a  blename>  -- 3.*
21050 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
21060 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c    ?<database>.?<
21070 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34  indexname>  -- 4
21080 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61  .**.** Form 1 ca
21090 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  uses all indices
210a0 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64   in all attached
210b0 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65   databases to be
210c0 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72   rebuilt..** For
210d0 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c  m 2 rebuilds all
210e0 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
210f0 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75  databases that u
21100 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20  se the named.** 
21110 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
21120 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64  on.  Forms 3 and
21130 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e   4 rebuild the n
21140 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c  amed index or al
21150 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73  l.** indices ass
21160 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
21170 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f   named table..*/
21180 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21190 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69  OMIT_REINDEX.voi
211a0 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78  d sqlite3Reindex
211b0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
211c0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54  Token *pName1, T
211d0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20  oken *pName2){. 
211e0 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
211f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21200 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
21210 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ce to be reindex
21220 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ed, or NULL */. 
21230 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
21240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21250 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  Name of a table 
21260 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f  or index */.  co
21270 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  nst char *zDb;  
21280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
21290 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
212a0 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
212b0 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
212c0 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e     /* A table in
212d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
212e0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
212f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
21300 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
21310 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
21320 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
21330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21340 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
21350 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
21360 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
21370 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
21380 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
21390 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54  onnection */.  T
213a0 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20  oken *pObjName; 
213b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
213c0 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
213d0 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72  or index to be r
213e0 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f  eindexed */..  /
213f0 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
21400 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
21410 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
21420 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
21430 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
21440 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
21450 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
21460 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
21470 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
21480 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
21490 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
214a0 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d  ..  if( pName1==
214b0 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  0 ){.    reindex
214c0 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65  Databases(pParse
214d0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
214e0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45  ;.  }else if( NE
214f0 56 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c  VER(pName2==0) |
21500 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29  | pName2->z==0 )
21510 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c  {.    char *zCol
21520 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  l;.    assert( p
21530 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20  Name1->z );.    
21540 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e  zColl = sqlite3N
21550 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
21560 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29  rse->db, pName1)
21570 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c  ;.    if( !zColl
21580 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
21590 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
215a0 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e  ndCollSeq(db, EN
215b0 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29  C(db), zColl, 0)
215c0 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20  ;.    if( pColl 
215d0 29 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78  ){.      reindex
215e0 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65  Databases(pParse
215f0 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
21600 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
21610 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
21620 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
21630 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
21640 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a  db, zColl);.  }.
21650 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54    iDb = sqlite3T
21660 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73  woPartName(pPars
21670 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65  e, pName1, pName
21680 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20  2, &pObjName);. 
21690 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
216a0 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  urn;.  z = sqlit
216b0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
216c0 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20  db, pObjName);. 
216d0 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
216e0 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e  rn;.  zDb = db->
216f0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
21700 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
21710 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c  FindTable(db, z,
21720 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61   zDb);.  if( pTa
21730 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78  b ){.    reindex
21740 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
21750 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  ab, 0);.    sqli
21760 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
21770 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
21780 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
21790 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
217a0 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c  , z, zDb);.  sql
217b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
217c0 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  );.  if( pIndex 
217d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
217e0 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
217f0 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
21800 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
21810 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65  fillIndex(pParse
21820 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20  , pIndex, -1);. 
21830 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
21840 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
21850 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65  (pParse, "unable
21860 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65   to identify the
21870 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65   object to be re
21880 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e  indexed");.}.#en
21890 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
218a0 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75  n a KeyInfo stru
218b0 63 74 75 72 65 20 74 68 61 74 20 69 73 20 61 70  cture that is ap
218c0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68  propriate for th
218d0 65 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a  e given Index..*
218e0 2a 0a 2a 2a 20 54 68 65 20 4b 65 79 49 6e 66 6f  *.** The KeyInfo
218f0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 61   structure for a
21900 6e 20 69 6e 64 65 78 20 69 73 20 63 61 63 68 65  n index is cache
21910 64 20 69 6e 20 74 68 65 20 49 6e 64 65 78 20 6f  d in the Index o
21920 62 6a 65 63 74 2e 0a 2a 2a 20 53 6f 20 74 68 65  bject..** So the
21930 72 65 20 6d 69 67 68 74 20 62 65 20 6d 75 6c 74  re might be mult
21940 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20  iple references 
21950 74 6f 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  to the returned 
21960 70 6f 69 6e 74 65 72 2e 20 20 54 68 65 0a 2a 2a  pointer.  The.**
21970 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e   caller should n
21980 6f 74 20 74 72 79 20 74 6f 20 6d 6f 64 69 66 79  ot try to modify
21990 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a   the KeyInfo obj
219a0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ect..**.** The c
219b0 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e 76  aller should inv
219c0 6f 6b 65 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  oke sqlite3KeyIn
219d0 66 6f 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65  foUnref() on the
219e0 20 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74   returned object
219f0 0a 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20  .** when it has 
21a00 66 69 6e 69 73 68 65 64 20 75 73 69 6e 67 20 69  finished using i
21a10 74 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73  t..*/.KeyInfo *s
21a20 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
21a30 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72  ndex(Parse *pPar
21a40 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
21a50 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
21a60 6e 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b  nErr ) return 0;
21a70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21a80 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
21a90 45 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70 4b  E.  if( pIdx->pK
21aa0 65 79 49 6e 66 6f 20 26 26 20 70 49 64 78 2d 3e  eyInfo && pIdx->
21ab0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 21 3d 70 50  pKeyInfo->db!=pP
21ac0 61 72 73 65 2d 3e 64 62 20 29 7b 0a 20 20 20 20  arse->db ){.    
21ad0 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
21ae0 72 65 66 28 70 49 64 78 2d 3e 70 4b 65 79 49 6e  ref(pIdx->pKeyIn
21af0 66 6f 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e 70  fo);.    pIdx->p
21b00 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 7d  KeyInfo = 0;.  }
21b10 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 49  .#endif.  if( pI
21b20 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20  dx->pKeyInfo==0 
21b30 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
21b40 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64    int nCol = pId
21b50 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  x->nColumn;.    
21b60 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d  int nKey = pIdx-
21b70 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 4b 65  >nKeyCol;.    Ke
21b80 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 20  yInfo *pKey;.   
21b90 20 69 66 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e   if( pIdx->uniqN
21ba0 6f 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20  otNull ){.      
21bb0 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65  pKey = sqlite3Ke
21bc0 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73  yInfoAlloc(pPars
21bd0 65 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f  e->db, nKey, nCo
21be0 6c 2d 6e 4b 65 79 29 3b 0a 20 20 20 20 7d 65 6c  l-nKey);.    }el
21bf0 73 65 7b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d  se{.      pKey =
21c00 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41   sqlite3KeyInfoA
21c10 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
21c20 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 7d   nCol, 0);.    }
21c30 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b  .    if( pKey ){
21c40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
21c50 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57  qlite3KeyInfoIsW
21c60 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20 29  riteable(pKey) )
21c70 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
21c80 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
21c90 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f         char *zCo
21ca0 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
21cb0 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  l[i];.        as
21cc0 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29  sert( zColl!=0 )
21cd0 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 2d 3e  ;.        pKey->
21ce0 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 74 72 63 6d  aColl[i] = strcm
21cf0 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52 59 22  p(zColl,"BINARY"
21d00 29 3d 3d 30 20 3f 20 30 20 3a 0a 20 20 20 20 20  )==0 ? 0 :.     
21d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61       sqlite3Loca
21d30 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
21d40 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , zColl);.      
21d50 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
21d60 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53  er[i] = pIdx->aS
21d70 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20  ortOrder[i];.   
21d80 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
21d90 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20  Parse->nErr ){. 
21da0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65         sqlite3Ke
21db0 79 49 6e 66 6f 55 6e 72 65 66 28 70 4b 65 79 29  yInfoUnref(pKey)
21dc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
21dd0 20 20 20 20 20 20 20 70 49 64 78 2d 3e 70 4b 65         pIdx->pKe
21de0 79 49 6e 66 6f 20 3d 20 70 4b 65 79 3b 0a 20 20  yInfo = pKey;.  
21df0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
21e00 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
21e10 4b 65 79 49 6e 66 6f 52 65 66 28 70 49 64 78 2d  KeyInfoRef(pIdx-
21e20 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 7d 0a 0a 23  >pKeyInfo);.}..#
21e30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21e40 49 54 5f 43 54 45 0a 2f 2a 20 0a 2a 2a 20 54 68  IT_CTE./* .** Th
21e50 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
21e60 76 6f 6b 65 64 20 6f 6e 63 65 20 70 65 72 20 43  voked once per C
21e70 54 45 20 62 79 20 74 68 65 20 70 61 72 73 65 72  TE by the parser
21e80 20 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20 61   while parsing a
21e90 20 0a 2a 2a 20 57 49 54 48 20 63 6c 61 75 73 65   .** WITH clause
21ea0 2e 20 0a 2a 2f 0a 57 69 74 68 20 2a 73 71 6c 69  . .*/.With *sqli
21eb0 74 65 33 57 69 74 68 41 64 64 28 0a 20 20 50 61  te3WithAdd(.  Pa
21ec0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
21ed0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
21ee0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 69   context */.  Wi
21ef0 74 68 20 2a 70 57 69 74 68 2c 20 20 20 20 20 20  th *pWith,      
21f00 20 20 20 20 20 20 2f 2a 20 45 78 69 73 74 69 6e        /* Existin
21f10 67 20 57 49 54 48 20 63 6c 61 75 73 65 2c 20 6f  g WITH clause, o
21f20 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  r NULL */.  Toke
21f30 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20 20 20 20  n *pName,       
21f40 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
21f50 68 65 20 63 6f 6d 6d 6f 6e 2d 74 61 62 6c 65 20  he common-table 
21f60 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
21f70 41 72 67 6c 69 73 74 2c 20 20 20 20 20 2f 2a 20  Arglist,     /* 
21f80 4f 70 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 20  Optional column 
21f90 6e 61 6d 65 20 6c 69 73 74 20 66 6f 72 20 74 68  name list for th
21fa0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 53 65 6c  e table */.  Sel
21fb0 65 63 74 20 2a 70 51 75 65 72 79 20 20 20 20 20  ect *pQuery     
21fc0 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 75 73       /* Query us
21fd0 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ed to initialize
21fe0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b   the table */.){
21ff0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
22000 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 57   pParse->db;.  W
22010 69 74 68 20 2a 70 4e 65 77 3b 0a 20 20 63 68 61  ith *pNew;.  cha
22020 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 2f 2a 20  r *zName;..  /* 
22030 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 43  Check that the C
22040 54 45 20 6e 61 6d 65 20 69 73 20 75 6e 69 71 75  TE name is uniqu
22050 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 57 49  e within this WI
22060 54 48 20 63 6c 61 75 73 65 2e 20 49 66 0a 20 20  TH clause. If.  
22070 2a 2a 20 6e 6f 74 2c 20 73 74 6f 72 65 20 61 6e  ** not, store an
22080 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 50 61   error in the Pa
22090 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a  rse structure. *
220a0 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  zName = sqli
220b0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
220c0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
220d0 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
220e0 20 26 26 20 70 57 69 74 68 20 29 7b 0a 20 20 20   && pWith ){.   
220f0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
22100 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43  i=0; i<pWith->nC
22110 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
22120 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
22130 6d 70 28 7a 4e 61 6d 65 2c 20 70 57 69 74 68 2d  mp(zName, pWith-
22140 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
22150 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
22160 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
22170 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 57 49  e, "duplicate WI
22180 54 48 20 74 61 62 6c 65 20 6e 61 6d 65 3a 20 25  TH table name: %
22190 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
221a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
221b0 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
221c0 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
221d0 7a 65 6f 66 28 2a 70 57 69 74 68 29 20 2b 20 28  zeof(*pWith) + (
221e0 73 69 7a 65 6f 66 28 70 57 69 74 68 2d 3e 61 5b  sizeof(pWith->a[
221f0 31 5d 29 20 2a 20 70 57 69 74 68 2d 3e 6e 43 74  1]) * pWith->nCt
22200 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73  e);.    pNew = s
22210 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
22220 64 62 2c 20 70 57 69 74 68 2c 20 6e 42 79 74 65  db, pWith, nByte
22230 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
22240 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
22250 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
22260 69 7a 65 6f 66 28 2a 70 57 69 74 68 29 29 3b 0a  izeof(*pWith));.
22270 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 4e    }.  assert( zN
22280 61 6d 65 21 3d 30 20 7c 7c 20 70 4e 65 77 3d 3d  ame!=0 || pNew==
22290 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  0 );.  assert( d
222a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
222b0 3d 30 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 3b  =0 || pNew==0 );
222c0 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ..  if( pNew==0 
222d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
222e0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
222f0 20 70 41 72 67 6c 69 73 74 29 3b 0a 20 20 20 20   pArglist);.    
22300 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
22310 65 74 65 28 64 62 2c 20 70 51 75 65 72 79 29 3b  ete(db, pQuery);
22320 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
22330 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
22340 20 20 20 70 4e 65 77 20 3d 20 70 57 69 74 68 3b     pNew = pWith;
22350 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
22360 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
22370 5d 2e 70 53 65 6c 65 63 74 20 3d 20 70 51 75 65  ].pSelect = pQue
22380 72 79 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  ry;.    pNew->a[
22390 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 43 6f 6c  pNew->nCte].pCol
223a0 73 20 3d 20 70 41 72 67 6c 69 73 74 3b 0a 20 20  s = pArglist;.  
223b0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
223c0 6e 43 74 65 5d 2e 7a 4e 61 6d 65 20 3d 20 7a 4e  nCte].zName = zN
223d0 61 6d 65 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ame;.    pNew->a
223e0 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 45 72  [pNew->nCte].zEr
223f0 72 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  r = 0;.    pNew-
22400 3e 6e 43 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  >nCte++;.  }..  
22410 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
22420 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 63  /*.** Free the c
22430 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 57  ontents of the W
22440 69 74 68 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ith object passe
22450 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
22460 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  argument..*/.voi
22470 64 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c  d sqlite3WithDel
22480 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
22490 20 57 69 74 68 20 2a 70 57 69 74 68 29 7b 0a 20   With *pWith){. 
224a0 20 69 66 28 20 70 57 69 74 68 20 29 7b 0a 20 20   if( pWith ){.  
224b0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
224c0 28 69 3d 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e  (i=0; i<pWith->n
224d0 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
224e0 20 73 74 72 75 63 74 20 43 74 65 20 2a 70 43 74   struct Cte *pCt
224f0 65 20 3d 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d  e = &pWith->a[i]
22500 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
22510 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
22520 2c 20 70 43 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a  , pCte->pCols);.
22530 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
22540 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  ectDelete(db, pC
22550 74 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  te->pSelect);.  
22560 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
22570 65 28 64 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d  e(db, pCte->zNam
22580 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
22590 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
225a0 70 57 69 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65  pWith);.  }.}.#e
225b0 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
225c0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45  (SQLITE_OMIT_CTE
225d0 29 20 2a 2f 0a                                   ) */.