/ Hex Artifact Content
Login

Artifact 5a3b71786e2b96d2bb92d40f190eb1fe736f25ca:


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 70 50 61 72 73 65 2d  b;.  if( pParse-
10e0: 3e 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e  >nested ) return
10f0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
1100: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72  ocFailed || pPar
1110: 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
1120: 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d  if( pParse->rc==
1130: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72  SQLITE_OK ) pPar
1140: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
1150: 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72  ERROR;.    retur
1160: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67  n;.  }..  /* Beg
1170: 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67  in by generating
1180: 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f   some terminatio
1190: 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e  n code at the en
11a0: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64  d of the.  ** vd
11b0: 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a  be program.  */.
11c0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
11d0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
11e0: 61 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d  assert( !pParse-
11f0: 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20  >isMultiWrite . 
1200: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
1210: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f  VdbeAssertMayAbo
1220: 72 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61  rt(v, pParse->ma
1230: 79 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20  yAbort));.  if( 
1240: 76 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  v ){.    while( 
1250: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
1260: 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 76 2c 20  ePriorOpcode(v, 
1270: 4f 50 5f 43 6c 6f 73 65 29 20 29 7b 7d 0a 20 20  OP_Close) ){}.  
1280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1290: 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29 3b  Op0(v, OP_Halt);
12a0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  ..#if SQLITE_USE
12b0: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
12c0: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
12d0: 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3e 30 20 26 26  >nTableLock>0 &&
12e0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
12f0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1300: 65 33 55 73 65 72 41 75 74 68 49 6e 69 74 28 64  e3UserAuthInit(d
1310: 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62  b);.      if( db
1320: 2d 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c  ->auth.authLevel
1330: 3c 55 41 55 54 48 5f 55 73 65 72 20 29 7b 0a 20  <UAUTH_User ){. 
1340: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72         pParse->r
1350: 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48 5f  c = SQLITE_AUTH_
1360: 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 73 71  USER;.        sq
1370: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1380: 61 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20  arse, "user not 
1390: 61 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b  authenticated");
13a0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
13b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
13c0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68  endif..    /* Th
13d0: 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b 20 63 6f  e cookie mask co
13e0: 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69 74 20 66  ntains one bit f
13f0: 6f 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65  or each database
1400: 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20 20 20 20   file open..    
1410: 2a 2a 20 28 42 69 74 20 30 20 69 73 20 66 6f 72  ** (Bit 0 is for
1420: 20 6d 61 69 6e 2c 20 62 69 74 20 31 20 69 73 20   main, bit 1 is 
1430: 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64 20 73 6f  for temp, and so
1440: 20 66 6f 72 74 68 2e 29 20 20 42 69 74 73 20 61   forth.)  Bits a
1450: 72 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 66 6f  re.    ** set fo
1460: 72 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20  r each database 
1470: 74 68 61 74 20 69 73 20 75 73 65 64 2e 20 20 47  that is used.  G
1480: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1490: 73 74 61 72 74 20 61 0a 20 20 20 20 2a 2a 20 74  start a.    ** t
14a0: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 65 61  ransaction on ea
14b0: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
14c0: 20 61 6e 64 20 74 6f 20 76 65 72 69 66 79 20 74   and to verify t
14d0: 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
14e0: 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61 63 68 20  .    ** on each 
14f0: 75 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20  used database.. 
1500: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62     */.    if( db
1510: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
1520: 30 20 0a 20 20 20 20 20 26 26 20 28 44 62 4d 61  0 .     && (DbMa
1530: 73 6b 4e 6f 6e 5a 65 72 6f 28 70 50 61 72 73 65  skNonZero(pParse
1540: 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 20 7c 7c  ->cookieMask) ||
1550: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1560: 78 70 72 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  xpr).    ){.    
1570: 20 20 69 6e 74 20 69 44 62 2c 20 69 3b 0a 20 20    int iDb, i;.  
1580: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1590: 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
15a0: 30 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  0)->opcode==OP_I
15b0: 6e 69 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  nit );.      sql
15c0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
15d0: 28 76 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f  (v, 0);.      fo
15e0: 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d  r(iDb=0; iDb<db-
15f0: 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20  >nDb; iDb++){.  
1600: 20 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b        if( DbMask
1610: 54 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f  Test(pParse->coo
1620: 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30  kieMask, iDb)==0
1630: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1640: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1650: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
1660: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1670: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1680: 76 2c 0a 20 20 20 20 20 20 20 20 20 20 4f 50 5f  v,.          OP_
1690: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 20 20 20  Transaction,    
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  /* Opcode */.   
16c0: 20 20 20 20 20 20 20 69 44 62 2c 20 20 20 20 20         iDb,     
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
16f0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 44 62 4d  */.          DbM
1700: 61 73 6b 54 65 73 74 28 70 50 61 72 73 65 2d 3e  askTest(pParse->
1710: 77 72 69 74 65 4d 61 73 6b 2c 69 44 62 29 2c 20  writeMask,iDb), 
1720: 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 20 20 20  /* P2 */.       
1730: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69     pParse->cooki
1740: 65 56 61 6c 75 65 5b 69 44 62 5d 2c 20 20 20 20  eValue[iDb],    
1750: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20        /* P3 */. 
1760: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62           db->aDb
1770: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69  [iDb].pSchema->i
1780: 47 65 6e 65 72 61 74 69 6f 6e 20 20 2f 2a 20 50  Generation  /* P
1790: 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 3b 0a  4 */.        );.
17a0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
17b0: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 20 73  init.busy==0 ) s
17c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
17d0: 50 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20  P5(v, 1);.      
17e0: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
17f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1800: 22 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  "usesStmtJournal
1810: 3d 25 64 22 2c 20 70 50 61 72 73 65 2d 3e 6d 61  =%d", pParse->ma
1820: 79 41 62 6f 72 74 20 26 26 20 70 50 61 72 73 65  yAbort && pParse
1830: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 29 29  ->isMultiWrite))
1840: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
1850: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
1860: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
1870: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
1880: 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b 20 69  se->nVtabLock; i
1890: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
18a0: 72 20 2a 76 74 61 62 20 3d 20 28 63 68 61 72 20  r *vtab = (char 
18b0: 2a 29 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  *)sqlite3GetVTab
18c0: 6c 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61  le(db, pParse->a
18d0: 70 56 74 61 62 4c 6f 63 6b 5b 69 5d 29 3b 0a 20  pVtabLock[i]);. 
18e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
18f0: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
1900: 42 65 67 69 6e 2c 20 30 2c 20 30 2c 20 30 2c 20  Begin, 0, 0, 0, 
1910: 76 74 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  vtab, P4_VTAB);.
1920: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1930: 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20  arse->nVtabLock 
1940: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
1950: 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20 74     /* Once all t
1960: 68 65 20 63 6f 6f 6b 69 65 73 20 68 61 76 65 20  he cookies have 
1970: 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 61 6e  been verified an
1980: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  d transactions o
1990: 70 65 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a 2a  pened, .      **
19a0: 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75   obtain the requ
19b0: 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b 73  ired table-locks
19c0: 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
19d0: 70 20 75 6e 6c 65 73 73 20 74 68 65 20 0a 20 20  p unless the .  
19e0: 20 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63 61      ** shared-ca
19f0: 63 68 65 20 66 65 61 74 75 72 65 20 69 73 20 65  che feature is e
1a00: 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f  nabled..      */
1a10: 0a 20 20 20 20 20 20 63 6f 64 65 54 61 62 6c 65  .      codeTable
1a20: 4c 6f 63 6b 73 28 70 50 61 72 73 65 29 3b 0a 0a  Locks(pParse);..
1a30: 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
1a40: 69 7a 65 20 61 6e 79 20 41 55 54 4f 49 4e 43 52  ize any AUTOINCR
1a50: 45 4d 45 4e 54 20 64 61 74 61 20 73 74 72 75 63  EMENT data struc
1a60: 74 75 72 65 73 20 72 65 71 75 69 72 65 64 2e 0a  tures required..
1a70: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
1a80: 71 6c 69 74 65 33 41 75 74 6f 69 6e 63 72 65 6d  qlite3Autoincrem
1a90: 65 6e 74 42 65 67 69 6e 28 70 50 61 72 73 65 29  entBegin(pParse)
1aa0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
1ab0: 20 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73   constant expres
1ac0: 73 69 6f 6e 73 20 74 68 61 74 20 77 68 65 72 65  sions that where
1ad0: 20 66 61 63 74 6f 72 65 64 20 6f 75 74 20 6f 66   factored out of
1ae0: 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a   inner loops */.
1af0: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
1b00: 2d 3e 70 43 6f 6e 73 74 45 78 70 72 20 29 7b 0a  ->pConstExpr ){.
1b10: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
1b20: 20 2a 70 45 4c 20 3d 20 70 50 61 72 73 65 2d 3e   *pEL = pParse->
1b30: 70 43 6f 6e 73 74 45 78 70 72 3b 0a 20 20 20 20  pConstExpr;.    
1b40: 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6b 43 6f      pParse->okCo
1b50: 6e 73 74 46 61 63 74 6f 72 20 3d 20 30 3b 0a 20  nstFactor = 0;. 
1b60: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1b70: 69 3c 70 45 4c 2d 3e 6e 45 78 70 72 3b 20 69 2b  i<pEL->nExpr; i+
1b80: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
1b90: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1ba0: 61 72 73 65 2c 20 70 45 4c 2d 3e 61 5b 69 5d 2e  arse, pEL->a[i].
1bb0: 70 45 78 70 72 2c 20 70 45 4c 2d 3e 61 5b 69 5d  pExpr, pEL->a[i]
1bc0: 2e 75 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67  .u.iConstExprReg
1bd0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1be0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46     }..      /* F
1bf0: 69 6e 61 6c 6c 79 2c 20 6a 75 6d 70 20 62 61 63  inally, jump bac
1c00: 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
1c10: 6e 67 20 6f 66 20 74 68 65 20 65 78 65 63 75 74  ng of the execut
1c20: 61 62 6c 65 20 63 6f 64 65 2e 20 2a 2f 0a 20 20  able code. */.  
1c30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47      sqlite3VdbeG
1c40: 6f 74 6f 28 76 2c 20 31 29 3b 0a 20 20 20 20 7d  oto(v, 1);.    }
1c50: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20  .  }...  /* Get 
1c60: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
1c70: 20 72 65 61 64 79 20 66 6f 72 20 65 78 65 63 75   ready for execu
1c80: 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tion.  */.  if( 
1c90: 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  v && pParse->nEr
1ca0: 72 3d 3d 30 20 26 26 20 21 64 62 2d 3e 6d 61 6c  r==0 && !db->mal
1cb0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1cc0: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1cd0: 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 30 20  >iCacheLevel==0 
1ce0: 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 73 20  );  /* Disables 
1cf0: 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73 20 6d  and re-enables m
1d00: 61 74 63 68 20 2a 2f 0a 20 20 20 20 2f 2a 20 41  atch */.    /* A
1d10: 20 6d 69 6e 69 6d 75 6d 20 6f 66 20 6f 6e 65 20   minimum of one 
1d20: 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 69 72  cursor is requir
1d30: 65 64 20 69 66 20 61 75 74 6f 69 6e 63 72 65 6d  ed if autoincrem
1d40: 65 6e 74 20 69 73 20 75 73 65 64 0a 20 20 20 20  ent is used.    
1d50: 2a 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 61  *  See ticket [a
1d60: 36 39 36 33 37 39 63 31 66 30 38 38 36 36 5d 20  696379c1f08866] 
1d70: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  */.    if( pPars
1d80: 65 2d 3e 70 41 69 6e 63 21 3d 30 20 26 26 20 70  e->pAinc!=0 && p
1d90: 50 61 72 73 65 2d 3e 6e 54 61 62 3d 3d 30 20 29  Parse->nTab==0 )
1da0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
1db0: 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  1;.    sqlite3Vd
1dc0: 62 65 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70  beMakeReady(v, p
1dd0: 50 61 72 73 65 29 3b 0a 20 20 20 20 70 50 61 72  Parse);.    pPar
1de0: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
1df0: 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65  DONE;.    pParse
1e00: 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20  ->colNamesSet = 
1e10: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1e20: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
1e30: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
1e40: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
1e50: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  0;.  pParse->nMe
1e60: 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  m = 0;.  pParse-
1e70: 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61  >nSet = 0;.  pPa
1e80: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20  rse->nVar = 0;. 
1e90: 20 44 62 4d 61 73 6b 5a 65 72 6f 28 70 50 61 72   DbMaskZero(pPar
1ea0: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3b  se->cookieMask);
1eb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68  .}../*.** Run th
1ec0: 65 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64  e parser and cod
1ed0: 65 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75  e generator recu
1ee0: 72 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72  rsively in order
1ef0: 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20   to generate.** 
1f00: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c  code for the SQL
1f10: 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e   statement given
1f20: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
1f30: 20 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74   the pParse cont
1f40: 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ext.** currently
1f50: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1f60: 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70  ion.  When the p
1f70: 61 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63  arser is run rec
1f80: 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73  ursively.** this
1f90: 20 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20   way, the final 
1fa0: 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61  OP_Halt is not a
1fb0: 70 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65  ppended and othe
1fc0: 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  r initialization
1fd0: 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61  .** and finaliza
1fe0: 74 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f  tion steps are o
1ff0: 6d 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74  mitted because t
2000: 68 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e  hose are handlin
2010: 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65  g by the.** oute
2020: 72 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a  rmost parser..**
2030: 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69  .** Not everythi
2040: 6e 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20  ng is nestable. 
2050: 20 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69   This facility i
2060: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65  s designed to pe
2070: 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20  rmit.** INSERT, 
2080: 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45  UPDATE, and DELE
2090: 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67  TE operations ag
20a0: 61 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53  ainst SQLITE_MAS
20b0: 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72  TER.  Use.** car
20c0: 65 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20  e if you decide 
20d0: 74 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  to try to use th
20e0: 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73  is routine for s
20f0: 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73  ome other purpos
2100: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
2110: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50  te3NestedParse(P
2120: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
2130: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
2140: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
2150: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
2160: 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  Sql;.  char *zEr
2170: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69  rMsg = 0;.  sqli
2180: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
2190: 2d 3e 64 62 3b 0a 23 20 64 65 66 69 6e 65 20 53  ->db;.# define S
21a0: 41 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28  AVE_SZ  (sizeof(
21b0: 50 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74 6f  Parse) - offseto
21c0: 66 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a 20  f(Parse,nVar)). 
21d0: 20 63 68 61 72 20 73 61 76 65 42 75 66 5b 53 41   char saveBuf[SA
21e0: 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70  VE_SZ];..  if( p
21f0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
2200: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
2210: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31  pParse->nested<1
2220: 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67  0 );  /* Nesting
2230: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
2240: 6f 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68  of limited depth
2250: 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61   */.  va_start(a
2260: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a  p, zFormat);.  z
2270: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  Sql = sqlite3VMP
2280: 72 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61  rintf(db, zForma
2290: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
22a0: 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  (ap);.  if( zSql
22b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
22c0: 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  n;   /* A malloc
22d0: 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
22e0: 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73  d */.  }.  pPars
22f0: 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d  e->nested++;.  m
2300: 65 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26  emcpy(saveBuf, &
2310: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41  pParse->nVar, SA
2320: 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74  VE_SZ);.  memset
2330: 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  (&pParse->nVar, 
2340: 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73  0, SAVE_SZ);.  s
2350: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
2360: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a  pParse, zSql, &z
2370: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
2380: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
2390: 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
23a0: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
23b0: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 72  ;.  memcpy(&pPar
23c0: 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42 75  se->nVar, saveBu
23d0: 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70  f, SAVE_SZ);.  p
23e0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b  Parse->nested--;
23f0: 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 55  .}..#if SQLITE_U
2400: 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
2410: 4f 4e 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ON./*.** Return 
2420: 54 52 55 45 20 69 66 20 7a 54 61 62 6c 65 20 69  TRUE if zTable i
2430: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
2440: 65 20 73 79 73 74 65 6d 20 74 61 62 6c 65 20 74  e system table t
2450: 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 0a 2a  hat stores the.*
2460: 2a 20 6c 69 73 74 20 6f 66 20 75 73 65 72 73 20  * list of users 
2470: 61 6e 64 20 74 68 65 69 72 20 61 63 63 65 73 73  and their access
2480: 20 63 72 65 64 65 6e 74 69 61 6c 73 2e 0a 2a 2f   credentials..*/
2490: 0a 69 6e 74 20 73 71 6c 69 74 65 33 55 73 65 72  .int sqlite3User
24a0: 41 75 74 68 54 61 62 6c 65 28 63 6f 6e 73 74 20  AuthTable(const 
24b0: 63 68 61 72 20 2a 7a 54 61 62 6c 65 29 7b 0a 20  char *zTable){. 
24c0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
24d0: 73 74 72 69 63 6d 70 28 7a 54 61 62 6c 65 2c 20  stricmp(zTable, 
24e0: 22 73 71 6c 69 74 65 5f 75 73 65 72 22 29 3d 3d  "sqlite_user")==
24f0: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
2500: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
2510: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
2520: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
2530: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
2540: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
2550: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
2560: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
2570: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
2580: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
2590: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
25a0: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
25b0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
25c0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
25d0: 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73   If zDatabase is
25e0: 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65   0, all database
25f0: 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66  s are searched f
2600: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  or the table and
2610: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61   the.** first ma
2620: 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20  tching table is 
2630: 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63  returned.  (No c
2640: 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c  hecking for dupl
2650: 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e  icate table.** n
2660: 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20  ames is done.)  
2670: 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72  The search order
2680: 20 69 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20   is TEMP first, 
2690: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
26a0: 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79  any.** auxiliary
26b0: 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64   databases added
26c0: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
26d0: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  H command..**.**
26e0: 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
26f0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a  3LocateTable()..
2700: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
2710: 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74  3FindTable(sqlit
2720: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
2730: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
2740: 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65   char *zDatabase
2750: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  ){.  Table *p = 
2760: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  0;.  int i;..  /
2770: 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61 72  * All mutexes ar
2780: 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  e required for s
2790: 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20 4d  chema access.  M
27a0: 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c 64  ake sure we hold
27b0: 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73 65   them. */.  asse
27c0: 72 74 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30  rt( zDatabase!=0
27d0: 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65   || sqlite3Btree
27e0: 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28  HoldsAllMutexes(
27f0: 64 62 29 20 29 3b 0a 23 69 66 20 53 51 4c 49 54  db) );.#if SQLIT
2800: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
2810: 41 54 49 4f 4e 0a 20 20 2f 2a 20 4f 6e 6c 79 20  ATION.  /* Only 
2820: 74 68 65 20 61 64 6d 69 6e 20 75 73 65 72 20 69  the admin user i
2830: 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6b 6e 6f  s allowed to kno
2840: 77 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  w that the sqlit
2850: 65 5f 75 73 65 72 20 74 61 62 6c 65 0a 20 20 2a  e_user table.  *
2860: 2a 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 66  * exists */.  if
2870: 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74 68 4c  ( db->auth.authL
2880: 65 76 65 6c 3c 55 41 55 54 48 5f 41 64 6d 69 6e  evel<UAUTH_Admin
2890: 20 26 26 20 73 71 6c 69 74 65 33 55 73 65 72 41   && sqlite3UserA
28a0: 75 74 68 54 61 62 6c 65 28 7a 4e 61 6d 65 29 21  uthTable(zName)!
28b0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
28c0: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
28d0: 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50   for(i=OMIT_TEMP
28e0: 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  DB; i<db->nDb; i
28f0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  ++){.    int j =
2900: 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69   (i<2) ? i^1 : i
2910: 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  ;   /* Search TE
2920: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
2930: 2f 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61 62  /.    if( zDatab
2940: 61 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74 65  ase!=0 && sqlite
2950: 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62 61  3StrICmp(zDataba
2960: 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a  se, db->aDb[j].z
2970: 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  Name) ) continue
2980: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
2990: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
29a0: 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29  Held(db, j, 0) )
29b0: 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  ;.    p = sqlite
29c0: 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
29d0: 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e 74  Db[j].pSchema->t
29e0: 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a  blHash, zName);.
29f0: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
2a00: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
2a10: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  p;.}../*.** Loca
2a20: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
2a30: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2a40: 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74  describes a part
2a50: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a  icular database.
2a60: 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  ** table given t
2a70: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
2a80: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
2a90: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
2aa0: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
2ab0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
2ac0: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
2ad0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
2ae0: 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20  nd.  Also leave 
2af0: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73  an.** error mess
2b00: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
2b10: 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ErrMsg..**.** Th
2b20: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
2b30: 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
2b40: 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  e and sqlite3Fin
2b50: 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74  dTable() is that
2b60: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
2b70: 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72   leaves an error
2b80: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
2b90: 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72  se->zErrMsg wher
2ba0: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64  e.** sqlite3Find
2bb0: 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74  Table() does not
2bc0: 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69  ..*/.Table *sqli
2bd0: 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a  te3LocateTable(.
2be0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74           /* cont
2c00: 65 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ext in which to 
2c10: 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f  report errors */
2c20: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20  .  int isView,  
2c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2c40: 65 20 69 66 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  e if looking for
2c50: 20 61 20 56 49 45 57 20 72 61 74 68 65 72 20 74   a VIEW rather t
2c60: 68 61 6e 20 61 20 54 41 42 4c 45 20 2a 2f 0a 20  han a TABLE */. 
2c70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2c80: 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me,     /* Name 
2c90: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20  of the table we 
2ca0: 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  are looking for 
2cb0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2cc0: 2a 7a 44 62 61 73 65 20 20 20 20 20 2f 2a 20 4e  *zDbase     /* N
2cd0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
2ce0: 61 73 65 2e 20 20 4d 69 67 68 74 20 62 65 20 4e  ase.  Might be N
2cf0: 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ULL */.){.  Tabl
2d00: 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  e *p;..  /* Read
2d10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2d20: 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f  hema. If an erro
2d30: 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
2d40: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2d50: 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69  .  ** and code i
2d60: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
2d70: 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69  urn NULL. */.  i
2d80: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
2d90: 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
2da0: 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72  pParse) ){.    r
2db0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
2dc0: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  p = sqlite3FindT
2dd0: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
2de0: 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b   zName, zDbase);
2df0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
2e00: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2e10: 4d 73 67 20 3d 20 69 73 56 69 65 77 20 3f 20 22  Msg = isView ? "
2e20: 6e 6f 20 73 75 63 68 20 76 69 65 77 22 20 3a 20  no such view" : 
2e30: 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b  "no such table";
2e40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e50: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2e60: 45 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  E.    if( sqlite
2e70: 33 46 69 6e 64 44 62 4e 61 6d 65 28 70 50 61 72  3FindDbName(pPar
2e80: 73 65 2d 3e 64 62 2c 20 7a 44 62 61 73 65 29 3c  se->db, zDbase)<
2e90: 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  1 ){.      /* If
2ea0: 20 7a 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 6f   zName is the no
2eb0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
2ec0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 73 63 68  table in the sch
2ed0: 65 6d 61 20 63 72 65 61 74 65 64 20 75 73 69 6e  ema created usin
2ee0: 67 0a 20 20 20 20 20 20 2a 2a 20 43 52 45 41 54  g.      ** CREAT
2ef0: 45 2c 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f  E, then check to
2f00: 20 73 65 65 20 69 66 20 69 74 20 69 73 20 74 68   see if it is th
2f10: 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 76 69 72  e name of an vir
2f20: 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74 0a  tual table that.
2f30: 20 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20        ** can be 
2f40: 61 6e 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72  an eponymous vir
2f50: 74 75 61 6c 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  tual table. */. 
2f60: 20 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d 6f       Module *pMo
2f70: 64 20 3d 20 28 4d 6f 64 75 6c 65 2a 29 73 71 6c  d = (Module*)sql
2f80: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 50  ite3HashFind(&pP
2f90: 61 72 73 65 2d 3e 64 62 2d 3e 61 4d 6f 64 75 6c  arse->db->aModul
2fa0: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
2fb0: 20 69 66 28 20 70 4d 6f 64 20 26 26 20 73 71 6c   if( pMod && sql
2fc0: 69 74 65 33 56 74 61 62 45 70 6f 6e 79 6d 6f 75  ite3VtabEponymou
2fd0: 73 54 61 62 6c 65 49 6e 69 74 28 70 50 61 72 73  sTableInit(pPars
2fe0: 65 2c 20 70 4d 6f 64 29 20 29 7b 0a 20 20 20 20  e, pMod) ){.    
2ff0: 20 20 20 20 72 65 74 75 72 6e 20 70 4d 6f 64 2d      return pMod-
3000: 3e 70 45 70 6f 54 61 62 3b 0a 20 20 20 20 20 20  >pEpoTab;.      
3010: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
3020: 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29 7b     if( zDbase ){
3030: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
3040: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3050: 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73 67  %s: %s.%s", zMsg
3060: 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65 29  , zDbase, zName)
3070: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
3080: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3090: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20  sg(pParse, "%s: 
30a0: 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65  %s", zMsg, zName
30b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
30c0: 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
30d0: 20 3d 20 31 3b 0a 20 20 7d 0a 23 69 66 20 53 51   = 1;.  }.#if SQ
30e0: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
30f0: 54 49 43 41 54 49 4f 4e 0a 20 20 65 6c 73 65 20  TICATION.  else 
3100: 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
3110: 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3c 55  auth.authLevel<U
3120: 41 55 54 48 5f 55 73 65 72 20 29 7b 0a 20 20 20  AUTH_User ){.   
3130: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3140: 28 70 50 61 72 73 65 2c 20 22 75 73 65 72 20 6e  (pParse, "user n
3150: 6f 74 20 61 75 74 68 65 6e 74 69 63 61 74 65 64  ot authenticated
3160: 22 29 3b 0a 20 20 20 20 70 20 3d 20 30 3b 0a 20  ");.    p = 0;. 
3170: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
3180: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  rn p;.}../*.** L
3190: 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
31a0: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 2a 70  identified by *p
31b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
31c0: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
31d0: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
31e0: 62 6c 65 28 29 2e 20 54 68 65 20 64 69 66 66 65  ble(). The diffe
31f0: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 0a 2a 2a  rence between.**
3200: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
3210: 62 6c 65 28 29 20 61 6e 64 20 74 68 69 73 20 66  ble() and this f
3220: 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 61 74 20  unction is that 
3230: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
3240: 73 74 72 69 63 74 73 0a 2a 2a 20 74 68 65 20 73  stricts.** the s
3250: 65 61 72 63 68 20 74 6f 20 73 63 68 65 6d 61 20  earch to schema 
3260: 28 70 2d 3e 70 53 63 68 65 6d 61 29 20 69 66 20  (p->pSchema) if 
3270: 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20  it is not NULL. 
3280: 70 2d 3e 70 53 63 68 65 6d 61 20 6d 61 79 20 62  p->pSchema may b
3290: 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66  e.** non-NULL if
32a0: 20 69 74 20 69 73 20 70 61 72 74 20 6f 66 20 61   it is part of a
32b0: 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72   view or trigger
32c0: 20 70 72 6f 67 72 61 6d 20 64 65 66 69 6e 69 74   program definit
32d0: 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 73 71 6c 69  ion. See.** sqli
32e0: 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 29 20  te3FixSrcList() 
32f0: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
3300: 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f  Table *sqlite3Lo
3310: 63 61 74 65 54 61 62 6c 65 49 74 65 6d 28 0a 20  cateTableItem(. 
3320: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
3330: 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 0a  .  int isView, .
3340: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
3350: 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f  _item *p.){.  co
3360: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
3370: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 63 68   assert( p->pSch
3380: 65 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61  ema==0 || p->zDa
3390: 74 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20 20 69  tabase==0 );.  i
33a0: 66 28 20 70 2d 3e 70 53 63 68 65 6d 61 20 29 7b  f( p->pSchema ){
33b0: 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73  .    int iDb = s
33c0: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
33d0: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
33e0: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  p->pSchema);.   
33f0: 20 7a 44 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   zDb = pParse->d
3400: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
3410: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
3420: 7a 44 62 20 3d 20 70 2d 3e 7a 44 61 74 61 62 61  zDb = p->zDataba
3430: 73 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  se;.  }.  return
3440: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
3450: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 73 56 69  ble(pParse, isVi
3460: 65 77 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 44  ew, p->zName, zD
3470: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  b);.}../*.** Loc
3480: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
3490: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
34a0: 20 64 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61   describes .** a
34b0: 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
34c0: 78 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  x given the name
34d0: 20 6f 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a   of that index.*
34e0: 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f  * and the name o
34f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
3500: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
3510: 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72   index..** Retur
3520: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
3530: 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44  und..**.** If zD
3540: 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c  atabase is 0, al
3550: 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  l databases are 
3560: 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65  searched for the
3570: 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68  .** table and th
3580: 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
3590: 20 69 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e   index is return
35a0: 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e  ed.  (No checkin
35b0: 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61  g.** for duplica
35c0: 74 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69  te index names i
35d0: 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65  s done.)  The se
35e0: 61 72 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a  arch order is.**
35f0: 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65   TEMP first, the
3600: 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79  n MAIN, then any
3610: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
3620: 61 73 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73  ases added.** us
3630: 69 6e 67 20 74 68 65 20 41 54 54 41 43 48 20 63  ing the ATTACH c
3640: 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78  ommand..*/.Index
3650: 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64   *sqlite3FindInd
3660: 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ex(sqlite3 *db, 
3670: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
3680: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
3690: 44 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20  Db){.  Index *p 
36a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
36b0: 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73 20 61  /* All mutexes a
36c0: 72 65 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  re required for 
36d0: 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e 20 20  schema access.  
36e0: 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 6f 6c  Make sure we hol
36f0: 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61 73 73  d them. */.  ass
3700: 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c 20 73  ert( zDb!=0 || s
3710: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
3720: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
3730: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
3740: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
3750: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
3760: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
3770: 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20  : i;  /* Search 
3780: 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e  TEMP before MAIN
3790: 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a   */.    Schema *
37a0: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
37b0: 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  b[j].pSchema;.  
37c0: 20 20 61 73 73 65 72 74 28 20 70 53 63 68 65 6d    assert( pSchem
37d0: 61 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  a );.    if( zDb
37e0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
37f0: 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b  mp(zDb, db->aDb[
3800: 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74  j].zName) ) cont
3810: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
3820: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
3830: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20  utexHeld(db, j, 
3840: 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71  0) );.    p = sq
3850: 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70  lite3HashFind(&p
3860: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
3870: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   zName);.    if(
3880: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
3890: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
38a0: 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20 74 68 65  *.** Reclaim the
38b0: 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
38c0: 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74  an index.*/.stat
38d0: 69 63 20 76 6f 69 64 20 66 72 65 65 49 6e 64 65  ic void freeInde
38e0: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  x(sqlite3 *db, I
38f0: 6e 64 65 78 20 2a 70 29 7b 0a 23 69 66 6e 64 65  ndex *p){.#ifnde
3900: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e  f SQLITE_OMIT_AN
3910: 41 4c 59 5a 45 0a 20 20 73 71 6c 69 74 65 33 44  ALYZE.  sqlite3D
3920: 65 6c 65 74 65 49 6e 64 65 78 53 61 6d 70 6c 65  eleteIndexSample
3930: 73 28 64 62 2c 20 70 29 3b 0a 23 65 6e 64 69 66  s(db, p);.#endif
3940: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
3950: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61 72  lete(db, p->pPar
3960: 74 49 64 78 57 68 65 72 65 29 3b 0a 20 20 73 71  tIdxWhere);.  sq
3970: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
3980: 65 74 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 45  ete(db, p->aColE
3990: 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  xpr);.  sqlite3D
39a0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43 6f  bFree(db, p->zCo
39b0: 6c 41 66 66 29 3b 0a 20 20 69 66 28 20 70 2d 3e  lAff);.  if( p->
39c0: 69 73 52 65 73 69 7a 65 64 20 29 20 73 71 6c 69  isResized ) sqli
39d0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
39e0: 3e 61 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66  >azColl);.#ifdef
39f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
3a00: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
3a10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
3a20: 61 69 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69  aiRowEst);.#endi
3a30: 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  f.  sqlite3DbFre
3a40: 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  e(db, p);.}../*.
3a50: 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78  ** For the index
3a60: 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65   called zIdxName
3a70: 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20   which is found 
3a80: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
3a90: 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74  iDb,.** unlike t
3aa0: 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69  hat index from i
3ab0: 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65  ts Table then re
3ac0: 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66  move the index f
3ad0: 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78  rom.** the index
3ae0: 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20   hash table and 
3af0: 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  free all memory 
3b00: 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63  structures assoc
3b10: 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
3b20: 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64  e index..*/.void
3b30: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
3b40: 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c  dDeleteIndex(sql
3b50: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
3b60: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
3b70: 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65  IdxName){.  Inde
3b80: 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61 73  x *pIndex;.  Has
3b90: 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73  h *pHash;..  ass
3ba0: 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
3bb0: 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
3bc0: 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61  iDb, 0) );.  pHa
3bd0: 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  sh = &db->aDb[iD
3be0: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  b].pSchema->idxH
3bf0: 61 73 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20  ash;.  pIndex = 
3c00: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
3c10: 74 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d  t(pHash, zIdxNam
3c20: 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57  e, 0);.  if( ALW
3c30: 41 59 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20  AYS(pIndex) ){. 
3c40: 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70     if( pIndex->p
3c50: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70  Table->pIndex==p
3c60: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70  Index ){.      p
3c70: 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70  Index->pTable->p
3c80: 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e  Index = pIndex->
3c90: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
3ca0: 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
3cb0: 3b 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69  ;.      /* Justi
3cc0: 66 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41  fication of ALWA
3cd0: 59 53 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78  YS();  The index
3ce0: 20 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20   must be on the 
3cf0: 6c 69 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a  list of.      **
3d00: 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20   indices. */.   
3d10: 20 20 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70     p = pIndex->p
3d20: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20  Table->pIndex;. 
3d30: 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41       while( ALWA
3d40: 59 53 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78  YS(p) && p->pNex
3d50: 74 21 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d  t!=pIndex ){ p =
3d60: 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20   p->pNext; }.   
3d70: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 20     if( ALWAYS(p 
3d80: 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  && p->pNext==pIn
3d90: 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  dex) ){.        
3da0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  p->pNext = pInde
3db0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  x->pNext;.      
3dc0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
3dd0: 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78  Index(db, pIndex
3de0: 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61  );.  }.  db->fla
3df0: 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
3e00: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
3e10: 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67  *.** Look throug
3e20: 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70  h the list of op
3e30: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
3e40: 73 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61  s in db->aDb[] a
3e50: 6e 64 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76  nd if.** any hav
3e60: 65 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72  e been closed, r
3e70: 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20  emove them from 
3e80: 74 68 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c  the list.  Reall
3e90: 6f 63 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d  ocate the.** db-
3ea0: 3e 61 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65  >aDb[] structure
3eb0: 20 74 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69   to a smaller si
3ec0: 7a 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e  ze, if possible.
3ed0: 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28  .**.** Entry 0 (
3ee0: 74 68 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62  the "main" datab
3ef0: 61 73 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31  ase) and entry 1
3f00: 20 28 74 68 65 20 22 74 65 6d 70 22 20 64 61 74   (the "temp" dat
3f10: 61 62 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65  abase).** are ne
3f20: 76 65 72 20 63 61 6e 64 69 64 61 74 65 73 20 66  ver candidates f
3f30: 6f 72 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73  or being collaps
3f40: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
3f50: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
3f60: 61 73 65 41 72 72 61 79 28 73 71 6c 69 74 65 33  aseArray(sqlite3
3f70: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20   *db){.  int i, 
3f80: 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20  j;.  for(i=j=2; 
3f90: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
3fa0: 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a  .    struct Db *
3fb0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
3fc0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
3fd0: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
3fe0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3ff0: 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  , pDb->zName);. 
4000: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20       pDb->zName 
4010: 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 0;.      conti
4020: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
4030: 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20  f( j<i ){.      
4040: 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d  db->aDb[j] = db-
4050: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  >aDb[i];.    }. 
4060: 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65     j++;.  }.  me
4070: 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  mset(&db->aDb[j]
4080: 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29  , 0, (db->nDb-j)
4090: 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b  *sizeof(db->aDb[
40a0: 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20  j]));.  db->nDb 
40b0: 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e  = j;.  if( db->n
40c0: 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62  Db<=2 && db->aDb
40d0: 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20  !=db->aDbStatic 
40e0: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62  ){.    memcpy(db
40f0: 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d  ->aDbStatic, db-
4100: 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64  >aDb, 2*sizeof(d
4110: 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20  b->aDb[0]));.   
4120: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4130: 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20  b, db->aDb);.   
4140: 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
4150: 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a  DbStatic;.  }.}.
4160: 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68 65  ./*.** Reset the
4170: 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20   schema for the 
4180: 64 61 74 61 62 61 73 65 20 61 74 20 69 6e 64 65  database at inde
4190: 78 20 69 44 62 2e 20 20 41 6c 73 6f 20 72 65 73  x iDb.  Also res
41a0: 65 74 20 74 68 65 0a 2a 2a 20 54 45 4d 50 20 73  et the.** TEMP s
41b0: 63 68 65 6d 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73  chema..*/.void s
41c0: 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63  qlite3ResetOneSc
41d0: 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62  hema(sqlite3 *db
41e0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 44 62  , int iDb){.  Db
41f0: 20 2a 70 44 62 3b 0a 20 20 61 73 73 65 72 74 28   *pDb;.  assert(
4200: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
4210: 0a 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 52  .  /* Case 1:  R
4220: 65 73 65 74 20 74 68 65 20 73 69 6e 67 6c 65 20  eset the single 
4230: 73 63 68 65 6d 61 20 69 64 65 6e 74 69 66 69 65  schema identifie
4240: 64 20 62 79 20 69 44 62 20 2a 2f 0a 20 20 70 44  d by iDb */.  pD
4250: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
4260: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ];.  assert( sql
4270: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
4280: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
4290: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
42a0: 2d 3e 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a  ->pSchema!=0 );.
42b0: 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43    sqlite3SchemaC
42c0: 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d  lear(pDb->pSchem
42d0: 61 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79  a);..  /* If any
42e0: 20 64 61 74 61 62 61 73 65 20 6f 74 68 65 72 20   database other 
42f0: 74 68 61 6e 20 54 45 4d 50 20 69 73 20 72 65 73  than TEMP is res
4300: 65 74 2c 20 74 68 65 6e 20 61 6c 73 6f 20 72 65  et, then also re
4310: 73 65 74 20 54 45 4d 50 0a 20 20 2a 2a 20 73 69  set TEMP.  ** si
4320: 6e 63 65 20 54 45 4d 50 20 6d 69 67 68 74 20 62  nce TEMP might b
4330: 65 20 68 6f 6c 64 69 6e 67 20 74 72 69 67 67 65  e holding trigge
4340: 72 73 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  rs that referenc
4350: 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a  e tables in the.
4360: 20 20 2a 2a 20 6f 74 68 65 72 20 64 61 74 61 62    ** other datab
4370: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
4380: 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 70 44  iDb!=1 ){.    pD
4390: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 31 5d 3b  b = &db->aDb[1];
43a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62  .    assert( pDb
43b0: 2d 3e 70 53 63 68 65 6d 61 21 3d 30 20 29 3b 0a  ->pSchema!=0 );.
43c0: 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d      sqlite3Schem
43d0: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
43e0: 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ema);.  }.  retu
43f0: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  rn;.}../*.** Era
4400: 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e  se all schema in
4410: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61  formation from a
4420: 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
4430: 62 61 73 65 73 20 28 69 6e 63 6c 75 64 69 6e 67  bases (including
4440: 0a 2a 2a 20 22 6d 61 69 6e 22 20 61 6e 64 20 22  .** "main" and "
4450: 74 65 6d 70 22 29 20 66 6f 72 20 61 20 73 69 6e  temp") for a sin
4460: 67 6c 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  gle database con
4470: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
4480: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
4490: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
44a0: 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ion(sqlite3 *db)
44b0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
44c0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
44d0: 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30  l(db);.  for(i=0
44e0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
44f0: 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d  ){.    Db *pDb =
4500: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
4510: 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
4520: 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ma ){.      sqli
4530: 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 70  te3SchemaClear(p
4540: 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Db->pSchema);.  
4550: 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c    }.  }.  db->fl
4560: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49  ags &= ~SQLITE_I
4570: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
4580: 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63  sqlite3VtabUnloc
4590: 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c  kList(db);.  sql
45a0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
45b0: 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33  l(db);.  sqlite3
45c0: 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73 65  CollapseDatabase
45d0: 41 72 72 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f 2a  Array(db);.}../*
45e0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
45f0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
4600: 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73 2e  a commit occurs.
4610: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4620: 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
4630: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
4640: 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  b){.  db->flags 
4650: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
4660: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
4670: 2a 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72 79  ** Delete memory
4680: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
4690: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
46a0: 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69  of a table or vi
46b0: 65 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c 65  ew (the.** Table
46c0: 2e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e 0a  .aCol[] array)..
46d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
46e0: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
46f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
4700: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
4710: 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20  int i;.  Column 
4720: 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28  *pCol;.  assert(
4730: 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20   pTable!=0 );.  
4740: 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62  if( (pCol = pTab
4750: 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a  le->aCol)!=0 ){.
4760: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4770: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  Table->nCol; i++
4780: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
4790: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
47a0: 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b  b, pCol->zName);
47b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
47c0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f  prDelete(db, pCo
47d0: 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20  l->pDflt);.     
47e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
47f0: 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b  b, pCol->zDflt);
4800: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
4810: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a  Free(db, pCol->z
4820: 54 79 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Type);.      sql
4830: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4840: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Col->zColl);.   
4850: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
4860: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d  Free(db, pTable-
4870: 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  >aCol);.  }.}../
4880: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
4890: 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75  memory data stru
48a0: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
48b0: 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
48c0: 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63  .** Table.  No c
48d0: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
48e0: 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20  to disk by this 
48f0: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
4900: 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
4910: 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74   deletes the dat
4920: 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74  a structure.  It
4930: 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b   does not unlink
4940: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61  .** the table da
4950: 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ta structure fro
4960: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
4970: 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64  .  But it does d
4980: 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79  estroy.** memory
4990: 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74   structures of t
49a0: 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  he indices and f
49b0: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
49c0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
49d0: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
49e0: 20 54 68 65 20 64 62 20 70 61 72 61 6d 65 74 65   The db paramete
49f0: 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  r is optional.  
4a00: 49 74 20 69 73 20 6e 65 65 64 65 64 20 69 66 20  It is needed if 
4a10: 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74  the Table object
4a20: 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f   .** contains lo
4a30: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20  okaside memory. 
4a40: 20 28 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20   (Table objects 
4a50: 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 64 6f  in the schema do
4a60: 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b   not use.** look
4a70: 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75  aside memory, bu
4a80: 74 20 73 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c  t some ephemeral
4a90: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 64   Table objects d
4aa0: 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64  o.)  Or the.** d
4ab0: 62 20 70 61 72 61 6d 65 74 65 72 20 63 61 6e 20  b parameter can 
4ac0: 62 65 20 75 73 65 64 20 77 69 74 68 20 64 62 2d  be used with db-
4ad0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 74 6f  >pnBytesFreed to
4ae0: 20 6d 65 61 73 75 72 65 20 74 68 65 20 6d 65 6d   measure the mem
4af0: 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74  ory.** used by t
4b00: 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e  he Table object.
4b10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4b20: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
4b30: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
4b40: 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78  pTable){.  Index
4b50: 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74   *pIndex, *pNext
4b60: 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 69 6e  ;.  TESTONLY( in
4b70: 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 3b 20 29 20  t nLookaside; ) 
4b80: 2f 2a 20 55 73 65 64 20 74 6f 20 76 65 72 69 66  /* Used to verif
4b90: 79 20 6c 6f 6f 6b 61 73 69 64 65 20 6e 6f 74 20  y lookaside not 
4ba0: 75 73 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20  used for schema 
4bb0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70  */..  assert( !p
4bc0: 54 61 62 6c 65 20 7c 7c 20 70 54 61 62 6c 65 2d  Table || pTable-
4bd0: 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a  >nRef>0 );..  /*
4be0: 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   Do not delete t
4bf0: 68 65 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74  he table until t
4c00: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
4c10: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  nt reaches zero.
4c20: 20 2a 2f 0a 20 20 69 66 28 20 21 70 54 61 62 6c   */.  if( !pTabl
4c30: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  e ) return;.  if
4c40: 28 20 28 28 21 64 62 20 7c 7c 20 64 62 2d 3e 70  ( ((!db || db->p
4c50: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20  nBytesFreed==0) 
4c60: 26 26 20 28 2d 2d 70 54 61 62 6c 65 2d 3e 6e 52  && (--pTable->nR
4c70: 65 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b  ef)>0) ) return;
4c80: 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68  ..  /* Record th
4c90: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73  e number of outs
4ca0: 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73 69 64  tanding lookasid
4cb0: 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 69 6e  e allocations in
4cc0: 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73 0a 20   schema Tables. 
4cd0: 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 64 6f 69   ** prior to doi
4ce0: 6e 67 20 61 6e 79 20 66 72 65 65 28 29 20 6f 70  ng any free() op
4cf0: 65 72 61 74 69 6f 6e 73 2e 20 20 53 69 6e 63 65  erations.  Since
4d00: 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73 20 64   schema Tables d
4d10: 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a 20 6c  o not use.  ** l
4d20: 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69 73 20 6e  ookaside, this n
4d30: 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74  umber should not
4d40: 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20 54 45   change. */.  TE
4d50: 53 54 4f 4e 4c 59 28 20 6e 4c 6f 6f 6b 61 73 69  STONLY( nLookasi
4d60: 64 65 20 3d 20 28 64 62 20 26 26 20 28 70 54 61  de = (db && (pTa
4d70: 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  ble->tabFlags & 
4d80: 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30  TF_Ephemeral)==0
4d90: 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) ?.            
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d               db-
4db0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
4dc0: 3a 20 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c  : 0 );..  /* Del
4dd0: 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ete all indices 
4de0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4df0: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
4e00: 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54   for(pIndex = pT
4e10: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
4e20: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65  ndex; pIndex=pNe
4e30: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
4e40: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
4e50: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
4e60: 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  ex->pSchema==pTa
4e70: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  ble->pSchema );.
4e80: 20 20 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64      if( !db || d
4e90: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
4ea0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  =0 ){.      char
4eb0: 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 78   *zName = pIndex
4ec0: 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 20  ->zName; .      
4ed0: 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 78  TESTONLY ( Index
4ee0: 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 74   *pOld = ) sqlit
4ef0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a 20 20  e3HashInsert(.  
4f00: 20 20 20 20 20 20 20 26 70 49 6e 64 65 78 2d 3e         &pIndex->
4f10: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
4f20: 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20 20  , zName, 0.     
4f30: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
4f40: 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ( db==0 || sqlit
4f50: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
4f60: 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d  d(db, 0, pIndex-
4f70: 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20  >pSchema) );.   
4f80: 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d     assert( pOld=
4f90: 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64 3d  =pIndex || pOld=
4fa0: 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
4fb0: 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49  freeIndex(db, pI
4fc0: 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ndex);.  }..  /*
4fd0: 20 44 65 6c 65 74 65 20 61 6e 79 20 66 6f 72 65   Delete any fore
4fe0: 69 67 6e 20 6b 65 79 73 20 61 74 74 61 63 68 65  ign keys attache
4ff0: 64 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 2e  d to this table.
5000: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 6b 44   */.  sqlite3FkD
5010: 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65  elete(db, pTable
5020: 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20  );..  /* Delete 
5030: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
5040: 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f  ure itself..  */
5050: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  .  sqlite3Delete
5060: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20  ColumnNames(db, 
5070: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
5080: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
5090: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  ble->zName);.  s
50a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
50b0: 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66   pTable->zColAff
50c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
50d0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  ctDelete(db, pTa
50e0: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  ble->pSelect);. 
50f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5100: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c  Delete(db, pTabl
5110: 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 69 66 6e  e->pCheck);.#ifn
5120: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5130: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73  VIRTUALTABLE.  s
5140: 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72 28  qlite3VtabClear(
5150: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 23 65 6e  db, pTable);.#en
5160: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46  dif.  sqlite3DbF
5170: 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ree(db, pTable);
5180: 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68  ..  /* Verify th
5190: 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64 65 20  at no lookaside 
51a0: 6d 65 6d 6f 72 79 20 77 61 73 20 75 73 65 64 20  memory was used 
51b0: 62 79 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73  by schema tables
51c0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4c   */.  assert( nL
51d0: 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c 7c 20 6e  ookaside==0 || n
51e0: 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64 62 2d 3e 6c  Lookaside==db->l
51f0: 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29 3b  ookaside.nOut );
5200: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
5210: 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65   the given table
5220: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
5230: 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65  ables and the de
5240: 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c  lete the.** tabl
5250: 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  e structure with
5260: 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73   all its indices
5270: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
5280: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
5290: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
52a0: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  eTable(sqlite3 *
52b0: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
52c0: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d  st char *zTabNam
52d0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
52e0: 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73    Db *pDb;..  as
52f0: 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
5300: 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
5310: 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
5320: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61 62  ;.  assert( zTab
5330: 4e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Name );.  assert
5340: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
5350: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
5360: 2c 20 30 29 20 29 3b 0a 20 20 74 65 73 74 63 61  , 0) );.  testca
5370: 73 65 28 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d  se( zTabName[0]=
5380: 3d 30 20 29 3b 20 20 2f 2a 20 5a 65 72 6f 2d 6c  =0 );  /* Zero-l
5390: 65 6e 67 74 68 20 74 61 62 6c 65 20 6e 61 6d 65  ength table name
53a0: 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 2a 2f  s are allowed */
53b0: 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
53c0: 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71  b[iDb];.  p = sq
53d0: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
53e0: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
53f0: 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65  blHash, zTabName
5400: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  , 0);.  sqlite3D
5410: 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
5420: 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  );.  db->flags |
5430: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
5440: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
5450: 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20   Given a token, 
5460: 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  return a string 
5470: 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
5480: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 61   the text of tha
5490: 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61  t.** token.  Spa
54a0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
54b0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
54c0: 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
54d0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
54e0: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
54f0: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
5500: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ng.** function..
5510: 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74  **.** Any quotat
5520: 69 6f 6e 20 6d 61 72 6b 73 20 28 65 78 3a 20 20  ion marks (ex:  
5530: 22 6e 61 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20  "name", 'name', 
5540: 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65  [name], or `name
5550: 60 29 20 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f  `) that.** surro
5560: 75 6e 64 20 74 68 65 20 62 6f 64 79 20 6f 66 20  und the body of 
5570: 74 68 65 20 74 6f 6b 65 6e 20 61 72 65 20 72 65  the token are re
5580: 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b  moved..**.** Tok
5590: 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75  ens are often ju
55a0: 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f  st pointers into
55b0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
55c0: 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a  L text and so.**
55d0: 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65   are not \000 te
55e0: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65  rminated and are
55f0: 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e   not persistent.
5600: 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73    The returned s
5610: 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30  tring.** is \000
5620: 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20   terminated and 
5630: 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a  is persistent..*
5640: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e  /.char *sqlite3N
5650: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c  ameFromToken(sql
5660: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
5670: 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  *pName){.  char 
5680: 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e  *zName;.  if( pN
5690: 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
56a0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
56b0: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
56c0: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
56d0: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  n);.    sqlite3D
56e0: 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20  equote(zName);. 
56f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d   }else{.    zNam
5700: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
5710: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  urn zName;.}../*
5720: 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c  .** Open the sql
5730: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
5740: 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62   stored in datab
5750: 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66  ase number iDb f
5760: 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54  or.** writing. T
5770: 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e  he table is open
5780: 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20  ed using cursor 
5790: 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  0..*/.void sqlit
57a0: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
57b0: 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20  e(Parse *p, int 
57c0: 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  iDb){.  Vdbe *v 
57d0: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
57e0: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61  (p);.  sqlite3Ta
57f0: 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20  bleLock(p, iDb, 
5800: 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20  MASTER_ROOT, 1, 
5810: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
5820: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  ));.  sqlite3Vdb
5830: 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50  eAddOp4Int(v, OP
5840: 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20 4d  _OpenWrite, 0, M
5850: 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44 62 2c  ASTER_ROOT, iDb,
5860: 20 35 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 54   5);.  if( p->nT
5870: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  ab==0 ){.    p->
5880: 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  nTab = 1;.  }.}.
5890: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
58a0: 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f   zName points to
58b0: 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
58c0: 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  d buffer contain
58d0: 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20  ing the name.** 
58e0: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28 22  of a database ("
58f0: 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 6f 72  main", "temp" or
5900: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
5910: 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68  attached db). Th
5920: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  is.** function r
5930: 65 74 75 72 6e 73 20 74 68 65 20 69 6e 64 65 78  eturns the index
5940: 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61   of the named da
5950: 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44  tabase in db->aD
5960: 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69 66  b[], or.** -1 if
5970: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 63 61   the named db ca
5980: 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
5990: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e  /.int sqlite3Fin
59a0: 64 44 62 4e 61 6d 65 28 73 71 6c 69 74 65 33 20  dDbName(sqlite3 
59b0: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
59c0: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
59d0: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f   = -1;         /
59e0: 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65  * Database numbe
59f0: 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61 6d 65  r */.  if( zName
5a00: 20 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 3b   ){.    Db *pDb;
5a10: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c  .    int n = sql
5a20: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
5a30: 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28  me);.    for(i=(
5a40: 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d  db->nDb-1), pDb=
5a50: 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d  &db->aDb[i]; i>=
5a60: 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a  0; i--, pDb--){.
5a70: 20 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49 54        if( (!OMIT
5a80: 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20  _TEMPDB || i!=1 
5a90: 29 20 26 26 20 6e 3d 3d 73 71 6c 69 74 65 33 53  ) && n==sqlite3S
5aa0: 74 72 6c 65 6e 33 30 28 70 44 62 2d 3e 7a 4e 61  trlen30(pDb->zNa
5ab0: 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  me) && .        
5ac0: 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49    0==sqlite3StrI
5ad0: 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20  Cmp(pDb->zName, 
5ae0: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
5af0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5b00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5b10: 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn i;.}../*.** 
5b20: 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65  The token *pName
5b30: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
5b40: 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  me of a database
5b50: 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20   (either "main" 
5b60: 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20  or.** "temp" or 
5b70: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61  the name of an a
5b80: 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69  ttached db). Thi
5b90: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
5ba0: 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f  s the.** index o
5bb0: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61  f the named data
5bc0: 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b  base in db->aDb[
5bd0: 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20  ], or -1 if the 
5be0: 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65  named db .** doe
5bf0: 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a  s not exist..*/.
5c00: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44  int sqlite3FindD
5c10: 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  b(sqlite3 *db, T
5c20: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
5c30: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
5c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c50: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
5c60: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61   number */.  cha
5c70: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c90: 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65    /* Name we are
5ca0: 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a   searching for *
5cb0: 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  zName = sqli
5cc0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
5cd0: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  (db, pName);.  i
5ce0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62   = sqlite3FindDb
5cf0: 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Name(db, zName);
5d00: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
5d10: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  (db, zName);.  r
5d20: 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54  eturn i;.}../* T
5d30: 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77  he table or view
5d40: 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65   or trigger name
5d50: 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68   is passed to th
5d60: 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74  is routine via t
5d70: 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20  okens.** pName1 
5d80: 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74  and pName2. If t
5d90: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61  he table name wa
5da0: 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  s fully qualifie
5db0: 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a  d, for example:.
5dc0: 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42  **.** CREATE TAB
5dd0: 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29  LE xxx.yyy (...)
5de0: 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e  ;.** .** Then pN
5df0: 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22  ame1 is set to "
5e00: 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20  xxx" and pName2 
5e10: 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74  "yyy". On the ot
5e20: 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74  her hand if.** t
5e30: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73  he table name is
5e40: 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69   not fully quali
5e50: 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a  fied, i.e.:.**.*
5e60: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79  * CREATE TABLE y
5e70: 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54  yy(...);.**.** T
5e80: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
5e90: 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70  t to "yyy" and p
5ea0: 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a  Name2 is ""..**.
5eb0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5ec0: 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75  sets the *ppUnqu
5ed0: 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f  al pointer to po
5ee0: 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e  int at the token
5ef0: 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70   (pName1 or.** p
5f00: 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72  Name2) that stor
5f10: 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69  es the unqualifi
5f20: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20  ed table name.  
5f30: 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  The index of the
5f40: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78 78  .** database "xx
5f50: 78 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  x" is returned..
5f60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77  */.int sqlite3Tw
5f70: 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72  oPartName(.  Par
5f80: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5f90: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
5fa0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
5fb0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
5fc0: 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20  en *pName1,     
5fd0: 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e   /* The "xxx" in
5fe0: 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79   the name "xxx.y
5ff0: 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a  yy" or "xxx" */.
6000: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
6010: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79        /* The "yy
6020: 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22  y" in the name "
6030: 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f  xxx.yyy" */.  To
6040: 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20  ken **pUnqual   
6050: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75    /* Write the u
6060: 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63  nqualified objec
6070: 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29  t name here */.)
6080: 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  {.  int iDb;    
6090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60a0: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
60b0: 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a  ing the object *
60c0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
60d0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
60e0: 20 69 66 28 20 41 4c 57 41 59 53 28 70 4e 61 6d   if( ALWAYS(pNam
60f0: 65 32 21 3d 30 29 20 26 26 20 70 4e 61 6d 65 32  e2!=0) && pName2
6100: 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  ->n>0 ){.    if(
6110: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
6120: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
6130: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6140: 20 22 63 6f 72 72 75 70 74 20 64 61 74 61 62 61   "corrupt databa
6150: 73 65 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  se");.      retu
6160: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
6170: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
6180: 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  e2;.    iDb = sq
6190: 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20  lite3FindDb(db, 
61a0: 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28  pName1);.    if(
61b0: 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20   iDb<0 ){.      
61c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
61d0: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
61e0: 20 64 61 74 61 62 61 73 65 20 25 54 22 2c 20 70   database %T", p
61f0: 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20 72 65  Name1);.      re
6200: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
6210: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
6220: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  rt( db->init.iDb
6230: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e  ==0 || db->init.
6240: 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20  busy );.    iDb 
6250: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
6260: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
6270: 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74  Name1;.  }.  ret
6280: 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn iDb;.}../*.*
6290: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
62a0: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
62b0: 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  if the UTF-8 str
62c0: 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c  ing zName is a l
62d0: 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66  egal.** unqualif
62e0: 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ied name for a n
62f0: 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  ew schema object
6300: 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20   (table, index, 
6310: 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67  view or.** trigg
6320: 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61  er). All names a
6330: 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20  re legal except 
6340: 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e  those that begin
6350: 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
6360: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69  .** "sqlite_" (i
6370: 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f  n upper, lower o
6380: 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54  r mixed case). T
6390: 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  his portion of t
63a0: 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20  he namespace.** 
63b0: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
63c0: 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f  internal use..*/
63d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
63e0: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73  kObjectName(Pars
63f0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
6400: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
6410: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
6420: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
6430: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
6440: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
6450: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
6460: 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65  s & SQLITE_Write
6470: 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20  Schema)==0.     
6480: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
6490: 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65  e3StrNICmp(zName
64a0: 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20  , "sqlite_", 7) 
64b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
64c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
64d0: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65  object name rese
64e0: 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  rved for interna
64f0: 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d  l use: %s", zNam
6500: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
6510: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
6520: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6530: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
6540: 74 75 72 6e 20 74 68 65 20 50 52 49 4d 41 52 59  turn the PRIMARY
6550: 20 4b 45 59 20 69 6e 64 65 78 20 6f 66 20 61 20   KEY index of a 
6560: 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a  table.*/.Index *
6570: 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
6580: 79 49 6e 64 65 78 28 54 61 62 6c 65 20 2a 70 54  yIndex(Table *pT
6590: 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b  ab){.  Index *p;
65a0: 0a 20 20 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70  .  for(p=pTab->p
65b0: 49 6e 64 65 78 3b 20 70 20 26 26 20 21 49 73 50  Index; p && !IsP
65c0: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
65d0: 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d  ); p=p->pNext){}
65e0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
65f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6600: 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
6610: 20 70 49 64 78 20 74 68 61 74 20 63 6f 72 72 65   pIdx that corre
6620: 73 70 6f 6e 64 73 20 74 6f 20 74 61 62 6c 65 0a  sponds to table.
6630: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2e 20  ** column iCol. 
6640: 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 6e 6f   Return -1 if no
6650: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 31 36 20  t found..*/.i16 
6660: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49  sqlite3ColumnOfI
6670: 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 49 64 78  ndex(Index *pIdx
6680: 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a 20 20 69  , i16 iCol){.  i
6690: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
66a0: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
66b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
66c0: 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  iCol==pIdx->aiCo
66d0: 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74 75 72 6e  lumn[i] ) return
66e0: 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   i;.  }.  return
66f0: 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65   -1;.}../*.** Be
6700: 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  gin constructing
6710: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70   a new table rep
6720: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d  resentation in m
6730: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a  emory.  This is.
6740: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  ** the first of 
6750: 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72  several action r
6760: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74  outines that get
6770: 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f   called in respo
6780: 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41  nse.** to a CREA
6790: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
67a0: 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c  nt.  In particul
67b0: 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ar, this routine
67c0: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66   is called.** af
67d0: 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e  ter seeing token
67e0: 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22  s "CREATE" and "
67f0: 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74  TABLE" and the t
6800: 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69  able name. The i
6810: 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73  sTemp.** flag is
6820: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62   true if the tab
6830: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  le should be sto
6840: 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c  red in the auxil
6850: 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  iary database.**
6860: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
6870: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
6880: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
6890: 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68  s is normally th
68a0: 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74  e case.** when t
68b0: 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45  he "TEMP" or "TE
68c0: 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64  MPORARY" keyword
68d0: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
68e0: 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64  en.** CREATE and
68f0: 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68   TABLE..**.** Th
6900: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
6910: 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  rd is initialize
6920: 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61  d and put in pPa
6930: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a  rse->pNewTable..
6940: 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68  ** As more of th
6950: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
6960: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
6970: 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61  ed, additional a
6980: 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65  ction.** routine
6990: 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  s will be called
69a0: 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66   to add more inf
69b0: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73  ormation to this
69c0: 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74   record..** At t
69d0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
69e0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
69f0: 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65  ment, the sqlite
6a00: 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74  3EndTable() rout
6a10: 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
6a20: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
6a30: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66   construction of
6a40: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   the new table r
6a50: 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ecord..*/.void s
6a60: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
6a70: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
6a80: 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63  e,   /* Parser c
6a90: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
6aa0: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20  n *pName1,   /* 
6ab0: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68  First part of th
6ac0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
6ad0: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
6ae0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
6af0: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
6b00: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
6b10: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
6b20: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
6b30: 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p,      /* True 
6b40: 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  if this is a TEM
6b50: 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  P table */.  int
6b60: 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a   isView,      /*
6b70: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
6b80: 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74   a VIEW */.  int
6b90: 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a   isVirtual,   /*
6ba0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
6bb0: 20 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65   a VIRTUAL table
6bc0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
6bd0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
6be0: 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c  hing if table al
6bf0: 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
6c00: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
6c10: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  le;.  char *zNam
6c20: 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61  e = 0; /* The na
6c30: 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  me of the new ta
6c40: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
6c50: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
6c60: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
6c70: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
6c80: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
6c90: 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68  ber to create th
6ca0: 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20  e table in */.  
6cb0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20  Token *pName;   
6cc0: 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
6cd0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
6ce0: 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a  e to create */..
6cf0: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f    /* The table o
6d00: 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63  r view name to c
6d10: 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64 20  reate is passed 
6d20: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
6d30: 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20  via tokens.  ** 
6d40: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
6d50: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
6d60: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
6d70: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
6d80: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
6d90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
6da0: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a  x.yyy (...);.  *
6db0: 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  * .  ** Then pNa
6dc0: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78  me1 is set to "x
6dd0: 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22  xx" and pName2 "
6de0: 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68  yyy". On the oth
6df0: 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20  er hand if.  ** 
6e00: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
6e10: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
6e20: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a  ified, i.e.:.  *
6e30: 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41  *.  ** CREATE TA
6e40: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20  BLE yyy(...);.  
6e50: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  **.  ** Then pNa
6e60: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
6e70: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
6e80: 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  s ""..  **.  ** 
6e90: 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73  The call below s
6ea0: 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f  ets the pName po
6eb0: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
6ec0: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
6ed0: 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d  me1 or.  ** pNam
6ee0: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
6ef0: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
6f00: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
6f10: 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a  variable iDb is.
6f20: 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20    ** set to the 
6f30: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
6f40: 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20 74  abase that the t
6f50: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20  able or view is 
6f60: 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74  to be.  ** creat
6f70: 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44  ed in..  */.  iD
6f80: 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
6f90: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
6fa0: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
6fb0: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  pName);.  if( iD
6fc0: 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
6fd0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
6fe0: 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e   && isTemp && pN
6ff0: 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62  ame2->n>0 && iDb
7000: 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  !=1 ){.    /* If
7010: 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70   creating a temp
7020: 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65   table, the name
7030: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c   may not be qual
7040: 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20  ified. Unless . 
7050: 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
7060: 73 65 20 6e 61 6d 65 20 69 73 20 22 74 65 6d 70  se name is "temp
7070: 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a 20 20  " anyway.  */.  
7080: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7090: 67 28 70 50 61 72 73 65 2c 20 22 74 65 6d 70 6f  g(pParse, "tempo
70a0: 72 61 72 79 20 74 61 62 6c 65 20 6e 61 6d 65 20  rary table name 
70b0: 6d 75 73 74 20 62 65 20 75 6e 71 75 61 6c 69 66  must be unqualif
70c0: 69 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ied");.    retur
70d0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d  n;.  }.  if( !OM
70e0: 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54  IT_TEMPDB && isT
70f0: 65 6d 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a  emp ) iDb = 1;..
7100: 20 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54    pParse->sNameT
7110: 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20  oken = *pName;. 
7120: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
7130: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
7140: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
7150: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
7160: 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  n;.  if( SQLITE_
7170: 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
7180: 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
7190: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
71a0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
71b0: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69  e_error;.  }.  i
71c0: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  f( db->init.iDb=
71d0: 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b  =1 ) isTemp = 1;
71e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
71f0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
7200: 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 28 69 73  ON.  assert( (is
7210: 54 65 6d 70 20 26 20 31 29 3d 3d 69 73 54 65 6d  Temp & 1)==isTem
7220: 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74  p );.  {.    int
7230: 20 63 6f 64 65 3b 0a 20 20 20 20 63 68 61 72 20   code;.    char 
7240: 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
7250: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db].zName;.    i
7260: 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
7270: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
7280: 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
7290: 41 5f 54 41 42 4c 45 28 69 73 54 65 6d 70 29 2c  A_TABLE(isTemp),
72a0: 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
72b0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
72c0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
72d0: 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29      if( isView )
72e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
72f0: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
7300: 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mp ){.        co
7310: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
7320: 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20  TE_TEMP_VIEW;.  
7330: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7340: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
7350: 5f 43 52 45 41 54 45 5f 56 49 45 57 3b 0a 20 20  _CREATE_VIEW;.  
7360: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
7370: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
7380: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
7390: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  p ){.        cod
73a0: 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  e = SQLITE_CREAT
73b0: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20  E_TEMP_TABLE;.  
73c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
73d0: 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
73e0: 5f 43 52 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20  _CREATE_TABLE;. 
73f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7400: 20 69 66 28 20 21 69 73 56 69 72 74 75 61 6c 20   if( !isVirtual 
7410: 26 26 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  && sqlite3AuthCh
7420: 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
7430: 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  , zName, 0, zDb)
7440: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
7450: 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72  egin_table_error
7460: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
7470: 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
7480: 72 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  re the new table
7490: 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63   name does not c
74a0: 6f 6c 6c 69 64 65 20 77 69 74 68 20 61 6e 20 65  ollide with an e
74b0: 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64  xisting.  ** ind
74c0: 65 78 20 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ex or table name
74d0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
74e0: 61 62 61 73 65 2e 20 20 49 73 73 75 65 20 61 6e  abase.  Issue an
74f0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
7500: 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20  f.  ** it does. 
7510: 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73  The exception is
7520: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
7530: 74 20 62 65 69 6e 67 20 70 61 72 73 65 64 20 77  t being parsed w
7540: 61 73 20 70 61 73 73 65 64 0a 20 20 2a 2a 20 74  as passed.  ** t
7550: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 64 65 63  o an sqlite3_dec
7560: 6c 61 72 65 5f 76 74 61 62 28 29 20 63 61 6c 6c  lare_vtab() call
7570: 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 6f  . In that case o
7580: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
7590: 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79  ames.  ** and ty
75a0: 70 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64  pes will be used
75b0: 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  , so there is no
75c0: 20 6e 65 65 64 20 74 6f 20 74 65 73 74 20 66 6f   need to test fo
75d0: 72 20 6e 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a  r namespace.  **
75e0: 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a   collisions..  *
75f0: 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44 45 43 4c  /.  if( !IN_DECL
7600: 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  ARE_VTAB ){.    
7610: 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e  char *zDb = db->
7620: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a  aDb[iDb].zName;.
7630: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
7640: 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
7650: 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
7660: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e        goto begin
7670: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20  _table_error;.  
7680: 20 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d    }.    pTable =
7690: 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
76a0: 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62  e(db, zName, zDb
76b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c  );.    if( pTabl
76c0: 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  e ){.      if( !
76d0: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20  noErr ){.       
76e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
76f0: 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
7700: 25 54 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %T already exist
7710: 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  s", pName);.    
7720: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7730: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69 6e   assert( !db->in
7740: 69 74 2e 62 75 73 79 20 7c 7c 20 43 4f 52 52 55  it.busy || CORRU
7750: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20 20 20  PT_DB );.       
7760: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
7770: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
7780: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20   iDb);.      }. 
7790: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
77a0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
77b0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
77c0: 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
77d0: 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29  zName, zDb)!=0 )
77e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
77f0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7800: 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
7810: 79 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64  y an index named
7820: 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
7830: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
7840: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
7850: 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20  }.  }..  pTable 
7860: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7870: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
7880: 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20  (Table));.  if( 
7890: 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  pTable==0 ){.   
78a0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
78b0: 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 72 73  d = 1;.    pPars
78c0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  e->rc = SQLITE_N
78d0: 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65  OMEM;.    pParse
78e0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f  ->nErr++;.    go
78f0: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7900: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62  rror;.  }.  pTab
7910: 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d  le->zName = zNam
7920: 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b  e;.  pTable->iPK
7930: 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c  ey = -1;.  pTabl
7940: 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d  e->pSchema = db-
7950: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
7960: 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65  a;.  pTable->nRe
7970: 66 20 3d 20 31 3b 0a 20 20 70 54 61 62 6c 65 2d  f = 1;.  pTable-
7980: 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 3d 20 32 30  >nRowLogEst = 20
7990: 30 3b 20 61 73 73 65 72 74 28 20 32 30 30 3d 3d  0; assert( 200==
79a0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30  sqlite3LogEst(10
79b0: 34 38 35 37 36 29 20 29 3b 0a 20 20 61 73 73 65  48576) );.  asse
79c0: 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  rt( pParse->pNew
79d0: 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50  Table==0 );.  pP
79e0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
79f0: 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20  = pTable;..  /* 
7a00: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d  If this is the m
7a10: 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75  agic sqlite_sequ
7a20: 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20  ence table used 
7a30: 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  by autoincrement
7a40: 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f  ,.  ** then reco
7a50: 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rd a pointer to 
7a60: 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68  this table in th
7a70: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
7a80: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73  structure.  ** s
7a90: 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61  o that INSERT ca
7aa0: 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65  n find the table
7ab0: 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69   easily..  */.#i
7ac0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7ad0: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
7ae0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e    if( !pParse->n
7af0: 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28  ested && strcmp(
7b00: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73  zName, "sqlite_s
7b10: 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a  equence")==0 ){.
7b20: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
7b30: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
7b40: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
7b50: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53  ;.    pTable->pS
7b60: 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d  chema->pSeqTab =
7b70: 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e   pTable;.  }.#en
7b80: 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  dif..  /* Begin 
7b90: 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63  generating the c
7ba0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e  ode that will in
7bb0: 73 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72  sert the table r
7bc0: 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20  ecord into.  ** 
7bd0: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
7be0: 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69  R table.  Note i
7bf0: 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61  n particular tha
7c00: 74 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65  t we must go ahe
7c10: 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f  ad.  ** and allo
7c20: 63 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20  cate the record 
7c30: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
7c40: 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20  able entry now. 
7c50: 20 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   Before any.  **
7c60: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
7c70: 55 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20  UNIQUE keywords 
7c80: 61 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f  are parsed.  Tho
7c90: 73 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c  se keywords will
7ca0: 20 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69   cause.  ** indi
7cb0: 63 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65  ces to be create
7cc0: 64 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20  d and the table 
7cd0: 72 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65  record must come
7ce0: 20 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a   before the .  *
7cf0: 2a 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63  * indices.  Henc
7d00: 65 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75  e, the record nu
7d10: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
7d20: 6c 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  le must be alloc
7d30: 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20  ated.  ** now.. 
7d40: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
7d50: 6e 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d  nit.busy && (v =
7d60: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
7d70: 70 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20  pParse))!=0 ){. 
7d80: 20 20 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20     int addr1;.  
7d90: 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74    int fileFormat
7da0: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20  ;.    int reg1, 
7db0: 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20  reg2, reg3;.    
7dc0: 2f 2a 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73 20  /* nullRow[] is 
7dd0: 61 6e 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e 63  an OP_Record enc
7de0: 6f 64 69 6e 67 20 6f 66 20 61 20 72 6f 77 20 63  oding of a row c
7df0: 6f 6e 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c 4c  ontaining 5 NULL
7e00: 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20  s */.    static 
7e10: 63 6f 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c 52  const char nullR
7e20: 6f 77 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20 30  ow[] = { 6, 0, 0
7e30: 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20  , 0, 0, 0 };.   
7e40: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
7e50: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
7e60: 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69  se, 1, iDb);..#i
7e70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7e80: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
7e90: 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c     if( isVirtual
7ea0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7eb0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
7ec0: 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d  P_VBegin);.    }
7ed0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
7ee0: 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  If the file form
7ef0: 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20  at and encoding 
7f00: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
7f10: 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65  have not been se
7f20: 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  t, .    ** set t
7f30: 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a  hem now..    */.
7f40: 20 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73      reg1 = pPars
7f50: 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b  e->regRowid = ++
7f60: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
7f70: 20 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d    reg2 = pParse-
7f80: 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61  >regRoot = ++pPa
7f90: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
7fa0: 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  eg3 = ++pParse->
7fb0: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
7fc0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7fd0: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44  P_ReadCookie, iD
7fe0: 62 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46  b, reg3, BTREE_F
7ff0: 49 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20  ILE_FORMAT);.   
8000: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
8010: 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20  Btree(v, iDb);. 
8020: 20 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74     addr1 = sqlit
8030: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
8040: 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 20 56 64  OP_If, reg3); Vd
8050: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
8060: 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20     fileFormat = 
8070: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
8080: 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d  ITE_LegacyFileFm
8090: 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20  t)!=0 ?.        
80a0: 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51            1 : SQ
80b0: 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f  LITE_MAX_FILE_FO
80c0: 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65  RMAT;.    sqlite
80d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
80e0: 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46  P_Integer, fileF
80f0: 6f 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20 20  ormat, reg3);.  
8100: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8110: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
8120: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f  kie, iDb, BTREE_
8130: 46 49 4c 45 5f 46 4f 52 4d 41 54 2c 20 72 65 67  FILE_FORMAT, reg
8140: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
8150: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
8160: 49 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29  Integer, ENC(db)
8170: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
8180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
8190: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
81a0: 69 44 62 2c 20 42 54 52 45 45 5f 54 45 58 54 5f  iDb, BTREE_TEXT_
81b0: 45 4e 43 4f 44 49 4e 47 2c 20 72 65 67 33 29 3b  ENCODING, reg3);
81c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
81d0: 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
81e0: 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  1);..    /* This
81f0: 20 6a 75 73 74 20 63 72 65 61 74 65 73 20 61 20   just creates a 
8200: 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20 72 65 63  place-holder rec
8210: 6f 72 64 20 69 6e 20 74 68 65 20 73 71 6c 69 74  ord in the sqlit
8220: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 0a  e_master table..
8230: 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 72      ** The recor
8240: 64 20 63 72 65 61 74 65 64 20 64 6f 65 73 20 6e  d created does n
8250: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68  ot contain anyth
8260: 69 6e 67 20 79 65 74 2e 20 20 49 74 20 77 69 6c  ing yet.  It wil
8270: 6c 20 62 65 20 72 65 70 6c 61 63 65 64 0a 20 20  l be replaced.  
8280: 20 20 2a 2a 20 62 79 20 74 68 65 20 72 65 61 6c    ** by the real
8290: 20 65 6e 74 72 79 20 69 6e 20 63 6f 64 65 20 67   entry in code g
82a0: 65 6e 65 72 61 74 65 64 20 61 74 20 73 71 6c 69  enerated at sqli
82b0: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20  te3EndTable().. 
82c0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
82d0: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 6e   rowid for the n
82e0: 65 77 20 65 6e 74 72 79 20 69 73 20 6c 65 66 74  ew entry is left
82f0: 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50 61   in register pPa
8300: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20  rse->regRowid.. 
8310: 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70     ** The root p
8320: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
8330: 65 20 6e 65 77 20 74 61 62 6c 65 20 69 73 20 6c  e new table is l
8340: 65 66 74 20 69 6e 20 72 65 67 20 70 50 61 72 73  eft in reg pPars
8350: 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20  e->regRoot..    
8360: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 61 6e 64  ** The rowid and
8370: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
8380: 72 20 76 61 6c 75 65 73 20 61 72 65 20 6e 65 65  r values are nee
8390: 64 65 64 20 62 79 20 74 68 65 20 63 6f 64 65 20  ded by the code 
83a0: 74 68 61 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69  that.    ** sqli
83b0: 74 65 33 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c  te3EndTable will
83c0: 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a   generate..    *
83d0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
83e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
83f0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
8400: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
8410: 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28 20 69  TABLE).    if( i
8420: 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72 74 75  sView || isVirtu
8430: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
8440: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8450: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
8460: 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65  reg2);.    }else
8470: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20  .#endif.    {.  
8480: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 64 64 72      pParse->addr
8490: 43 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 56  CrTab = sqlite3V
84a0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
84b0: 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62  CreateTable, iDb
84c0: 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 0a 20  , reg2);.    }. 
84d0: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61     sqlite3OpenMa
84e0: 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73 65  sterTable(pParse
84f0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
8500: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
8510: 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c   OP_NewRowid, 0,
8520: 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69   reg1);.    sqli
8530: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
8540: 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20 72 65 67   OP_Blob, 6, reg
8550: 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77 2c 20 50  3, 0, nullRow, P
8560: 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73  4_STATIC);.    s
8570: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
8580: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30  (v, OP_Insert, 0
8590: 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20  , reg3, reg1);. 
85a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
85b0: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
85c0: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71  _APPEND);.    sq
85d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
85e0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20  v, OP_Close);.  
85f0: 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28  }..  /* Normal (
8600: 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72  non-error) retur
8610: 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a  n. */.  return;.
8620: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
8630: 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d  r occurs, we jum
8640: 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f  p here */.begin_
8650: 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73  table_error:.  s
8660: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
8670: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
8680: 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74 20 70 72 6f  n;.}../* Set pro
8690: 70 65 72 74 69 65 73 20 6f 66 20 61 20 74 61 62  perties of a tab
86a0: 6c 65 20 63 6f 6c 75 6d 6e 20 62 61 73 65 64 20  le column based 
86b0: 6f 6e 20 74 68 65 20 28 6d 61 67 69 63 61 6c 29  on the (magical)
86c0: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  .** name of the 
86d0: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  column..*/.void 
86e0: 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f  sqlite3ColumnPro
86f0: 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28  pertiesFromName(
8700: 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 43 6f 6c  Table *pTab, Col
8710: 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 23 69 66 20  umn *pCol){.#if 
8720: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 48 49  SQLITE_ENABLE_HI
8730: 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 20 20 69  DDEN_COLUMNS.  i
8740: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  f( sqlite3_strni
8750: 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c  cmp(pCol->zName,
8760: 20 22 5f 5f 68 69 64 64 65 6e 5f 5f 22 2c 20 31   "__hidden__", 1
8770: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f  0)==0 ){.    pCo
8780: 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l->colFlags |= C
8790: 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 3b 0a 20  OLFLAG_HIDDEN;. 
87a0: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 20   }else if( pTab 
87b0: 26 26 20 70 43 6f 6c 21 3d 70 54 61 62 2d 3e 61  && pCol!=pTab->a
87c0: 43 6f 6c 20 26 26 20 28 70 43 6f 6c 5b 2d 31 5d  Col && (pCol[-1]
87d0: 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46  .colFlags & COLF
87e0: 4c 41 47 5f 48 49 44 44 45 4e 29 20 29 7b 0a 20  LAG_HIDDEN) ){. 
87f0: 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
8800: 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48 69 64 64 65  s |= TF_OOOHidde
8810: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  n;.  }.#endif.}.
8820: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
8830: 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20  w column to the 
8840: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
8850: 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
8860: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72  d..**.** The par
8870: 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
8880: 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20  outine once for 
8890: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c  each column decl
88a0: 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20  aration.** in a 
88b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
88c0: 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 33  tement.  sqlite3
88d0: 53 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 74  StartTable() get
88e0: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73  s called.** firs
88f0: 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 20  t to get things 
8900: 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 69  going.  Then thi
8910: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8920: 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  led for each.** 
8930: 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  column..*/.void 
8940: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
8950: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8960: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
8970: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
8980: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   i;.  char *z;. 
8990: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
89a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
89b0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
89c0: 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e   (p = pParse->pN
89d0: 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65  ewTable)==0 ) re
89e0: 74 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45  turn;.#if SQLITE
89f0: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
8a00: 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e  ( p->nCol+1>db->
8a10: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
8a20: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
8a30: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8a40: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
8a50: 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20  many columns on 
8a60: 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  %s", p->zName);.
8a70: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8a80: 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c  #endif.  z = sql
8a90: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
8aa0: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
8ab0: 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
8ac0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
8ad0: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  p->nCol; i++){. 
8ae0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
8af0: 74 72 69 63 6d 70 28 7a 2c 20 70 2d 3e 61 43 6f  tricmp(z, p->aCo
8b00: 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  l[i].zName)==0 )
8b10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
8b20: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8b30: 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75 6d  "duplicate colum
8b40: 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29 3b  n name: %s", z);
8b50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
8b60: 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
8b70: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8b80: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e 6e  .  }.  if( (p->n
8b90: 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29 7b  Col & 0x7)==0 ){
8ba0: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e 65  .    Column *aNe
8bb0: 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  w;.    aNew = sq
8bc0: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
8bd0: 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43  b,p->aCol,(p->nC
8be0: 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e  ol+8)*sizeof(p->
8bf0: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aCol[0]));.    i
8c00: 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
8c10: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
8c20: 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20  e(db, z);.      
8c30: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
8c40: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65 77    p->aCol = aNew
8c50: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20 26  ;.  }.  pCol = &
8c60: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d  p->aCol[p->nCol]
8c70: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c 2c  ;.  memset(pCol,
8c80: 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 43   0, sizeof(p->aC
8c90: 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c 2d  ol[0]));.  pCol-
8ca0: 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 20 73 71  >zName = z;.  sq
8cb0: 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65  lite3ColumnPrope
8cc0: 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 28 70 2c  rtiesFromName(p,
8cd0: 20 70 43 6f 6c 29 3b 0a 20 0a 20 20 2f 2a 20 49   pCol);. .  /* I
8ce0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79  f there is no ty
8cf0: 70 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f  pe specified, co
8d00: 6c 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64  lumns have the d
8d10: 65 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a  efault affinity.
8d20: 20 20 2a 2a 20 27 42 4c 4f 42 27 2e 20 49 66 20    ** 'BLOB'. If 
8d30: 74 68 65 72 65 20 69 73 20 61 20 74 79 70 65 20  there is a type 
8d40: 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20  specified, then 
8d50: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
8d60: 54 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a  Type() will.  **
8d70: 20 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20   be called next 
8d80: 74 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66  to set pCol->aff
8d90: 69 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e  inity correctly.
8da0: 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66  .  */.  pCol->af
8db0: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
8dc0: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 70 43 6f 6c  AFF_BLOB;.  pCol
8dd0: 2d 3e 73 7a 45 73 74 20 3d 20 31 3b 0a 20 20 70  ->szEst = 1;.  p
8de0: 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  ->nCol++;.}../*.
8df0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8e00: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
8e10: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
8e20: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
8e30: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
8e40: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
8e50: 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e 55 4c 4c  nt.  A "NOT NULL
8e60: 22 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 73  " constraint has
8e70: 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e 20 6f 6e  .** been seen on
8e80: 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 69 73   a column.  This
8e90: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
8ea0: 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61 67 20 6f  e notNull flag o
8eb0: 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20  n.** the column 
8ec0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
8ed0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
8ee0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
8ef0: 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70  NotNull(Parse *p
8f00: 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e 45 72 72  Parse, int onErr
8f10: 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  or){.  Table *p;
8f20: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
8f30: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
8f40: 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d  p==0 || NEVER(p-
8f50: 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75 72  >nCol<1) ) retur
8f60: 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  n;.  p->aCol[p->
8f70: 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20  nCol-1].notNull 
8f80: 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d  = (u8)onError;.}
8f90: 0a 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65  ../*.** Scan the
8fa0: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d   column type nam
8fb0: 65 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20  e zType (length 
8fc0: 6e 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72  nType) and retur
8fd0: 6e 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61  n the.** associa
8fe0: 74 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70  ted affinity typ
8ff0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
9000: 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73  utine does a cas
9010: 65 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65  e-independent se
9020: 61 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f  arch of zType fo
9030: 72 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72  r the .** substr
9040: 69 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ings in the foll
9050: 6f 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20  owing table. If 
9060: 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74  one of the subst
9070: 72 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e  rings is.** foun
9080: 64 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  d, the correspon
9090: 64 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73  ding affinity is
90a0: 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54   returned. If zT
90b0: 79 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  ype contains.** 
90c0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66  more than one of
90d0: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c   the substrings,
90e0: 20 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20   entries toward 
90f0: 74 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74  the top of .** t
9100: 68 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72  he table take pr
9110: 69 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d  iority. For exam
9120: 70 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73  ple, if zType is
9130: 20 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20   'BLOBINT', .** 
9140: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
9150: 45 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ER is returned..
9160: 2a 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20  **.** Substring 
9170: 20 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a      | Affinity.*
9180: 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
9190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91a0: 2d 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20  --.** 'INT'     
91b0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
91c0: 5f 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41  _INTEGER.** 'CHA
91d0: 52 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  R'        | SQLI
91e0: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
91f0: 43 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  CLOB'        | S
9200: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
9210: 2a 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20  * 'TEXT'        
9220: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  | SQLITE_AFF_TEX
9230: 54 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20  T.** 'BLOB'     
9240: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
9250: 42 4c 4f 42 0a 2a 2a 20 27 52 45 41 4c 27 20 20  BLOB.** 'REAL'  
9260: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
9270: 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41  FF_REAL.** 'FLOA
9280: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
9290: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44  E_AFF_REAL.** 'D
92a0: 4f 55 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  OUB'        | SQ
92b0: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a  LITE_AFF_REAL.**
92c0: 0a 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74  .** If none of t
92d0: 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  he substrings in
92e0: 20 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65   the above table
92f0: 20 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53   are found,.** S
9300: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9310: 43 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  C is returned..*
9320: 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66  /.char sqlite3Af
9330: 66 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74  finityType(const
9340: 20 63 68 61 72 20 2a 7a 49 6e 2c 20 75 38 20 2a   char *zIn, u8 *
9350: 70 73 7a 45 73 74 29 7b 0a 20 20 75 33 32 20 68  pszEst){.  u32 h
9360: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66   = 0;.  char aff
9370: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
9380: 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63  MERIC;.  const c
9390: 68 61 72 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a  har *zChar = 0;.
93a0: 0a 20 20 69 66 28 20 7a 49 6e 3d 3d 30 20 29 20  .  if( zIn==0 ) 
93b0: 72 65 74 75 72 6e 20 61 66 66 3b 0a 20 20 77 68  return aff;.  wh
93c0: 69 6c 65 28 20 7a 49 6e 5b 30 5d 20 29 7b 0a 20  ile( zIn[0] ){. 
93d0: 20 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20     h = (h<<8) + 
93e0: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
93f0: 77 65 72 5b 28 2a 7a 49 6e 29 26 30 78 66 66 5d  wer[(*zIn)&0xff]
9400: 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20 20 20  ;.    zIn++;.   
9410: 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32   if( h==(('c'<<2
9420: 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28 27 61  4)+('h'<<16)+('a
9430: 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20 20 20  '<<8)+'r') ){   
9440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 48 41            /* CHA
9450: 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  R */.      aff =
9460: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
9470: 3b 0a 20 20 20 20 20 20 7a 43 68 61 72 20 3d 20  ;.      zChar = 
9480: 7a 49 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  zIn;.    }else i
9490: 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29  f( h==(('c'<<24)
94a0: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
94b0: 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20  <8)+'b') ){     
94c0: 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20    /* CLOB */.   
94d0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
94e0: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
94f0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27  lse if( h==(('t'
9500: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
9510: 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('x'<<8)+'t') ){
9520: 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a         /* TEXT *
9530: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
9540: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
9550: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9560: 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('b'<<24)+('l'<
9570: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
9580: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ')          /* B
9590: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOB */.        &
95a0: 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  & (aff==SQLITE_A
95b0: 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66  FF_NUMERIC || af
95c0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f==SQLITE_AFF_RE
95d0: 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66  AL) ){.      aff
95e0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
95f0: 4f 42 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49  OB;.      if( zI
9600: 6e 5b 30 5d 3d 3d 27 28 27 20 29 20 7a 43 68 61  n[0]=='(' ) zCha
9610: 72 20 3d 20 7a 49 6e 3b 0a 23 69 66 6e 64 65 66  r = zIn;.#ifndef
9620: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
9630: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
9640: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
9650: 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36  r'<<24)+('e'<<16
9660: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20  )+('a'<<8)+'l') 
9670: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c           /* REAL
9680: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
9690: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
96a0: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
96b0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
96c0: 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _REAL;.    }else
96d0: 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32   if( h==(('f'<<2
96e0: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
96f0: 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20  '<<8)+'a')      
9700: 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20      /* FLOA */. 
9710: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
9720: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9730: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
9740: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
9750: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
9760: 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27  h==(('d'<<24)+('
9770: 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29  o'<<16)+('u'<<8)
9780: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
9790: 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20  * DOUB */.      
97a0: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
97b0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
97c0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
97d0: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e  TE_AFF_REAL;.#en
97e0: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
97f0: 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46 29  ( (h&0x00FFFFFF)
9800: 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e  ==(('i'<<16)+('n
9810: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
9820: 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20   /* INT */.     
9830: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
9840: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  F_INTEGER;.     
9850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9860: 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 73 7a 45 73  }..  /* If pszEs
9870: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 73  t is not NULL, s
9880: 74 6f 72 65 20 61 6e 20 65 73 74 69 6d 61 74 65  tore an estimate
9890: 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20 73 69   of the field si
98a0: 7a 65 2e 20 20 54 68 65 0a 20 20 2a 2a 20 65 73  ze.  The.  ** es
98b0: 74 69 6d 61 74 65 20 69 73 20 73 63 61 6c 65 64  timate is scaled
98c0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 69 7a   so that the siz
98d0: 65 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20  e of an integer 
98e0: 69 73 20 31 2e 20 20 2a 2f 0a 20 20 69 66 28 20  is 1.  */.  if( 
98f0: 70 73 7a 45 73 74 20 29 7b 0a 20 20 20 20 2a 70  pszEst ){.    *p
9900: 73 7a 45 73 74 20 3d 20 31 3b 20 20 20 2f 2a 20  szEst = 1;   /* 
9910: 64 65 66 61 75 6c 74 20 73 69 7a 65 20 69 73 20  default size is 
9920: 61 70 70 72 6f 78 20 34 20 62 79 74 65 73 20 2a  approx 4 bytes *
9930: 2f 0a 20 20 20 20 69 66 28 20 61 66 66 3c 53 51  /.    if( aff<SQ
9940: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9950: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43   ){.      if( zC
9960: 68 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 77  har ){.        w
9970: 68 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d 20 29  hile( zChar[0] )
9980: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
9990: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
99a0: 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20 20 20  Char[0]) ){.    
99b0: 20 20 20 20 20 20 20 20 69 6e 74 20 76 20 3d 20          int v = 
99c0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  0;.            s
99d0: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a  qlite3GetInt32(z
99e0: 43 68 61 72 2c 20 26 76 29 3b 0a 20 20 20 20 20  Char, &v);.     
99f0: 20 20 20 20 20 20 20 76 20 3d 20 76 2f 34 20 2b         v = v/4 +
9a00: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
9a10: 69 66 28 20 76 3e 32 35 35 20 29 20 76 20 3d 20  if( v>255 ) v = 
9a20: 32 35 35 3b 0a 20 20 20 20 20 20 20 20 20 20 20  255;.           
9a30: 20 2a 70 73 7a 45 73 74 20 3d 20 76 3b 20 2f 2a   *pszEst = v; /*
9a40: 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52 43 48 41   BLOB(k), VARCHA
9a50: 52 28 6b 29 2c 20 43 48 41 52 28 6b 29 20 2d 3e  R(k), CHAR(k) ->
9a60: 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f 0a 20 20   r=(k/4+1) */.  
9a70: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9a80: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
9a90: 20 20 20 20 20 20 20 7a 43 68 61 72 2b 2b 3b 0a         zChar++;.
9aa0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9ab0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a  }else{.        *
9ac0: 70 73 7a 45 73 74 20 3d 20 35 3b 20 20 20 2f 2a  pszEst = 5;   /*
9ad0: 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f   BLOB, TEXT, CLO
9ae0: 42 20 2d 3e 20 72 3d 35 20 20 28 61 70 70 72 6f  B -> r=5  (appro
9af0: 78 20 32 30 20 62 79 74 65 73 29 2a 2f 0a 20 20  x 20 bytes)*/.  
9b00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9b10: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
9b20: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
9b30: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
9b40: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c   the parser whil
9b50: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
9b60: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20  of.** parsing a 
9b70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
9b80: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69  tement.  The pFi
9b90: 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65  rst token is the
9ba0: 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20   first.** token 
9bb0: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  in the sequence 
9bc0: 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64  of tokens that d
9bd0: 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70 65  escribe the type
9be0: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d   of the.** colum
9bf0: 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  n currently unde
9c00: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
9c10: 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c    pLast is the l
9c20: 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20  ast token.** in 
9c30: 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55  the sequence.  U
9c40: 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  se this informat
9c50: 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ion to construct
9c60: 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61   a string.** tha
9c70: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74  t contains the t
9c80: 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63  ypename of the c
9c90: 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20  olumn and store 
9ca0: 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69  that string.** i
9cb0: 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69  n zType..*/ .voi
9cc0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
9cd0: 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70 50  mnType(Parse *pP
9ce0: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79  arse, Token *pTy
9cf0: 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  pe){.  Table *p;
9d00: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
9d10: 0a 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ..  p = pParse->
9d20: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
9d30: 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70   p==0 || NEVER(p
9d40: 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74 75  ->nCol<1) ) retu
9d50: 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d  rn;.  pCol = &p-
9d60: 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d  >aCol[p->nCol-1]
9d70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c  ;.  assert( pCol
9d80: 2d 3e 7a 54 79 70 65 3d 3d 30 20 7c 7c 20 43 4f  ->zType==0 || CO
9d90: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 71  RRUPT_DB );.  sq
9da0: 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
9db0: 73 65 2d 3e 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54  se->db, pCol->zT
9dc0: 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54  ype);.  pCol->zT
9dd0: 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ype = sqlite3Nam
9de0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
9df0: 65 2d 3e 64 62 2c 20 70 54 79 70 65 29 3b 0a 20  e->db, pType);. 
9e00: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
9e10: 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74  = sqlite3Affinit
9e20: 79 54 79 70 65 28 70 43 6f 6c 2d 3e 7a 54 79 70  yType(pCol->zTyp
9e30: 65 2c 20 26 70 43 6f 6c 2d 3e 73 7a 45 73 74 29  e, &pCol->szEst)
9e40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65  ;.}../*.** The e
9e50: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68 65  xpression is the
9e60: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
9e70: 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  or the most rece
9e80: 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d  ntly added colum
9e90: 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c  n.** of the tabl
9ea0: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
9eb0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
9ec0: 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76 61  **.** Default va
9ed0: 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  lue expressions 
9ee0: 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74  must be constant
9ef0: 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78 63 65  .  Raise an exce
9f00: 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a 2a  ption if this.**
9f10: 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65   is not the case
9f20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
9f30: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
9f40: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
9f50: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
9f60: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
9f70: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
9f80: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
9f90: 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75   sqlite3AddDefau
9fa0: 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a 70  ltValue(Parse *p
9fb0: 50 61 72 73 65 2c 20 45 78 70 72 53 70 61 6e 20  Parse, ExprSpan 
9fc0: 2a 70 53 70 61 6e 29 7b 0a 20 20 54 61 62 6c 65  *pSpan){.  Table
9fd0: 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *p;.  Column *p
9fe0: 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Col;.  sqlite3 *
9ff0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a000: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
a010: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
a020: 70 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  p!=0 ){.    pCol
a030: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e   = &(p->aCol[p->
a040: 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66  nCol-1]);.    if
a050: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
a060: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
a070: 6f 6e 28 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c  on(pSpan->pExpr,
a080: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20   db->init.busy) 
a090: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
a0a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a0b0: 20 22 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20   "default value 
a0c0: 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69  of column [%s] i
a0d0: 73 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c  s not constant",
a0e0: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d  .          pCol-
a0f0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c  >zName);.    }el
a100: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63  se{.      /* A c
a110: 6f 70 79 20 6f 66 20 70 45 78 70 72 20 69 73 20  opy of pExpr is 
a120: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
a130: 74 68 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73  the original, as
a140: 20 70 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a   pExpr contains.
a150: 20 20 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20        ** tokens 
a160: 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f  that point to vo
a170: 6c 61 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 20 54  latile memory. T
a180: 68 65 20 27 73 70 61 6e 27 20 6f 66 20 74 68 65  he 'span' of the
a190: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20   expression.    
a1a0: 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
a1b0: 20 62 79 20 70 72 61 67 6d 61 20 74 61 62 6c 65   by pragma table
a1c0: 5f 69 6e 66 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a  _info..      */.
a1d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a1e0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  rDelete(db, pCol
a1f0: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
a200: 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 71  pCol->pDflt = sq
a210: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
a220: 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 2c 20 45   pSpan->pExpr, E
a230: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
a240: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
a250: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44  ree(db, pCol->zD
a260: 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  flt);.      pCol
a270: 2d 3e 7a 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->zDflt = sqlite
a280: 33 44 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28  3DbStrNDup(db, (
a290: 63 68 61 72 2a 29 70 53 70 61 6e 2d 3e 7a 53 74  char*)pSpan->zSt
a2a0: 61 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  art,.           
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2c0: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28            (int)(
a2d0: 70 53 70 61 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53  pSpan->zEnd - pS
a2e0: 70 61 6e 2d 3e 7a 53 74 61 72 74 29 29 3b 0a 20  pan->zStart));. 
a2f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
a300: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
a310: 20 70 53 70 61 6e 2d 3e 70 45 78 70 72 29 3b 0a   pSpan->pExpr);.
a320: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 61 63 6b 77 61 72  }../*.** Backwar
a330: 64 73 20 43 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds Compatibility
a340: 20 48 61 63 6b 3a 0a 2a 2a 20 0a 2a 2a 20 48 69   Hack:.** .** Hi
a350: 73 74 6f 72 69 63 61 6c 20 76 65 72 73 69 6f 6e  storical version
a360: 73 20 6f 66 20 53 51 4c 69 74 65 20 61 63 63 65  s of SQLite acce
a370: 70 74 65 64 20 73 74 72 69 6e 67 73 20 61 73 20  pted strings as 
a380: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 0a  column names in.
a390: 2a 2a 20 69 6e 64 65 78 65 73 20 61 6e 64 20 50  ** indexes and P
a3a0: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74  RIMARY KEY const
a3b0: 72 61 69 6e 74 73 20 61 6e 64 20 69 6e 20 55 4e  raints and in UN
a3c0: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73  IQUE constraints
a3d0: 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  .  Example:.**.*
a3e0: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
a3f0: 4c 45 20 78 79 7a 28 61 2c 62 2c 63 2c 64 2c 65  LE xyz(a,b,c,d,e
a400: 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 27 61 27  ,PRIMARY KEY('a'
a410: 29 2c 55 4e 49 51 55 45 28 27 62 27 2c 27 63 27  ),UNIQUE('b','c'
a420: 20 43 4f 4c 4c 41 54 45 20 74 72 69 6d 29 0a 2a   COLLATE trim).*
a430: 2a 20 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  *     CREATE IND
a440: 45 58 20 61 62 63 20 4f 4e 20 78 79 7a 28 27 63  EX abc ON xyz('c
a450: 27 2c 27 64 27 20 44 45 53 43 2c 27 65 27 20 43  ','d' DESC,'e' C
a460: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 44 45  OLLATE nocase DE
a470: 53 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SC);.**.** This 
a480: 69 73 20 67 6f 6f 66 79 2e 20 20 42 75 74 20 74  is goofy.  But t
a490: 6f 20 70 72 65 73 65 72 76 65 20 62 61 63 6b 77  o preserve backw
a4a0: 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
a4b0: 74 79 20 77 65 20 63 6f 6e 74 69 6e 75 65 20 74  ty we continue t
a4c0: 6f 0a 2a 2a 20 61 63 63 65 70 74 20 69 74 2e 20  o.** accept it. 
a4d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
a4e0: 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  es the necessary
a4f0: 20 63 6f 6e 76 65 72 73 69 6f 6e 2e 20 20 49 74   conversion.  It
a500: 20 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74 68 65   converts.** the
a510: 20 65 78 70 72 65 73 73 69 6f 6e 20 67 69 76 65   expression give
a520: 6e 20 69 6e 20 69 74 73 20 61 72 67 75 6d 65 6e  n in its argumen
a530: 74 20 66 72 6f 6d 20 61 20 54 4b 5f 53 54 52 49  t from a TK_STRI
a540: 4e 47 20 69 6e 74 6f 20 61 20 54 4b 5f 49 44 0a  NG into a TK_ID.
a550: 2a 2a 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ** if the expres
a560: 73 69 6f 6e 20 69 73 20 6a 75 73 74 20 61 20 54  sion is just a T
a570: 4b 5f 53 54 52 49 4e 47 20 77 69 74 68 20 61 6e  K_STRING with an
a580: 20 6f 70 74 69 6f 6e 61 6c 20 43 4f 4c 4c 41 54   optional COLLAT
a590: 45 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 49 66 20  E clause..** If 
a5a0: 74 68 65 20 65 70 78 72 65 73 73 69 6f 6e 20 69  the epxression i
a5b0: 73 20 61 6e 79 74 68 69 6e 67 20 6f 74 68 65 72  s anything other
a5c0: 20 74 68 61 6e 20 54 4b 5f 53 54 52 49 4e 47 2c   than TK_STRING,
a5d0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
a5e0: 69 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e  is.** unchanged.
a5f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a600: 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49  sqlite3StringToI
a610: 64 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  d(Expr *p){.  if
a620: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49  ( p->op==TK_STRI
a630: 4e 47 20 29 7b 0a 20 20 20 20 70 2d 3e 6f 70 20  NG ){.    p->op 
a640: 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 65 6c 73 65  = TK_ID;.  }else
a650: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
a660: 4f 4c 4c 41 54 45 20 26 26 20 70 2d 3e 70 4c 65  OLLATE && p->pLe
a670: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e  ft->op==TK_STRIN
a680: 47 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4c 65 66  G ){.    p->pLef
a690: 74 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20  t->op = TK_ID;. 
a6a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69   }.}../*.** Desi
a6b0: 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41 52  gnate the PRIMAR
a6c0: 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74 61  Y KEY for the ta
a6d0: 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20 61  ble.  pList is a
a6e0: 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a   list of names .
a6f0: 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68  ** of columns th
a700: 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69 6d  at form the prim
a710: 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c 69  ary key.  If pLi
a720: 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e  st is NULL, then
a730: 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
a740: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
a750: 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  mn of the table 
a760: 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  is the primary k
a770: 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c  ey..**.** A tabl
a780: 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d 6f  e can have at mo
a790: 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b  st one primary k
a7a0: 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c  ey.  If the tabl
a7b0: 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a  e already has.**
a7c0: 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 28   a primary key (
a7d0: 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20  and this is the 
a7e0: 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b  second primary k
a7f0: 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65 20  ey) then create 
a800: 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a  an.** error..**.
a810: 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41 52  ** If the PRIMAR
a820: 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73 69  Y KEY is on a si
a830: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73  ngle column whos
a840: 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49 4e  e datatype is IN
a850: 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77  TEGER,.** then w
a860: 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75 73  e will try to us
a870: 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73  e that column as
a880: 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65 74   the rowid.  Set
a890: 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65 79   the Table.iPKey
a8a0: 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65  .** field of the
a8b0: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
a8c0: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20  struction to be 
a8d0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
a8e0: 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49 4d  .** INTEGER PRIM
a8f0: 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20  ARY KEY column. 
a900: 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73 20   Table.iPKey is 
a910: 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68 65  set to -1 if the
a920: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45  re is.** no INTE
a930: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
a940: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65  .**.** If the ke
a950: 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45  y is not an INTE
a960: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
a970: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 75   then create a u
a980: 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66  nique.** index f
a990: 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20  or the key.  No 
a9a0: 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64  index is created
a9b0: 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52 49   for INTEGER PRI
a9c0: 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f  MARY KEYs..*/.vo
a9d0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72 69  id sqlite3AddPri
a9e0: 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73 65  maryKey(.  Parse
a9f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
aa00: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
aa10: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
aa20: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
aa30: 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f  f field names to
aa40: 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   be indexed */. 
aa50: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
aa60: 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
aa70: 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e 65   with a uniquene
aa80: 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  ss conflict */. 
aa90: 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20 20   int autoInc,   
aaa0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
aab0: 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  e AUTOINCREMENT 
aac0: 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73 65  keyword is prese
aad0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  nt */.  int sort
aae0: 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51 4c  Order     /* SQL
aaf0: 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51  ITE_SO_ASC or SQ
ab00: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a  LITE_SO_DESC */.
ab10: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
ab20: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
ab30: 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54  able;.  char *zT
ab40: 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ype = 0;.  int i
ab50: 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69  Col = -1, i;.  i
ab60: 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 69 66 28 20  nt nTerm;.  if( 
ab70: 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45  pTab==0 || IN_DE
ab80: 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
ab90: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
aba0: 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  it;.  if( pTab->
abb0: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61  tabFlags & TF_Ha
abc0: 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20  sPrimaryKey ){. 
abd0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
abe0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
abf0: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
ac00: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
ac10: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
ac20: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
ac30: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
ac40: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
ac50: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
ac60: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
ac70: 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  y;.  if( pList==
ac80: 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  0 ){.    iCol = 
ac90: 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a  pTab->nCol - 1;.
aca0: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
acb0: 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d  Col].colFlags |=
acc0: 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
acd0: 3b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54  ;.    zType = pT
ace0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
acf0: 54 79 70 65 3b 0a 20 20 20 20 6e 54 65 72 6d 20  Type;.    nTerm 
ad00: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
ad10: 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69 73 74 2d    nTerm = pList-
ad20: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 6f 72 28  >nExpr;.    for(
ad30: 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b  i=0; i<nTerm; i+
ad40: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
ad50: 70 43 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  pCExpr = sqlite3
ad60: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
ad70: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
ad80: 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  r);.      assert
ad90: 28 20 70 43 45 78 70 72 21 3d 30 20 29 3b 0a 20  ( pCExpr!=0 );. 
ada0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 69       sqlite3Stri
adb0: 6e 67 54 6f 49 64 28 70 43 45 78 70 72 29 3b 0a  ngToId(pCExpr);.
adc0: 20 20 20 20 20 20 69 66 28 20 70 43 45 78 70 72        if( pCExpr
add0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
ade0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
adf0: 72 20 2a 7a 43 4e 61 6d 65 20 3d 20 70 43 45 78  r *zCName = pCEx
ae00: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
ae10: 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
ae20: 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
ae30: 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
ae40: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
ae50: 33 53 74 72 49 43 6d 70 28 7a 43 4e 61 6d 65 2c  3StrICmp(zCName,
ae60: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
ae70: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
ae80: 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d             pTab-
ae90: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c 46  >aCol[iCol].colF
aea0: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
aeb0: 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20  PRIMKEY;.       
aec0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70 54 61       zType = pTa
aed0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54  b->aCol[iCol].zT
aee0: 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ype;.           
aef0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
af00: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
af10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
af20: 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 31 0a 20    if( nTerm==1. 
af30: 20 20 26 26 20 7a 54 79 70 65 20 26 26 20 73 71    && zType && sq
af40: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79  lite3StrICmp(zTy
af50: 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d  pe, "INTEGER")==
af60: 30 0a 20 20 20 26 26 20 73 6f 72 74 4f 72 64 65  0.   && sortOrde
af70: 72 21 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53  r!=SQLITE_SO_DES
af80: 43 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  C.  ){.    pTab-
af90: 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20  >iPKey = iCol;. 
afa0: 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66     pTab->keyConf
afb0: 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a   = (u8)onError;.
afc0: 20 20 20 20 61 73 73 65 72 74 28 20 61 75 74 6f      assert( auto
afd0: 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e  Inc==0 || autoIn
afe0: 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62  c==1 );.    pTab
aff0: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 61 75  ->tabFlags |= au
b000: 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63  toInc*TF_Autoinc
b010: 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69 66 28 20  rement;.    if( 
b020: 70 4c 69 73 74 20 29 20 70 50 61 72 73 65 2d 3e  pList ) pParse->
b030: 69 50 6b 53 6f 72 74 4f 72 64 65 72 20 3d 20 70  iPkSortOrder = p
b040: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
b050: 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rder;.  }else if
b060: 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69 66  ( autoInc ){.#if
b070: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b080: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
b090: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
b0a0: 73 67 28 70 50 61 72 73 65 2c 20 22 41 55 54 4f  sg(pParse, "AUTO
b0b0: 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e 6c  INCREMENT is onl
b0c0: 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e 20  y allowed on an 
b0d0: 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47 45  ".       "INTEGE
b0e0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29 3b  R PRIMARY KEY");
b0f0: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
b100: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
b110: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 43 72     p = sqlite3Cr
b120: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
b130: 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74  , 0, 0, 0, pList
b140: 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20  , onError, 0,.  
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b160: 20 20 20 20 20 20 20 20 20 30 2c 20 73 6f 72 74           0, sort
b170: 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 69  Order, 0);.    i
b180: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d  f( p ){.      p-
b190: 3e 69 64 78 54 79 70 65 20 3d 20 53 51 4c 49 54  >idxType = SQLIT
b1a0: 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52  E_IDXTYPE_PRIMAR
b1b0: 59 4b 45 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20  YKEY;.    }.    
b1c0: 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pList = 0;.  }..
b1d0: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
b1e0: 3a 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  :.  sqlite3ExprL
b1f0: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
b200: 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ->db, pList);.  
b210: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
b220: 20 41 64 64 20 61 20 6e 65 77 20 43 48 45 43 4b   Add a new CHECK
b230: 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 6f 20 74   constraint to t
b240: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
b250: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
b260: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
b270: 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f  qlite3AddCheckCo
b280: 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
b290: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
b2a0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
b2b0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 43 68 65   */.  Expr *pChe
b2c0: 63 6b 45 78 70 72 20 20 2f 2a 20 54 68 65 20 63  ckExpr  /* The c
b2d0: 68 65 63 6b 20 65 78 70 72 65 73 73 69 6f 6e 20  heck expression 
b2e0: 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
b2f0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
b300: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
b310: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
b320: 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
b330: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
b340: 20 69 66 28 20 70 54 61 62 20 26 26 20 21 49 4e   if( pTab && !IN
b350: 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 0a 20 20  _DECLARE_VTAB.  
b360: 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65   && !sqlite3Btre
b370: 65 49 73 52 65 61 64 6f 6e 6c 79 28 64 62 2d 3e  eIsReadonly(db->
b380: 61 44 62 5b 64 62 2d 3e 69 6e 69 74 2e 69 44 62  aDb[db->init.iDb
b390: 5d 2e 70 42 74 29 0a 20 20 29 7b 0a 20 20 20 20  ].pBt).  ){.    
b3a0: 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73  pTab->pCheck = s
b3b0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
b3c0: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 54 61  pend(pParse, pTa
b3d0: 62 2d 3e 70 43 68 65 63 6b 2c 20 70 43 68 65 63  b->pCheck, pChec
b3e0: 6b 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  kExpr);.    if( 
b3f0: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
b400: 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20  ntName.n ){.    
b410: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
b420: 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
b430: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26   pTab->pCheck, &
b440: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
b450: 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20  ntName, 1);.    
b460: 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
b470: 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
b480: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
b490: 65 2d 3e 64 62 2c 20 70 43 68 65 63 6b 45 78 70  e->db, pCheckExp
b4a0: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
b4b0: 20 53 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69   Set the collati
b4c0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74  on function of t
b4d0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
b4e0: 20 70 61 72 73 65 64 20 74 61 62 6c 65 20 63 6f   parsed table co
b4f0: 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43  lumn.** to the C
b500: 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f  ollSeq given..*/
b510: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
b520: 43 6f 6c 6c 61 74 65 54 79 70 65 28 50 61 72 73  CollateType(Pars
b530: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
b540: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62   *pToken){.  Tab
b550: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
b560: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
b570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
b580: 65 71 75 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20  equoted name of 
b590: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
b5a0: 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ce */.  sqlite3 
b5b0: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d  *db;..  if( (p =
b5c0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
b5d0: 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  le)==0 ) return;
b5e0: 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  .  i = p->nCol-1
b5f0: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
b600: 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73  >db;.  zColl = s
b610: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
b620: 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b  ken(db, pToken);
b630: 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20  .  if( !zColl ) 
b640: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73  return;..  if( s
b650: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
b660: 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
b670: 6c 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  l) ){.    Index 
b680: 2a 70 49 64 78 3b 0a 20 20 20 20 73 71 6c 69 74  *pIdx;.    sqlit
b690: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
b6a0: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a  aCol[i].zColl);.
b6b0: 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a      p->aCol[i].z
b6c0: 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  Coll = zColl;.  
b6d0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
b6e0: 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65  olumn is declare
b6f0: 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49  d as "<name> PRI
b700: 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45  MARY KEY COLLATE
b710: 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a   <type>",.    **
b720: 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d   then an index m
b730: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ay have been cre
b740: 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c  ated on this col
b750: 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20  umn before the. 
b760: 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20     ** collation 
b770: 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e 20  type was added. 
b780: 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66 20  Correct this if 
b790: 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a  it is the case..
b7a0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
b7b0: 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70  Idx=p->pIndex; p
b7c0: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
b7d0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73  pNext){.      as
b7e0: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79  sert( pIdx->nKey
b7f0: 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Col==1 );.      
b800: 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
b810: 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20  mn[0]==i ){.    
b820: 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c      pIdx->azColl
b830: 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d  [0] = p->aCol[i]
b840: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  .zColl;.      }.
b850: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
b860: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
b870: 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
b880: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
b890: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
b8a0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
b8b0: 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62  quence for datab
b8c0: 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a  ase native text.
b8d0: 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e  ** encoding iden
b8e0: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73 74  tified by the st
b8f0: 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67  ring zName, leng
b900: 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  th nName..**.** 
b910: 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  If the requested
b920: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
b930: 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  nce is not avail
b940: 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61  able, or not ava
b950: 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65  ilable.** in the
b960: 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76 65   database native
b970: 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63   encoding, the c
b980: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
b990: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a   is invoked to.*
b9a0: 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49 66  * request it. If
b9b0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
b9c0: 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20  actory does not 
b9d0: 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73 65  supply such a se
b9e0: 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74  quence,.** and t
b9f0: 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20 61  he sequence is a
ba00: 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74  vailable in anot
ba10: 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  her text encodin
ba20: 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a  g, then that is.
ba30: 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  ** returned inst
ba40: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ead..**.** If no
ba50: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
ba60: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
ba70: 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61  tions sequence a
ba80: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  re available, or
ba90: 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f  .** another erro
baa0: 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
bab0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61  s returned and a
bac0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
bad0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
bae0: 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pParse..**.** Th
baf0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
bb00: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
bb10: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
bb20: 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69  q().  This routi
bb30: 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68  ne.** invokes th
bb40: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
bb50: 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64  ory if the named
bb60: 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f   collation canno
bb70: 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e  t be found.** an
bb80: 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65  d generates an e
bb90: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a  rror message..**
bba0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73 71  .** See also: sq
bbb0: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
bbc0: 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43 6f  (), sqlite3GetCo
bbd0: 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53  llSeq().*/.CollS
bbe0: 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  eq *sqlite3Locat
bbf0: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
bc00: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
bc10: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71  ar *zName){.  sq
bc20: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
bc30: 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63  se->db;.  u8 enc
bc40: 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38   = ENC(db);.  u8
bc50: 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e   initbusy = db->
bc60: 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c  init.busy;.  Col
bc70: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20  lSeq *pColl;..  
bc80: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
bc90: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65  indCollSeq(db, e
bca0: 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62  nc, zName, initb
bcb0: 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69  usy);.  if( !ini
bcc0: 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c  tbusy && (!pColl
bcd0: 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70   || !pColl->xCmp
bce0: 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  ) ){.    pColl =
bcf0: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
bd00: 65 71 28 70 50 61 72 73 65 2c 20 65 6e 63 2c 20  eq(pParse, enc, 
bd10: 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20  pColl, zName);. 
bd20: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f   }..  return pCo
bd30: 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  ll;.}.../*.** Ge
bd40: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
bd50: 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20   will increment 
bd60: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
bd70: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68  e..**.** The sch
bd80: 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73  ema cookie is us
bd90: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ed to determine 
bda0: 77 68 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20  when the schema 
bdb0: 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  for the.** datab
bdc0: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66  ase changes.  Af
bdd0: 74 65 72 20 65 61 63 68 20 73 63 68 65 6d 61 20  ter each schema 
bde0: 63 68 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b  change, the cook
bdf0: 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e  ie value.** chan
be00: 67 65 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f  ges.  When a pro
be10: 63 65 73 73 20 66 69 72 73 74 20 72 65 61 64 73  cess first reads
be20: 20 74 68 65 20 73 63 68 65 6d 61 20 69 74 20 72   the schema it r
be30: 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f  ecords the.** co
be40: 6f 6b 69 65 2e 20 20 54 68 65 72 65 61 66 74 65  okie.  Thereafte
be50: 72 2c 20 77 68 65 6e 65 76 65 72 20 69 74 20 67  r, whenever it g
be60: 6f 65 73 20 74 6f 20 61 63 63 65 73 73 20 74 68  oes to access th
be70: 65 20 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69  e database,.** i
be80: 74 20 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f  t checks the coo
be90: 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  kie to make sure
bea0: 20 74 68 65 20 73 63 68 65 6d 61 20 68 61 73 20   the schema has 
beb0: 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73  not changed.** s
bec0: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
bed0: 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   read..**.** Thi
bee0: 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f  s plan is not co
bef0: 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d  mpletely bullet-
bf00: 70 72 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f  proof.  It is po
bf10: 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68  ssible for.** th
bf20: 65 20 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e  e schema to chan
bf30: 67 65 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ge multiple time
bf40: 73 20 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f  s and for the co
bf50: 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65  okie to be.** se
bf60: 74 20 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20  t back to prior 
bf70: 76 61 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65  value.  But sche
bf80: 6d 61 20 63 68 61 6e 67 65 73 20 61 72 65 20 69  ma changes are i
bf90: 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64  nfrequent.** and
bfa0: 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
bfb0: 20 6f 66 20 68 69 74 74 69 6e 67 20 74 68 65 20   of hitting the 
bfc0: 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75  same cookie valu
bfd0: 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63  e is only.** 1 c
bfe0: 68 61 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20  hance in 2^32.  
bff0: 53 6f 20 77 65 27 72 65 20 73 61 66 65 20 65 6e  So we're safe en
c000: 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ough..*/.void sq
c010: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
c020: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
c030: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74   int iDb){.  int
c040: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
c050: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
c060: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
c070: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56   pParse->db;.  V
c080: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
c090: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
c0a0: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
c0b0: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
c0c0: 2c 20 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  , 0) );.  sqlite
c0d0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
c0e0: 50 5f 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61  P_Integer, db->a
c0f0: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
c100: 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31  >schema_cookie+1
c110: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
c120: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
c130: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
c140: 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f 56 45   BTREE_SCHEMA_VE
c150: 52 53 49 4f 4e 2c 20 72 31 29 3b 0a 20 20 73 71  RSION, r1);.  sq
c160: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
c170: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
c180: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
c190: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
c1a0: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
c1b0: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
c1c0: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
c1d0: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
c1e0: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
c1f0: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
c200: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
c210: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
c220: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
c230: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
c240: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
c250: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
c260: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
c270: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
c280: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
c290: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
c2a0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
c2b0: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
c2c0: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
c2d0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
c2e0: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
c2f0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
c300: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
c310: 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 69  irst parameter i
c320: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
c330: 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  n output buffer.
c340: 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20   The second .** 
c350: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
c360: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74  ointer to an int
c370: 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61 69  eger that contai
c380: 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  ns the offset at
c390: 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72 69  .** which to wri
c3a0: 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74 70  te into the outp
c3b0: 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73 20  ut buffer. This 
c3c0: 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73 20  function copies 
c3d0: 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69  the.** nul-termi
c3e0: 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f 69  nated string poi
c3f0: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 74  nted to by the t
c400: 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c 20  hird parameter, 
c410: 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a  zSignedIdent,.**
c420: 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69 65   to the specifie
c430: 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  d offset in the 
c440: 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61 74  buffer and updat
c450: 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66 65  es *pIdx to refe
c460: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73  r.** to the firs
c470: 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68 65  t byte after the
c480: 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74 74   last byte writt
c490: 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  en before return
c4a0: 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74  ing..** .** If t
c4b0: 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e 65  he string zSigne
c4c0: 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73 20  dIdent consists 
c4d0: 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70 68  entirely of alph
c4e0: 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61  a-numeric.** cha
c4f0: 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f  racters, does no
c500: 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 64  t begin with a d
c510: 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74 20  igit and is not 
c520: 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a  an SQL keyword,.
c530: 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63 6f  ** then it is co
c540: 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70  pied to the outp
c550: 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74 6c  ut buffer exactl
c560: 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68 65  y as it is. Othe
c570: 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20  rwise,.** it is 
c580: 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f 75  quoted using dou
c590: 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73  ble-quotes..*/.s
c5a0: 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e 74  tatic void ident
c5b0: 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  Put(char *z, int
c5c0: 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a 53   *pIdx, char *zS
c5d0: 69 67 6e 65 64 49 64 65 6e 74 29 7b 0a 20 20 75  ignedIdent){.  u
c5e0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
c5f0: 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  dent = (unsigned
c600: 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49 64   char*)zSignedId
c610: 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ent;.  int i, j,
c620: 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69 20   needQuote;.  i 
c630: 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28  = *pIdx;..  for(
c640: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
c650: 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 73  j++){.    if( !s
c660: 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49  qlite3Isalnum(zI
c670: 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65  dent[j]) && zIde
c680: 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65  nt[j]!='_' ) bre
c690: 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75  ak;.  }.  needQu
c6a0: 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73 64  ote = sqlite3Isd
c6b0: 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29 0a  igit(zIdent[0]).
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
c6d0: 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64  qlite3KeywordCod
c6e0: 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b  e(zIdent, j)!=TK
c6f0: 5f 49 44 0a 20 20 20 20 20 20 20 20 20 20 20 20  _ID.            
c700: 7c 7c 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a  || zIdent[j]!=0.
c710: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6a              || j
c720: 3d 3d 30 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64  ==0;..  if( need
c730: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
c740: 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b   '"';.  for(j=0;
c750: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
c760: 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a  {.    z[i++] = z
c770: 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66  Ident[j];.    if
c780: 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27  ( zIdent[j]=='"'
c790: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
c7a0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51  .  }.  if( needQ
c7b0: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
c7c0: 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b  '"';.  z[i] = 0;
c7d0: 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a  .  *pIdx = i;.}.
c7e0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
c7f0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
c800: 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72  tatement appropr
c810: 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76  iate for the giv
c820: 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65  en.** table.  Me
c830: 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
c840: 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61   text of the sta
c850: 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e  tement is obtain
c860: 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ed.** from sqlit
c870: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
c880: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
c890: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
c8a0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ion..*/.static c
c8b0: 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65  har *createTable
c8c0: 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64 62  Stmt(sqlite3 *db
c8d0: 2c 20 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69  , Table *p){.  i
c8e0: 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68  nt i, k, n;.  ch
c8f0: 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61  ar *zStmt;.  cha
c900: 72 20 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c  r *zSep, *zSep2,
c910: 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e   *zEnd;.  Column
c920: 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b   *pCol;.  n = 0;
c930: 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d  .  for(pCol = p-
c940: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
c950: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
c960: 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64  ++){.    n += id
c970: 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e  entLength(pCol->
c980: 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a  zName) + 5;.  }.
c990: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
c9a0: 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  th(p->zName);.  
c9b0: 69 66 28 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20  if( n<50 ){ .   
c9c0: 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20   zSep = "";.    
c9d0: 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20  zSep2 = ",";.   
c9e0: 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d   zEnd = ")";.  }
c9f0: 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d  else{.    zSep =
ca00: 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65   "\n  ";.    zSe
ca10: 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20  p2 = ",\n  ";.  
ca20: 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a    zEnd = "\n)";.
ca30: 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20    }.  n += 35 + 
ca40: 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74  6*p->nCol;.  zSt
ca50: 6d 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  mt = sqlite3DbMa
ca60: 6c 6c 6f 63 52 61 77 28 30 2c 20 6e 29 3b 0a 20  llocRaw(0, n);. 
ca70: 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b   if( zStmt==0 ){
ca80: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
ca90: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72  ailed = 1;.    r
caa0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
cab0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
cac0: 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41 54  n, zStmt, "CREAT
cad0: 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20  E TABLE ");.  k 
cae0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
caf0: 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e  0(zStmt);.  iden
cb00: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
cb10: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74  p->zName);.  zSt
cb20: 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20  mt[k++] = '(';. 
cb30: 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f   for(pCol=p->aCo
cb40: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  l, i=0; i<p->nCo
cb50: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; i++, pCol++){
cb60: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
cb70: 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61  t char * const a
cb80: 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  zType[] = {.    
cb90: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46      /* SQLITE_AF
cba0: 46 5f 42 4c 4f 42 20 20 20 20 2a 2f 20 22 22 2c  F_BLOB    */ "",
cbb0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
cbc0: 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a  TE_AFF_TEXT    *
cbd0: 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20  / " TEXT",.     
cbe0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
cbf0: 5f 4e 55 4d 45 52 49 43 20 2a 2f 20 22 20 4e 55  _NUMERIC */ " NU
cc00: 4d 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  M",.        /* S
cc10: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
cc20: 52 20 2a 2f 20 22 20 49 4e 54 22 2c 0a 20 20 20  R */ " INT",.   
cc30: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
cc40: 46 46 5f 52 45 41 4c 20 20 20 20 2a 2f 20 22 20  FF_REAL    */ " 
cc50: 52 45 41 4c 22 0a 20 20 20 20 7d 3b 0a 20 20 20  REAL".    };.   
cc60: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 63 6f   int len;.    co
cc70: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
cc80: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ..    sqlite3_sn
cc90: 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74  printf(n-k, &zSt
cca0: 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20  mt[k], zSep);.  
ccb0: 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74    k += sqlite3St
ccc0: 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d  rlen30(&zStmt[k]
ccd0: 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53  );.    zSep = zS
cce0: 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75  ep2;.    identPu
ccf0: 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f  t(zStmt, &k, pCo
cd00: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61  l->zName);.    a
cd10: 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66  ssert( pCol->aff
cd20: 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46  inity-SQLITE_AFF
cd30: 5f 42 4c 4f 42 20 3e 3d 20 30 20 29 3b 0a 20 20  _BLOB >= 0 );.  
cd40: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
cd50: 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45 5f  affinity-SQLITE_
cd60: 41 46 46 5f 42 4c 4f 42 20 3c 20 41 72 72 61 79  AFF_BLOB < Array
cd70: 53 69 7a 65 28 61 7a 54 79 70 65 29 20 29 3b 0a  Size(azType) );.
cd80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
cd90: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
cda0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 29 3b  LITE_AFF_BLOB );
cdb0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
cdc0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
cdd0: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 29  QLITE_AFF_TEXT )
cde0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
cdf0: 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d  pCol->affinity==
ce00: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
ce10: 49 43 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IC );.    testca
ce20: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
ce30: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ty==SQLITE_AFF_I
ce40: 4e 54 45 47 45 52 20 29 3b 0a 20 20 20 20 74 65  NTEGER );.    te
ce50: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
ce60: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
ce70: 46 46 5f 52 45 41 4c 20 29 3b 0a 20 20 20 20 0a  FF_REAL );.    .
ce80: 20 20 20 20 7a 54 79 70 65 20 3d 20 61 7a 54 79      zType = azTy
ce90: 70 65 5b 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  pe[pCol->affinit
cea0: 79 20 2d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42  y - SQLITE_AFF_B
ceb0: 4c 4f 42 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  LOB];.    len = 
cec0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
ced0: 7a 54 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65  zType);.    asse
cee0: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
cef0: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 42  ty==SQLITE_AFF_B
cf00: 4c 4f 42 20 0a 20 20 20 20 20 20 20 20 20 20 20  LOB .           
cf10: 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69   || pCol->affini
cf20: 74 79 3d 3d 73 71 6c 69 74 65 33 41 66 66 69 6e  ty==sqlite3Affin
cf30: 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20 30  ityType(zType, 0
cf40: 29 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) );.    memcpy(
cf50: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 54 79 70 65  &zStmt[k], zType
cf60: 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 6b 20 2b 3d  , len);.    k +=
cf70: 20 6c 65 6e 3b 0a 20 20 20 20 61 73 73 65 72 74   len;.    assert
cf80: 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20 7d 0a 20 20  ( k<=n );.  }.  
cf90: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
cfa0: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
cfb0: 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20   "%s", zEnd);.  
cfc0: 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a  return zStmt;.}.
cfd0: 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 61 6e  ./*.** Resize an
cfe0: 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
cff0: 20 68 6f 6c 64 20 4e 20 63 6f 6c 75 6d 6e 73 20   hold N columns 
d000: 74 6f 74 61 6c 2e 20 20 52 65 74 75 72 6e 20 53  total.  Return S
d010: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
d020: 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54  uccess and SQLIT
d030: 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61 6e 20 4f 4f  E_NOMEM on an OO
d040: 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  M error..*/.stat
d050: 69 63 20 69 6e 74 20 72 65 73 69 7a 65 49 6e 64  ic int resizeInd
d060: 65 78 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  exObject(sqlite3
d070: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64   *db, Index *pId
d080: 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 63 68 61  x, int N){.  cha
d090: 72 20 2a 7a 45 78 74 72 61 3b 0a 20 20 69 6e 74  r *zExtra;.  int
d0a0: 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 49   nByte;.  if( pI
d0b0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 4e 20 29  dx->nColumn>=N )
d0c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d0d0: 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  K;.  assert( pId
d0e0: 78 2d 3e 69 73 52 65 73 69 7a 65 64 3d 3d 30 20  x->isResized==0 
d0f0: 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 73 69  );.  nByte = (si
d100: 7a 65 6f 66 28 63 68 61 72 2a 29 20 2b 20 73 69  zeof(char*) + si
d110: 7a 65 6f 66 28 69 31 36 29 20 2b 20 31 29 2a 4e  zeof(i16) + 1)*N
d120: 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 73 71 6c  ;.  zExtra = sql
d130: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
d140: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  (db, nByte);.  i
d150: 66 28 20 7a 45 78 74 72 61 3d 3d 30 20 29 20 72  f( zExtra==0 ) r
d160: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
d170: 45 4d 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78  EM;.  memcpy(zEx
d180: 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  tra, pIdx->azCol
d190: 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29  l, sizeof(char*)
d1a0: 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b  *pIdx->nColumn);
d1b0: 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20  .  pIdx->azColl 
d1c0: 3d 20 28 63 68 61 72 2a 2a 29 7a 45 78 74 72 61  = (char**)zExtra
d1d0: 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69  ;.  zExtra += si
d1e0: 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20  zeof(char*)*N;. 
d1f0: 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
d200: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  pIdx->aiColumn, 
d210: 73 69 7a 65 6f 66 28 69 31 36 29 2a 70 49 64 78  sizeof(i16)*pIdx
d220: 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49  ->nColumn);.  pI
d230: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  dx->aiColumn = (
d240: 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a  i16*)zExtra;.  z
d250: 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
d260: 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79  i16)*N;.  memcpy
d270: 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61  (zExtra, pIdx->a
d280: 53 6f 72 74 4f 72 64 65 72 2c 20 70 49 64 78 2d  SortOrder, pIdx-
d290: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64  >nColumn);.  pId
d2a0: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  x->aSortOrder = 
d2b0: 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70  (u8*)zExtra;.  p
d2c0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e  Idx->nColumn = N
d2d0: 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52 65 73 69  ;.  pIdx->isResi
d2e0: 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  zed = 1;.  retur
d2f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
d300: 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
d310: 68 65 20 74 6f 74 61 6c 20 72 6f 77 20 77 69 64  he total row wid
d320: 74 68 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a  th for a table..
d330: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
d340: 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74  stimateTableWidt
d350: 68 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  h(Table *pTab){.
d360: 20 20 75 6e 73 69 67 6e 65 64 20 77 54 61 62 6c    unsigned wTabl
d370: 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43  e = 0;.  const C
d380: 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a  olumn *pTabCol;.
d390: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
d3a0: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61  =pTab->nCol, pTa
d3b0: 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  bCol=pTab->aCol;
d3c0: 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43   i>0; i--, pTabC
d3d0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c  ol++){.    wTabl
d3e0: 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a  e += pTabCol->sz
d3f0: 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Est;.  }.  if( p
d400: 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77  Tab->iPKey<0 ) w
d410: 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d  Table++;.  pTab-
d420: 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69  >szTabRow = sqli
d430: 74 65 33 4c 6f 67 45 73 74 28 77 54 61 62 6c 65  te3LogEst(wTable
d440: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73  *4);.}../*.** Es
d450: 74 69 6d 61 74 65 20 74 68 65 20 61 76 65 72 61  timate the avera
d460: 67 65 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77  ge size of a row
d470: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a   for an index..*
d480: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 73  /.static void es
d490: 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68  timateIndexWidth
d4a0: 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
d4b0: 20 75 6e 73 69 67 6e 65 64 20 77 49 6e 64 65 78   unsigned wIndex
d4c0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
d4d0: 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61   const Column *a
d4e0: 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Col = pIdx->pTab
d4f0: 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28  le->aCol;.  for(
d500: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
d510: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
d520: 69 31 36 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  i16 x = pIdx->ai
d530: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61  Column[i];.    a
d540: 73 73 65 72 74 28 20 78 3c 70 49 64 78 2d 3e 70  ssert( x<pIdx->p
d550: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  Table->nCol );. 
d560: 20 20 20 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30     wIndex += x<0
d570: 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78   ? 1 : aCol[pIdx
d580: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73  ->aiColumn[i]].s
d590: 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78  zEst;.  }.  pIdx
d5a0: 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c  ->szIdxRow = sql
d5b0: 69 74 65 33 4c 6f 67 45 73 74 28 77 49 6e 64 65  ite3LogEst(wInde
d5c0: 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  x*4);.}../* Retu
d5d0: 72 6e 20 74 72 75 65 20 69 66 20 76 61 6c 75 65  rn true if value
d5e0: 20 78 20 69 73 20 66 6f 75 6e 64 20 61 6e 79 20   x is found any 
d5f0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e 43 6f  of the first nCo
d600: 6c 20 65 6e 74 72 69 65 73 20 6f 66 20 61 69 43  l entries of aiC
d610: 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ol[].*/.static i
d620: 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e  nt hasColumn(con
d630: 73 74 20 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69  st i16 *aiCol, i
d640: 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b  nt nCol, int x){
d650: 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d  .  while( nCol--
d660: 20 3e 20 30 20 29 20 69 66 28 20 78 3d 3d 2a 28   > 0 ) if( x==*(
d670: 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72  aiCol++) ) retur
d680: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
d690: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
d6a0: 6f 75 74 69 6e 65 20 72 75 6e 73 20 61 74 20 74  outine runs at t
d6b0: 68 65 20 65 6e 64 20 6f 66 20 70 61 72 73 69 6e  he end of parsin
d6c0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
d6d0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a   statement that.
d6e0: 2a 2a 20 68 61 73 20 61 20 57 49 54 48 4f 55 54  ** has a WITHOUT
d6f0: 20 52 4f 57 49 44 20 63 6c 61 75 73 65 2e 20 20   ROWID clause.  
d700: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
d710: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 63 6f  routine is to co
d720: 6e 76 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e  nvert both.** in
d730: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 61  ternal schema da
d740: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61 6e  ta structures an
d750: 64 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  d the generated 
d760: 56 44 42 45 20 63 6f 64 65 20 73 6f 20 74 68 61  VDBE code so tha
d770: 74 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 61 70  t they.** are ap
d780: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 61 20  propriate for a 
d790: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
d7a0: 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ble instead of a
d7b0: 20 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a   rowid table..**
d7c0: 20 43 68 61 6e 67 65 73 20 69 6e 63 6c 75 64 65   Changes include
d7d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
d7e0: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 4f 50 5f   Convert the OP_
d7f0: 43 72 65 61 74 65 54 61 62 6c 65 20 69 6e 74 6f  CreateTable into
d800: 20 61 6e 20 4f 50 5f 43 72 65 61 74 65 49 6e 64   an OP_CreateInd
d810: 65 78 2e 20 20 54 68 65 72 65 20 69 73 0a 2a 2a  ex.  There is.**
d820: 20 20 20 20 20 20 20 20 20 20 6e 6f 20 72 6f 77            no row
d830: 69 64 20 62 74 72 65 65 20 66 6f 72 20 61 20 57  id btree for a W
d840: 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 20 20 49  ITHOUT ROWID.  I
d850: 6e 73 74 65 61 64 2c 20 74 68 65 20 63 61 6e 6f  nstead, the cano
d860: 6e 69 63 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  nical.**        
d870: 20 20 64 61 74 61 20 73 74 6f 72 61 67 65 20 69    data storage i
d880: 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
d890: 65 78 20 62 74 72 65 65 2e 0a 2a 2a 20 20 20 20  ex btree..**    
d8a0: 20 28 32 29 20 20 42 79 70 61 73 73 20 74 68 65   (2)  Bypass the
d8b0: 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
d8c0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
d8d0: 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20  able entry.**   
d8e0: 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 50         for the P
d8f0: 52 49 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68  RIMARY KEY as th
d900: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  e primary key in
d910: 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20  dex is now.**   
d920: 20 20 20 20 20 20 20 69 64 65 6e 74 69 66 69 65         identifie
d930: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f  d by the sqlite_
d940: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74  master table ent
d950: 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ry of the table 
d960: 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28  itself..**     (
d970: 33 29 20 20 53 65 74 20 74 68 65 20 49 6e 64 65  3)  Set the Inde
d980: 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20 50 52  x.tnum of the PR
d990: 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20  IMARY KEY Index 
d9a0: 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a  object in the.**
d9b0: 20 20 20 20 20 20 20 20 20 20 73 63 68 65 6d 61            schema
d9c0: 20 74 6f 20 74 68 65 20 72 6f 6f 74 70 61 67 65   to the rootpage
d9d0: 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74   from the main t
d9e0: 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 34 29  able..**     (4)
d9f0: 20 20 53 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e    Set all column
da00: 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  s of the PRIMARY
da10: 20 4b 45 59 20 73 63 68 65 6d 61 20 6f 62 6a 65   KEY schema obje
da20: 63 74 20 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c  ct to be NOT NUL
da30: 4c 2e 0a 2a 2a 20 20 20 20 20 28 35 29 20 20 41  L..**     (5)  A
da40: 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c  dd all table col
da50: 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d  umns to the PRIM
da60: 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62  ARY KEY Index ob
da70: 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ject.**         
da80: 20 73 6f 20 74 68 61 74 20 74 68 65 20 50 52 49   so that the PRI
da90: 4d 41 52 59 20 4b 45 59 20 69 73 20 61 20 63 6f  MARY KEY is a co
daa0: 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 54  vering index.  T
dab0: 68 65 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20  he surplus.**   
dac0: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61         columns a
dad0: 72 65 20 70 61 72 74 20 6f 66 20 4b 65 79 49 6e  re part of KeyIn
dae0: 66 6f 2e 6e 58 46 69 65 6c 64 20 61 6e 64 20 61  fo.nXField and a
daf0: 72 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a  re not used for.
db00: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 72 74  **          sort
db10: 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72  ing or lookup or
db20: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63   uniqueness chec
db30: 6b 73 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20 20  ks..**     (6)  
db40: 52 65 70 6c 61 63 65 20 74 68 65 20 72 6f 77 69  Replace the rowi
db50: 64 20 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75  d tail on all au
db60: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65  tomatically gene
db70: 72 61 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20  rated UNIQUE.** 
db80: 20 20 20 20 20 20 20 20 20 69 6e 64 69 63 65 73           indices
db90: 20 77 69 74 68 20 74 68 65 20 50 52 49 4d 41 52   with the PRIMAR
dba0: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  Y KEY columns..*
dbb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
dbc0: 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f  nvertToWithoutRo
dbd0: 77 69 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a  widTable(Parse *
dbe0: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
dbf0: 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Tab){.  Index *p
dc00: 49 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50  Idx;.  Index *pP
dc10: 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20  k;.  int nPk;.  
dc20: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
dc30: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
dc40: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
dc50: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
dc60: 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
dc70: 68 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  he OP_CreateTabl
dc80: 65 20 6f 70 63 6f 64 65 20 74 68 61 74 20 77 6f  e opcode that wo
dc90: 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 63 72 65  uld normally cre
dca0: 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6f  ate the.  ** roo
dcb0: 74 2d 70 61 67 65 20 66 6f 72 20 74 68 65 20 74  t-page for the t
dcc0: 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f  able into an OP_
dcd0: 43 72 65 61 74 65 49 6e 64 65 78 20 6f 70 63 6f  CreateIndex opco
dce0: 64 65 2e 20 20 54 68 65 20 69 6e 64 65 78 0a 20  de.  The index. 
dcf0: 20 2a 2a 20 63 72 65 61 74 65 64 20 77 69 6c 6c   ** created will
dd00: 20 62 65 63 6f 6d 65 20 74 68 65 20 50 52 49 4d   become the PRIM
dd10: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 0a 20  ARY KEY index.. 
dd20: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
dd30: 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b 0a 20  ->addrCrTab ){. 
dd40: 20 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a     assert( v );.
dd50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
dd60: 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70  hangeOpcode(v, p
dd70: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
dd80: 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  , OP_CreateIndex
dd90: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
dda0: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
ddb0: 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20  KEY index.  Or, 
ddc0: 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 77 61  if this table wa
ddd0: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  s originally.  *
dde0: 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  * an INTEGER PRI
ddf0: 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20  MARY KEY table, 
de00: 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 52 49  create a new PRI
de10: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20  MARY KEY index. 
de20: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
de30: 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20  ->iPKey>=0 ){.  
de40: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
de50: 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b  t;.    Token ipk
de60: 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 70 6b 54 6f  Token;.    ipkTo
de70: 6b 65 6e 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43  ken.z = pTab->aC
de80: 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e  ol[pTab->iPKey].
de90: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 70 6b 54 6f  zName;.    ipkTo
dea0: 6b 65 6e 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53  ken.n = sqlite3S
deb0: 74 72 6c 65 6e 33 30 28 69 70 6b 54 6f 6b 65 6e  trlen30(ipkToken
dec0: 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  .z);.    pList =
ded0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
dee0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
def0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
df00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
df10: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c  Alloc(db, TK_ID,
df20: 20 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b   &ipkToken, 0));
df30: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
df40: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
df50: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74  pList->a[0].sort
df60: 4f 72 64 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  Order = pParse->
df70: 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  iPkSortOrder;.  
df80: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
df90: 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61  ->pNewTable==pTa
dfa0: 62 20 29 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73  b );.    pPk = s
dfb0: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
dfc0: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
dfd0: 30 2c 20 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e  0, pList, pTab->
dfe0: 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30  keyConf, 0, 0, 0
dff0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 50  , 0);.    if( pP
e000: 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  k==0 ) return;. 
e010: 20 20 20 70 50 6b 2d 3e 69 64 78 54 79 70 65 20     pPk->idxType 
e020: 3d 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  = SQLITE_IDXTYPE
e030: 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 20  _PRIMARYKEY;.   
e040: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
e050: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
e060: 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
e070: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
e080: 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 79 70 61  b);..    /* Bypa
e090: 73 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  ss the creation 
e0a0: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
e0b0: 45 59 20 62 74 72 65 65 20 61 6e 64 20 74 68 65  EY btree and the
e0c0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20   sqlite_master. 
e0d0: 20 20 20 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72     ** table entr
e0e0: 79 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20  y. This is only 
e0f0: 72 65 71 75 69 72 65 64 20 69 66 20 63 75 72 72  required if curr
e100: 65 6e 74 6c 79 20 67 65 6e 65 72 61 74 69 6e 67  ently generating
e110: 20 56 44 42 45 0a 20 20 20 20 2a 2a 20 63 6f 64   VDBE.    ** cod
e120: 65 20 66 6f 72 20 61 20 43 52 45 41 54 45 20 54  e for a CREATE T
e130: 41 42 4c 45 20 28 6e 6f 74 20 77 68 65 6e 20 70  ABLE (not when p
e140: 61 72 73 69 6e 67 20 6f 6e 65 20 61 73 20 70 61  arsing one as pa
e150: 72 74 20 6f 66 20 72 65 61 64 69 6e 67 0a 20 20  rt of reading.  
e160: 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20    ** a database 
e170: 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a 20 20 20  schema).  */.   
e180: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20   if( v ){.      
e190: 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74  assert( db->init
e1a0: 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20  .busy==0 );.    
e1b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
e1c0: 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70 50 6b  ngeOpcode(v, pPk
e1d0: 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29  ->tnum, OP_Goto)
e1e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
e1f0: 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 61 6c      ** Remove al
e200: 6c 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75  l redundant colu
e210: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 50 52 49  mns from the PRI
e220: 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 20 65  MARY KEY.  For e
e230: 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65 0a 20  xample, change. 
e240: 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b     ** "PRIMARY K
e250: 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63  EY(a,b,a,b,c,b,c
e260: 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73 74 20 22  ,d)" into just "
e270: 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c  PRIMARY KEY(a,b,
e280: 63 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a 20 20  c,d)".  Later.  
e290: 20 20 2a 2a 20 63 6f 64 65 20 61 73 73 75 6d 65    ** code assume
e2a0: 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
e2b0: 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 65  Y contains no re
e2c0: 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a  peated columns..
e2d0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
e2e0: 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65  =j=1; i<pPk->nKe
e2f0: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
e300: 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28    if( hasColumn(
e310: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a  pPk->aiColumn, j
e320: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
e330: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  i]) ){.        p
e340: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20  Pk->nColumn--;. 
e350: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e360: 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d      pPk->aiColum
e370: 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e 61 69  n[j++] = pPk->ai
e380: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
e390: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 6b   }.    }.    pPk
e3a0: 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b 0a 20  ->nKeyCol = j;. 
e3b0: 20 7d 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65   }.  pPk->isCove
e3c0: 72 69 6e 67 20 3d 20 31 3b 0a 20 20 61 73 73 65  ring = 1;.  asse
e3d0: 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20  rt( pPk!=0 );.  
e3e0: 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43  nPk = pPk->nKeyC
e3f0: 6f 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  ol;..  /* Make s
e400: 75 72 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e  ure every column
e410: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
e420: 4b 45 59 20 69 73 20 4e 4f 54 20 4e 55 4c 4c 2e  KEY is NOT NULL.
e430: 20 20 28 45 78 63 65 70 74 2c 0a 20 20 2a 2a 20    (Except,.  ** 
e440: 64 6f 20 6e 6f 74 20 65 6e 66 6f 72 63 65 20 74  do not enforce t
e450: 68 69 73 20 66 6f 72 20 69 6d 70 6f 73 74 65 72  his for imposter
e460: 20 74 61 62 6c 65 73 2e 29 20 2a 2f 0a 20 20 69   tables.) */.  i
e470: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70  f( !db->init.imp
e480: 6f 73 74 65 72 54 61 62 6c 65 20 29 7b 0a 20 20  osterTable ){.  
e490: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b    for(i=0; i<nPk
e4a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 54  ; i++){.      pT
e4b0: 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69  ab->aCol[pPk->ai
e4c0: 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75  Column[i]].notNu
e4d0: 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ll = 1;.    }.  
e4e0: 20 20 70 50 6b 2d 3e 75 6e 69 71 4e 6f 74 4e 75    pPk->uniqNotNu
e4f0: 6c 6c 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ll = 1;.  }..  /
e500: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
e510: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
e520: 45 59 20 69 73 20 74 68 65 20 74 61 62 6c 65 20  EY is the table 
e530: 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 70  root page */.  p
e540: 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62 2d  Pk->tnum = pTab-
e550: 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64  >tnum;..  /* Upd
e560: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
e570: 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
e580: 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 20 69   of all UNIQUE i
e590: 6e 64 69 63 65 73 20 62 79 20 63 6f 6e 76 65 72  ndices by conver
e5a0: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 69  ting.  ** the fi
e5b0: 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e  nal rowid column
e5c0: 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   into one or mor
e5d0: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
e5e0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20   PRIMARY KEY..  
e5f0: 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54  */.  for(pIdx=pT
e600: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
e610: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
e620: 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  xt){.    int n;.
e630: 20 20 20 20 69 66 28 20 49 73 50 72 69 6d 61 72      if( IsPrimar
e640: 79 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20  yKeyIndex(pIdx) 
e650: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
e660: 66 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b  for(i=n=0; i<nPk
e670: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
e680: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64  ( !hasColumn(pId
e690: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64  x->aiColumn, pId
e6a0: 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d  x->nKeyCol, pPk-
e6b0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20  >aiColumn[i]) ) 
e6c0: 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n++;.    }.    i
e6d0: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
e6e0: 20 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69   /* This index i
e6f0: 73 20 61 20 73 75 70 65 72 73 65 74 20 6f 66 20  s a superset of 
e700: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
e710: 2a 2f 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 6e  */.      pIdx->n
e720: 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e  Column = pIdx->n
e730: 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f  KeyCol;.      co
e740: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
e750: 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65    if( resizeInde
e760: 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64 78  xObject(db, pIdx
e770: 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b  , pIdx->nKeyCol+
e780: 6e 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  n) ) return;.   
e790: 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78   for(i=0, j=pIdx
e7a0: 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b  ->nKeyCol; i<nPk
e7b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
e7c0: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64  ( !hasColumn(pId
e7d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64  x->aiColumn, pId
e7e0: 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d  x->nKeyCol, pPk-
e7f0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b  >aiColumn[i]) ){
e800: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
e810: 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b  iColumn[j] = pPk
e820: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
e830: 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43         pIdx->azC
e840: 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a  oll[j] = pPk->az
e850: 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  Coll[i];.       
e860: 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j++;.      }.  
e870: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
e880: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70  pIdx->nColumn>=p
e890: 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29  Idx->nKeyCol+n )
e8a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
e8b0: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29  dx->nColumn>=j )
e8c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
e8d0: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
e8e0: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
e8f0: 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a   KEY index.  */.
e900: 20 20 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d 3e    if( nPk<pTab->
e910: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  nCol ){.    if( 
e920: 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63  resizeIndexObjec
e930: 74 28 64 62 2c 20 70 50 6b 2c 20 70 54 61 62 2d  t(db, pPk, pTab-
e940: 3e 6e 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 3b  >nCol) ) return;
e950: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d  .    for(i=0, j=
e960: 6e 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f  nPk; i<pTab->nCo
e970: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
e980: 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50  f( !hasColumn(pP
e990: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20  k->aiColumn, j, 
e9a0: 69 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  i) ){.        as
e9b0: 73 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f  sert( j<pPk->nCo
e9c0: 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  lumn );.        
e9d0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  pPk->aiColumn[j]
e9e0: 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 50   = i;.        pP
e9f0: 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 22  k->azColl[j] = "
ea00: 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 20  BINARY";.       
ea10: 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   j++;.      }.  
ea20: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
ea30: 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20  pPk->nColumn==j 
ea40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
ea50: 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a  Tab->nCol==j );.
ea60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b    }else{.    pPk
ea70: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62  ->nColumn = pTab
ea80: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ->nCol;.  }.}../
ea90: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
eaa0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72  e is called to r
eab0: 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20  eport the final 
eac0: 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ")" that termina
ead0: 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20  tes.** a CREATE 
eae0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
eaf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65  .**.** The table
eb00: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
eb10: 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75  other action rou
eb20: 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20  tines have been 
eb30: 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61  building.** is a
eb40: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65  dded to the inte
eb50: 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73  rnal hash tables
eb60: 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72  , assuming no er
eb70: 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63  rors have.** occ
eb80: 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  urred..**.** An 
eb90: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61  entry for the ta
eba0: 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74  ble is made in t
ebb0: 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
ebc0: 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a  on disk, unless.
ebd0: 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d  ** this is a tem
ebe0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20  porary table or 
ebf0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31  db->init.busy==1
ec00: 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74  .  When db->init
ec10: 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d  .busy==1.** it m
ec20: 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64  eans we are read
ec30: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  ing the sqlite_m
ec40: 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61  aster table beca
ec50: 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63  use we just.** c
ec60: 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20  onnected to the 
ec70: 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61  database or beca
ec80: 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d  use the sqlite_m
ec90: 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a  aster table has.
eca0: 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e  ** recently chan
ecb0: 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72  ged, so the entr
ecc0: 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65  y for this table
ecd0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
ece0: 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  in.** the sqlite
ecf0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20  _master table.  
ed00: 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74  We do not want t
ed10: 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69  o create it agai
ed20: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
ed30: 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74  pSelect argument
ed40: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74   is not NULL, it
ed50: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
ed60: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20   routine.** was 
ed70: 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
ed80: 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74   a table generat
ed90: 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43  ed from a .** "C
eda0: 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20  REATE TABLE ... 
edb0: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73  AS SELECT ..." s
edc0: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63  tatement.  The c
edd0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a  olumn names of.*
ede0: 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * the new table 
edf0: 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72  will match the r
ee00: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
ee10: 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64   SELECT..*/.void
ee20: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
ee30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
ee40: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
ee50: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
ee60: 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20    Token *pCons, 
ee70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ee80: 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72   ',' token after
ee90: 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
eea0: 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65   defn. */.  Toke
eeb0: 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20  n *pEnd,        
eec0: 20 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20 62      /* The ')' b
eed0: 65 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e  efore options in
eee0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
eef0: 45 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70 74  E */.  u8 tabOpt
ef00: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
ef10: 2a 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f 70  * Extra table op
ef20: 74 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30  tions. Usually 0
ef30: 2e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  . */.  Select *p
ef40: 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f  Select         /
ef50: 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20  * Select from a 
ef60: 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53  "CREATE ... AS S
ef70: 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54  ELECT" */.){.  T
ef80: 61 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20  able *p;        
ef90: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
efa0: 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73  new table */.  s
efb0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
efc0: 72 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20  rse->db; /* The 
efd0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
efe0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ion */.  int iDb
eff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f000: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69     /* Database i
f010: 6e 20 77 68 69 63 68 20 74 68 65 20 74 61 62 6c  n which the tabl
f020: 65 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64  e lives */.  Ind
f030: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
f040: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70         /* An imp
f050: 6c 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68  lied index of th
f060: 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66  e table */..  if
f070: 28 20 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65  ( pEnd==0 && pSe
f080: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  lect==0 ){.    r
f090: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
f0a0: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
f0b0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 70 20 3d 20  Failed );.  p = 
f0c0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
f0d0: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
f0e0: 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72  return;..  asser
f0f0: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
f100: 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b  y || !pSelect );
f110: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
f120: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31  ->init.busy is 1
f130: 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65   it means we are
f140: 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c   reading the SQL
f150: 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73   off the.  ** "s
f160: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72  qlite_master" or
f170: 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61   "sqlite_temp_ma
f180: 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74  ster" table on t
f190: 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f  he disk..  ** So
f1a0: 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f   do not write to
f1b0: 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e   the disk again.
f1c0: 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f    Extract the ro
f1d0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  ot page number. 
f1e0: 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c   ** for the tabl
f1f0: 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69  e from the db->i
f200: 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c  nit.newTnum fiel
f210: 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75  d.  (The page nu
f220: 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64  mber.  ** should
f230: 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74   have been put t
f240: 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69  here by the sqli
f250: 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65  teOpenCb routine
f260: 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  .).  */.  if( db
f270: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
f280: 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d     p->tnum = db-
f290: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
f2a0: 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c   }..  /* Special
f2b0: 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
f2c0: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 54 61  WITHOUT ROWID Ta
f2d0: 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20 74 61  bles */.  if( ta
f2e0: 62 4f 70 74 73 20 26 20 54 46 5f 57 69 74 68 6f  bOpts & TF_Witho
f2f0: 75 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 69  utRowid ){.    i
f300: 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20  f( (p->tabFlags 
f310: 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
f320: 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  nt) ){.      sql
f330: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
f340: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
f350: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6e 6f  AUTOINCREMENT no
f360: 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 57 49 54  t allowed on WIT
f370: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
f380: 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  s");.      retur
f390: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  n;.    }.    if(
f3a0: 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20   (p->tabFlags & 
f3b0: 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79  TF_HasPrimaryKey
f3c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
f3d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
f3e0: 61 72 73 65 2c 20 22 50 52 49 4d 41 52 59 20 4b  arse, "PRIMARY K
f3f0: 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e 20 74 61  EY missing on ta
f400: 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d  ble %s", p->zNam
f410: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
f420: 20 20 20 20 20 70 2d 3e 74 61 62 46 6c 61 67 73       p->tabFlags
f430: 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74 52 6f   |= TF_WithoutRo
f440: 77 69 64 20 7c 20 54 46 5f 4e 6f 56 69 73 69 62  wid | TF_NoVisib
f450: 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63  leRowid;.      c
f460: 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52  onvertToWithoutR
f470: 6f 77 69 64 54 61 62 6c 65 28 70 50 61 72 73 65  owidTable(pParse
f480: 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , p);.    }.  }.
f490: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
f4a0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
f4b0: 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  , p->pSchema);..
f4c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f4d0: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52  MIT_CHECK.  /* R
f4e0: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
f4f0: 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  all CHECK constr
f500: 61 69 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73  aint expressions
f510: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
f520: 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71  pCheck ){.    sq
f530: 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
f540: 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 65  Reference(pParse
f550: 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c  , p, NC_IsCheck,
f560: 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a   0, p->pCheck);.
f570: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
f580: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
f590: 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20  IT_CHECK) */..  
f5a0: 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  /* Estimate the 
f5b0: 61 76 65 72 61 67 65 20 72 6f 77 20 73 69 7a 65  average row size
f5c0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61   for the table a
f5d0: 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69  nd for all impli
f5e0: 65 64 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  ed indices */.  
f5f0: 65 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64  estimateTableWid
f600: 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 70 49 64  th(p);.  for(pId
f610: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
f620: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
f630: 65 78 74 29 7b 0a 20 20 20 20 65 73 74 69 6d 61  ext){.    estima
f640: 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 49 64  teIndexWidth(pId
f650: 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  x);.  }..  /* If
f660: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e   not initializin
f670: 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  g, then create a
f680: 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20   record for the 
f690: 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69  new table.  ** i
f6a0: 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  n the SQLITE_MAS
f6b0: 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65  TER table of the
f6c0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a   database..  **.
f6d0: 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
f6e0: 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c  a TEMPORARY tabl
f6f0: 65 2c 20 77 72 69 74 65 20 74 68 65 20 65 6e 74  e, write the ent
f700: 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69  ry into the auxi
f710: 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20  liary.  ** file 
f720: 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20  instead of into 
f730: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
f740: 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  e file..  */.  i
f750: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
f760: 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  y ){.    int n;.
f770: 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
f780: 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20   char *zType;   
f790: 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74   /* "view" or "t
f7a0: 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61  able" */.    cha
f7b0: 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20  r *zType2;   /* 
f7c0: 22 56 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45  "VIEW" or "TABLE
f7d0: 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  " */.    char *z
f7e0: 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74  Stmt;    /* Text
f7f0: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 54   of the CREATE T
f800: 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56  ABLE or CREATE V
f810: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  IEW statement */
f820: 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65  ..    v = sqlite
f830: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
f840: 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
f850: 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  v==0) ) return;.
f860: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f870: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
f880: 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  se, 0);..    /* 
f890: 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69  .    ** Initiali
f8a0: 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65  ze zType for the
f8b0: 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61 62   new view or tab
f8c0: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
f8d0: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  f( p->pSelect==0
f8e0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72   ){.      /* A r
f8f0: 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a  egular table */.
f900: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74        zType = "t
f910: 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79  able";.      zTy
f920: 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23  pe2 = "TABLE";.#
f930: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
f940: 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73  IT_VIEW.    }els
f950: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69  e{.      /* A vi
f960: 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70  ew */.      zTyp
f970: 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20  e = "view";.    
f980: 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57    zType2 = "VIEW
f990: 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  ";.#endif.    }.
f9a0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
f9b0: 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  is a CREATE TABL
f9c0: 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e  E xx AS SELECT .
f9d0: 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20  .., execute the 
f9e0: 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74  SELECT.    ** st
f9f0: 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c  atement to popul
fa00: 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ate the new tabl
fa10: 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65  e. The root-page
fa20: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a   number for the.
fa30: 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65      ** new table
fa40: 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72 20   is in register 
fa50: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e  pParse->regRoot.
fa60: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
fa70: 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68  nce the SELECT h
fa80: 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79  as been coded by
fa90: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
faa0: 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20  , it is in a.   
fab0: 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61   ** suitable sta
fac0: 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  te to query for 
fad0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
fae0: 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65   and types to be
faf0: 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20   used.    ** by 
fb00: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20  the new table.. 
fb10: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73     **.    ** A s
fb20: 68 61 72 65 64 2d 63 61 63 68 65 20 77 72 69 74  hared-cache writ
fb30: 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  e-lock is not re
fb40: 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65 20  quired to write 
fb50: 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  to the new table
fb60: 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63  ,.    ** as a sc
fb70: 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68  hema-lock must h
fb80: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
fb90: 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65   obtained to cre
fba0: 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20  ate it. Since.  
fbb0: 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f    ** a schema-lo
fbc0: 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20  ck excludes all 
fbd0: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 75  other database u
fbe0: 73 65 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d  sers, the write-
fbf0: 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a  lock would.    *
fc00: 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a  * be redundant..
fc10: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
fc20: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
fc30: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
fc40: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68 65      /* Where the
fc50: 20 53 45 4c 45 43 54 20 73 68 6f 75 6c 64 20 73   SELECT should s
fc60: 74 6f 72 65 20 72 65 73 75 6c 74 73 20 2a 2f 0a  tore results */.
fc70: 20 20 20 20 20 20 69 6e 74 20 72 65 67 59 69 65        int regYie
fc80: 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 67  ld;       /* Reg
fc90: 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f  ister holding co
fca0: 2d 72 6f 75 74 69 6e 65 20 65 6e 74 72 79 2d 70  -routine entry-p
fcb0: 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  oint */.      in
fcc0: 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20  t addrTop;      
fcd0: 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
fce0: 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  co-routine */.  
fcf0: 20 20 20 20 69 6e 74 20 72 65 67 52 65 63 3b 20      int regRec; 
fd00: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 72 65 63          /* A rec
fd10: 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ord to be insert
fd20: 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 74 61   into the new ta
fd30: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ble */.      int
fd40: 20 72 65 67 52 6f 77 69 64 3b 20 20 20 20 20 20   regRowid;      
fd50: 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20 74 68 65   /* Rowid of the
fd60: 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 69 6e 73   next row to ins
fd70: 65 72 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ert */.      int
fd80: 20 61 64 64 72 49 6e 73 4c 6f 6f 70 3b 20 20 20   addrInsLoop;   
fd90: 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c   /* Top of the l
fda0: 6f 6f 70 20 66 6f 72 20 69 6e 73 65 72 74 69 6e  oop for insertin
fdb0: 67 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20 20 20  g rows */.      
fdc0: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20  Table *pSelTab; 
fdd0: 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 74      /* A table t
fde0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
fdf0: 65 20 53 45 4c 45 43 54 20 72 65 73 75 6c 74 73  e SELECT results
fe00: 20 2a 2f 0a 0a 20 20 20 20 20 20 72 65 67 59 69   */..      regYi
fe10: 65 6c 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  eld = ++pParse->
fe20: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52  nMem;.      regR
fe30: 65 63 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ec = ++pParse->n
fe40: 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67 52 6f  Mem;.      regRo
fe50: 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
fe60: 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  nMem;.      asse
fe70: 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d  rt(pParse->nTab=
fe80: 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  =1);.      sqlit
fe90: 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  e3MayAbort(pPars
fea0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
feb0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
fec0: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c 20  P_OpenWrite, 1, 
fed0: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c  pParse->regRoot,
fee0: 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c   iDb);.      sql
fef0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
ff00: 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53 52  (v, OPFLAG_P2ISR
ff10: 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  EG);.      pPars
ff20: 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20 20  e->nTab = 2;.   
ff30: 20 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c     addrTop = sql
ff40: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
ff50: 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 20 20 20  ddr(v) + 1;.    
ff60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ff70: 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 74 43 6f  Op3(v, OP_InitCo
ff80: 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c  routine, regYiel
ff90: 64 2c 20 30 2c 20 61 64 64 72 54 6f 70 29 3b 0a  d, 0, addrTop);.
ffa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
ffb0: 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73  ectDestInit(&des
ffc0: 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e 65  t, SRT_Coroutine
ffd0: 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
ffe0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
fff0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
10000 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20  , &dest);.      
10010 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10020 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75  1(v, OP_EndCorou
10030 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b  tine, regYield);
10040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
10050 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
10060 64 72 54 6f 70 20 2d 20 31 29 3b 0a 20 20 20 20  drTop - 1);.    
10070 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
10080 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  rr ) return;.   
10090 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
100a0 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
100b0 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
100c0 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 69 66  elect);.      if
100d0 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72  ( pSelTab==0 ) r
100e0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 73 73  eturn;.      ass
100f0 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20  ert( p->aCol==0 
10100 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c  );.      p->nCol
10110 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c   = pSelTab->nCol
10120 3b 0a 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20  ;.      p->aCol 
10130 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
10140 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  .      pSelTab->
10150 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
10160 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20  pSelTab->aCol = 
10170 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
10180 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
10190 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20  pSelTab);.      
101a0 61 64 64 72 49 6e 73 4c 6f 6f 70 20 3d 20 73 71  addrInsLoop = sq
101b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
101c0 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20 64 65 73  v, OP_Yield, des
101d0 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
101e0 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76    VdbeCoverage(v
101f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10200 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
10210 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 64 65 73  _MakeRecord, des
10220 74 2e 69 53 64 73 74 2c 20 64 65 73 74 2e 6e 53  t.iSdst, dest.nS
10230 64 73 74 2c 20 72 65 67 52 65 63 29 3b 0a 20 20  dst, regRec);.  
10240 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
10250 41 66 66 69 6e 69 74 79 28 76 2c 20 70 2c 20 30  Affinity(v, p, 0
10260 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10270 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10280 5f 4e 65 77 52 6f 77 69 64 2c 20 31 2c 20 72 65  _NewRowid, 1, re
10290 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
102a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
102b0 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 31  (v, OP_Insert, 1
102c0 2c 20 72 65 67 52 65 63 2c 20 72 65 67 52 6f 77  , regRec, regRow
102d0 69 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  id);.      sqlit
102e0 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61 64  e3VdbeGoto(v, ad
102f0 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20  drInsLoop);.    
10300 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
10310 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 73  pHere(v, addrIns
10320 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Loop);.      sql
10330 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
10340 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a  , OP_Close, 1);.
10350 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
10360 6d 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65  mpute the comple
10370 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
10380 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20  REATE statement 
10390 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65  */.    if( pSele
103a0 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d  ct ){.      zStm
103b0 74 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53  t = createTableS
103c0 74 6d 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  tmt(db, p);.    
103d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 6f 6b  }else{.      Tok
103e0 65 6e 20 2a 70 45 6e 64 32 20 3d 20 74 61 62 4f  en *pEnd2 = tabO
103f0 70 74 73 20 3f 20 26 70 50 61 72 73 65 2d 3e 73  pts ? &pParse->s
10400 4c 61 73 74 54 6f 6b 65 6e 20 3a 20 70 45 6e 64  LastToken : pEnd
10410 3b 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74  ;.      n = (int
10420 29 28 70 45 6e 64 32 2d 3e 7a 20 2d 20 70 50 61  )(pEnd2->z - pPa
10430 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
10440 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  z);.      if( pE
10450 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27 3b 27 20 29  nd2->z[0]!=';' )
10460 20 6e 20 2b 3d 20 70 45 6e 64 32 2d 3e 6e 3b 0a   n += pEnd2->n;.
10470 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
10480 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
10490 20 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45   .          "CRE
104a0 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a 54  ATE %s %.*s", zT
104b0 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65 2d  ype2, n, pParse-
104c0 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20 20  >sNameToken.z.  
104d0 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
104e0 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72 20    /* A slot for 
104f0 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20 61  the record has a
10500 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
10510 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20 20  cated in the .  
10520 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53 54    ** SQLITE_MAST
10530 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a 75  ER table.  We ju
10540 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61 74  st need to updat
10550 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74 68  e that slot with
10560 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20   all.    ** the 
10570 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27 76  information we'v
10580 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a 20 20 20  e collected..   
10590 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
105a0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
105b0 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45  e,.      "UPDATE
105c0 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20   %Q.%s ".       
105d0 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27    "SET type='%s'
105e0 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e  , name=%Q, tbl_n
105f0 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65  ame=%Q, rootpage
10600 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20  =#%d, sql=%Q ". 
10610 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77        "WHERE row
10620 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64  id=#%d",.      d
10630 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
10640 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
10650 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70  iDb),.      zTyp
10660 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
10670 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
10680 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  e,.      pParse-
10690 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20  >regRoot,.      
106a0 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61  zStmt,.      pPa
106b0 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20  rse->regRowid.  
106c0 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
106d0 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74  DbFree(db, zStmt
106e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
106f0 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
10700 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  e, iDb);..#ifnde
10710 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10720 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
10730 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
10740 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  if we need to cr
10750 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73  eate an sqlite_s
10760 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f  equence table fo
10770 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67  r.    ** keeping
10780 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e   track of autoin
10790 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20  crement keys..  
107a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
107b0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
107c0 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20  toincrement ){. 
107d0 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26       Db *pDb = &
107e0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
107f0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
10800 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
10810 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
10820 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
10830 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
10840 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
10850 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
10860 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
10870 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
10880 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71  LE %Q.sqlite_seq
10890 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22  uence(name,seq)"
108a0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ,.          pDb-
108b0 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29  >zName.        )
108c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
108d0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52  #endif..    /* R
108e0 65 70 61 72 73 65 20 65 76 65 72 79 74 68 69 6e  eparse everythin
108f0 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20  g to update our 
10900 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74  internal data st
10910 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20  ructures */.    
10920 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61  sqlite3VdbeAddPa
10930 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69  rseSchemaOp(v, i
10940 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73  Db,.           s
10950 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
10960 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27  , "tbl_name='%q'
10970 20 41 4e 44 20 74 79 70 65 21 3d 27 74 72 69 67   AND type!='trig
10980 67 65 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  ger'", p->zName)
10990 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64  );.  }...  /* Ad
109a0 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74  d the table to t
109b0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70  he in-memory rep
109c0 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
109d0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
109e0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
109f0 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62  .busy ){.    Tab
10a00 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63  le *pOld;.    Sc
10a10 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
10a20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  p->pSchema;.    
10a30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
10a40 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
10a50 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
10a60 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
10a70 48 61 73 68 49 6e 73 65 72 74 28 26 70 53 63 68  HashInsert(&pSch
10a80 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d  ema->tblHash, p-
10a90 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20  >zName, p);.    
10aa0 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
10ab0 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
10ac0 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
10ad0 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
10ae0 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
10af0 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 64 62  rt() */.      db
10b00 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
10b10 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
10b20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
10b30 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
10b40 30 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73  0;.    db->flags
10b50 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
10b60 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64  nChanges;..#ifnd
10b70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
10b80 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66  LTERTABLE.    if
10b90 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b  ( !p->pSelect ){
10ba0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
10bb0 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73  r *zName = (cons
10bc0 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d  t char *)pParse-
10bd0 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20  >sNameToken.z;. 
10be0 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a       int nName;.
10bf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
10c00 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20  Select && pCons 
10c10 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20  && pEnd );.     
10c20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30   if( pCons->z==0
10c30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e   ){.        pCon
10c40 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  s = pEnd;.      
10c50 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20  }.      nName = 
10c60 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61  (int)((const cha
10c70 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a  r *)pCons->z - z
10c80 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Name);.      p->
10c90 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31  addColOffset = 1
10ca0 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43  3 + sqlite3Utf8C
10cb0 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e  harLen(zName, nN
10cc0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  ame);.    }.#end
10cd0 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  if.  }.}..#ifnde
10ce0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10cf0 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72  EW./*.** The par
10d00 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  ser calls this r
10d10 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20  outine in order 
10d20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
10d30 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  VIEW.*/.void sql
10d40 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a  ite3CreateView(.
10d50 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10d60 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
10d70 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
10d80 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20   Token *pBegin, 
10d90 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54      /* The CREAT
10da0 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67  E token that beg
10db0 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ins the statemen
10dc0 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  t */.  Token *pN
10dd0 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame1,     /* The
10de0 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
10df0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
10e00 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65  e view */.  Toke
10e10 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
10e20 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
10e30 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
10e40 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
10e50 20 45 78 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d   ExprList *pCNam
10e60 65 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20  es, /* Optional 
10e70 6c 69 73 74 20 6f 66 20 76 69 65 77 20 63 6f 6c  list of view col
10e80 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53  umn names */.  S
10e90 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
10ea0 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74    /* A SELECT st
10eb0 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
10ec0 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77  l become the new
10ed0 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
10ee0 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  sTemp,        /*
10ef0 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50   TRUE for a TEMP
10f00 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20  ORARY view */.  
10f10 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20  int noErr       
10f20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65     /* Suppress e
10f30 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66  rror messages if
10f40 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78   VIEW already ex
10f50 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
10f60 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a  le *p;.  int n;.
10f70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
10f80 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20  .  Token sEnd;. 
10f90 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20   DbFixer sFix;. 
10fa0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20   Token *pName = 
10fb0 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20  0;.  int iDb;.  
10fc0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
10fd0 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
10fe0 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20   pParse->nVar>0 
10ff0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
11000 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
11010 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e  parameters are n
11020 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69  ot allowed in vi
11030 65 77 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ews");.    goto 
11040 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
11050 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53  ;.  }.  sqlite3S
11060 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
11070 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
11080 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20  , isTemp, 1, 0, 
11090 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50  noErr);.  p = pP
110a0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
110b0 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
110c0 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
110d0 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66  to create_view_f
110e0 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54 77  ail;.  sqlite3Tw
110f0 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
11100 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
11110 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62  , &pName);.  iDb
11120 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
11130 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
11140 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
11150 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
11160 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76   pParse, iDb, "v
11170 69 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  iew", pName);.  
11180 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 65  if( sqlite3FixSe
11190 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c  lect(&sFix, pSel
111a0 65 63 74 29 20 29 20 67 6f 74 6f 20 63 72 65 61  ect) ) goto crea
111b0 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20  te_view_fail;.. 
111c0 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
111d0 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45  of the entire SE
111e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
111f0 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
11200 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20  view..  ** This 
11210 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74  will force all t
11220 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20  he Expr.token.z 
11230 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e  values to be dyn
11240 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c  amically.  ** al
11250 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74  located rather t
11260 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  han point to the
11270 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20   input string - 
11280 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
11290 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20  .  ** they will 
112a0 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68  persist after th
112b0 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65  e current sqlite
112c0 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65  3_exec() call re
112d0 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d  turns..  */.  p-
112e0 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
112f0 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
11300 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50  pSelect, EXPRDUP
11310 5f 52 45 44 55 43 45 29 3b 0a 20 20 70 2d 3e 70  _REDUCE);.  p->p
11320 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45  Check = sqlite3E
11330 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
11340 43 4e 61 6d 65 73 2c 20 45 58 50 52 44 55 50 5f  CNames, EXPRDUP_
11350 52 45 44 55 43 45 29 3b 0a 20 20 69 66 28 20 64  REDUCE);.  if( d
11360 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
11370 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69  ) goto create_vi
11380 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4c  ew_fail;..  /* L
11390 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  ocate the end of
113a0 20 74 68 65 20 43 52 45 41 54 45 20 56 49 45 57   the CREATE VIEW
113b0 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b   statement.  Mak
113c0 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a  e sEnd point to.
113d0 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20    ** the end..  
113e0 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50 61 72  */.  sEnd = pPar
113f0 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a  se->sLastToken;.
11400 20 20 61 73 73 65 72 74 28 20 73 45 6e 64 2e 7a    assert( sEnd.z
11410 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  [0]!=0 );.  if( 
11420 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
11430 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
11440 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
11450 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
11460 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70  (int)(sEnd.z - p
11470 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61 73 73  Begin->z);.  ass
11480 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 7a 20  ert( n>0 );.  z 
11490 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77  = pBegin->z;.  w
114a0 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73  hile( sqlite3Iss
114b0 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20  pace(z[n-1]) ){ 
114c0 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20  n--; }.  sEnd.z 
114d0 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e  = &z[n-1];.  sEn
114e0 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55  d.n = 1;..  /* U
114f0 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  se sqlite3EndTab
11500 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20  le() to add the 
11510 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49  view to the SQLI
11520 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
11530 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54  */.  sqlite3EndT
11540 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
11550 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 0a 63  &sEnd, 0, 0);..c
11560 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3a  reate_view_fail:
11570 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
11580 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
11590 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ct);.  sqlite3Ex
115a0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
115b0 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65 74   pCNames);.  ret
115c0 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  urn;.}.#endif /*
115d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
115e0 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  W */..#if !defin
115f0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
11600 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
11610 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
11620 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a  TUALTABLE)./*.**
11630 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   The Table struc
11640 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72  ture pTable is r
11650 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46  eally a VIEW.  F
11660 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73  ill in the names
11670 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d   of.** the colum
11680 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69  ns of the view i
11690 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72  n the pTable str
116a0 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20  ucture.  Return 
116b0 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66  the number.** of
116c0 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20   errors.  If an 
116d0 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65  error is seen le
116e0 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
116f0 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
11700 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
11710 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f  sqlite3ViewGetCo
11720 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20  lumnNames(Parse 
11730 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
11740 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65  pTable){.  Table
11750 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20   *pSelTab;   /* 
11760 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f  A fake table fro
11770 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74  m which we get t
11780 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
11790 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b  .  Select *pSel;
117a0 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
117b0 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20  the SELECT that 
117c0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76  implements the v
117d0 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72  iew */.  int nEr
117e0 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75  r = 0;     /* Nu
117f0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65  mber of errors e
11800 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20  ncountered */.  
11810 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
11820 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79    /* Temporarily
11830 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65   holds the numbe
11840 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73  r of cursors ass
11850 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  igned */.  sqlit
11860 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
11870 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73  >db;  /* Databas
11880 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72  e connection for
11890 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a   malloc errors *
118a0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 78 61 75 74  /.  sqlite3_xaut
118b0 68 20 78 41 75 74 68 3b 20 20 20 20 20 20 20 2f  h xAuth;       /
118c0 2a 20 53 61 76 65 64 20 78 41 75 74 68 20 70 6f  * Saved xAuth po
118d0 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 62 45  inter */.  u8 bE
118e0 6e 61 62 6c 65 64 4c 41 3b 20 20 20 20 20 20 20  nabledLA;       
118f0 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 64        /* Saved d
11900 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
11910 61 62 6c 65 64 20 73 74 61 74 65 20 2a 2f 0a 0a  abled state */..
11920 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
11930 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
11940 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
11950 54 41 42 4c 45 0a 20 20 69 66 28 20 73 71 6c 69  TABLE.  if( sqli
11960 74 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65  te3VtabCallConne
11970 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  ct(pParse, pTabl
11980 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
11990 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
119a0 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75   }.  if( IsVirtu
119b0 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65 74  al(pTable) ) ret
119c0 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  urn 0;.#endif..#
119d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
119e0 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70  IT_VIEW.  /* A p
119f0 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61  ositive nCol mea
11a00 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e  ns the columns n
11a10 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69  ames for this vi
11a20 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65  ew are.  ** alre
11a30 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a  ady known..  */.
11a40 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
11a50 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ol>0 ) return 0;
11a60 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76  ..  /* A negativ
11a70 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63  e nCol is a spec
11a80 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69  ial marker meani
11a90 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63  ng that we are c
11aa0 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72  urrently.  ** tr
11ab0 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20  ying to compute 
11ac0 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
11ad0 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74  .  If we enter t
11ae0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
11af0 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65  .  ** a negative
11b00 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20   nCol, it means 
11b10 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77  two or more view
11b20 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c  s form a loop, l
11b30 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
11b40 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
11b50 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43  IEW one AS SELEC
11b60 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20  T * FROM two;.  
11b70 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
11b80 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54  EW two AS SELECT
11b90 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a   * FROM one;.  *
11ba0 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
11bb0 20 74 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65   the error above
11bc0 20 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70   is now caught p
11bd0 72 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67  rior to reaching
11be0 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a   this point..  *
11bf0 2a 20 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77  * But the follow
11c00 69 6e 67 20 74 65 73 74 20 69 73 20 73 74 69 6c  ing test is stil
11c10 6c 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69  l important as i
11c20 74 20 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20  t does come up. 
11c30 20 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f   ** in the follo
11c40 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a  wing:.  ** .  **
11c50 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
11c60 45 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20  E main.ex1(a);. 
11c70 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54   **     CREATE T
11c80 45 4d 50 20 56 49 45 57 20 65 78 31 20 41 53 20  EMP VIEW ex1 AS 
11c90 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78  SELECT a FROM ex
11ca0 31 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  1;.  **     SELE
11cb0 43 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65  CT * FROM temp.e
11cc0 78 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  x1;.  */.  if( p
11cd0 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b  Table->nCol<0 ){
11ce0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
11cf0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
11d00 65 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61  ew %s is circula
11d10 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54  rly defined", pT
11d20 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
11d30 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
11d40 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
11d50 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20  ->nCol>=0 );..  
11d60 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
11d70 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
11d80 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  we need to compu
11d90 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  te the table nam
11da0 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68  es..  ** Note th
11db0 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  at the call to s
11dc0 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
11dd0 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65  fSelect() will e
11de0 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22  xpand any.  ** "
11df0 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  *" elements in t
11e00 68 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f  he results set o
11e10 66 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77  f the view and w
11e20 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f  ill assign curso
11e30 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65  rs.  ** to the e
11e40 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46  lements of the F
11e50 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74  ROM clause.  But
11e60 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   we do not want 
11e70 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20  these changes.  
11e80 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65  ** to be permane
11e90 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70  nt.  So the comp
11ea0 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20  utation is done 
11eb0 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  on a copy of the
11ec0 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61   SELECT.  ** sta
11ed0 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
11ee0 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
11ef0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
11f00 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a  ble->pSelect );.
11f10 20 20 62 45 6e 61 62 6c 65 64 4c 41 20 3d 20 64    bEnabledLA = d
11f20 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
11f30 61 62 6c 65 64 3b 0a 20 20 69 66 28 20 70 54 61  abled;.  if( pTa
11f40 62 6c 65 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20  ble->pCheck ){. 
11f50 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
11f60 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 20  .bEnabled = 0;. 
11f70 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
11f80 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 50  sFromExprList(pP
11f90 61 72 73 65 2c 20 70 54 61 62 6c 65 2d 3e 70 43  arse, pTable->pC
11fa0 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20  heck, .         
11fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fc0 20 20 20 20 20 20 26 70 54 61 62 6c 65 2d 3e 6e        &pTable->n
11fd0 43 6f 6c 2c 20 26 70 54 61 62 6c 65 2d 3e 61 43  Col, &pTable->aC
11fe0 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol);.  }else{.  
11ff0 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33    pSel = sqlite3
12000 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
12010 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30  able->pSelect, 0
12020 29 3b 0a 20 20 20 20 69 66 28 20 70 53 65 6c 20  );.    if( pSel 
12030 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70 50 61  ){.      n = pPa
12040 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 20  rse->nTab;.     
12050 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
12060 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
12070 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29  rse, pSel->pSrc)
12080 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
12090 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20  nCol = -1;.     
120a0 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
120b0 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 23 69 66  Enabled = 0;.#if
120c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
120d0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
120e0 20 20 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d       xAuth = db-
120f0 3e 78 41 75 74 68 3b 0a 20 20 20 20 20 20 64 62  >xAuth;.      db
12100 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20  ->xAuth = 0;.   
12110 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c     pSelTab = sql
12120 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53  ite3ResultSetOfS
12130 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53  elect(pParse, pS
12140 65 6c 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 78  el);.      db->x
12150 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65  Auth = xAuth;.#e
12160 6c 73 65 0a 20 20 20 20 20 20 70 53 65 6c 54 61  lse.      pSelTa
12170 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
12180 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
12190 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64  rse, pSel);.#end
121a0 69 66 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  if.      pParse-
121b0 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 20  >nTab = n;.     
121c0 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a   if( pSelTab ){.
121d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
121e0 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
121f0 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c  );.        pTabl
12200 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  e->nCol = pSelTa
12210 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->nCol;.       
12220 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20   pTable->aCol = 
12230 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20  pSelTab->aCol;. 
12240 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
12250 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  nCol = 0;.      
12260 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
12270 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
12280 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
12290 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
122a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
122b0 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
122c0 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 54 61 62  Held(db, 0, pTab
122d0 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a  le->pSchema) );.
122e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
122f0 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f       pTable->nCo
12300 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  l = 0;.        n
12310 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  Err++;.      }. 
12320 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
12330 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
12340 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  l);.    } else {
12350 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20  .      nErr++;. 
12360 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c     }.  }.  db->l
12370 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
12380 64 20 3d 20 62 45 6e 61 62 6c 65 64 4c 41 3b 0a  d = bEnabledLA;.
12390 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
123a0 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 20 7c  a->schemaFlags |
123b0 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  = DB_UnresetView
123c0 73 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  s;.#endif /* SQL
123d0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
123e0 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20  .  return nErr; 
123f0 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64   .}.#endif /* !d
12400 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
12410 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
12420 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
12430 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a  _VIRTUALTABLE) *
12440 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
12450 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
12460 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75  * Clear the colu
12470 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76  mn names from ev
12480 65 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61  ery VIEW in data
12490 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61  base idx..*/.sta
124a0 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56  tic void sqliteV
124b0 69 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69  iewResetAll(sqli
124c0 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78  te3 *db, int idx
124d0 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
124e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
124f0 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
12500 6c 64 28 64 62 2c 20 69 64 78 2c 20 30 29 20 29  ld(db, idx, 0) )
12510 3b 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72  ;.  if( !DbHasPr
12520 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
12530 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
12540 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
12550 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
12560 73 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d  st(&db->aDb[idx]
12570 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  .pSchema->tblHas
12580 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61  h); i;i=sqliteHa
12590 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
125a0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71  Table *pTab = sq
125b0 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b  liteHashData(i);
125c0 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70  .    if( pTab->p
125d0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
125e0 73 71 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c  sqlite3DeleteCol
125f0 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61  umnNames(db, pTa
12600 62 29 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  b);.      pTab->
12610 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
12620 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  pTab->nCol = 0;.
12630 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c      }.  }.  DbCl
12640 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20  earProperty(db, 
12650 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56  idx, DB_UnresetV
12660 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  iews);.}.#else.#
12670 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69   define sqliteVi
12680 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a  ewResetAll(A,B).
12690 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
126a0 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f  _OMIT_VIEW */../
126b0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
126c0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
126d0 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75  the VDBE to adju
126e0 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  st the internal 
126f0 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62  schema.** used b
12700 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68  y SQLite when th
12710 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f  e btree layer mo
12720 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74  ves a table root
12730 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f   page. The.** ro
12740 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62  ot-page of a tab
12750 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64  le or index in d
12760 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73 20  atabase iDb has 
12770 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72  changed from iFr
12780 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a  om.** to iTo..**
12790 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38  .** Ticket #1728
127a0 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61  :  The symbol ta
127b0 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20  ble might still 
127c0 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74  contain informat
127d0 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73  ion.** on tables
127e0 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20   and/or indices 
127f0 74 68 61 74 20 61 72 65 20 74 68 65 20 70 72 6f  that are the pro
12800 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65  cess of being de
12810 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75  leted..** If you
12820 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e   are unlucky, on
12830 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74  e of those delet
12840 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61  ed indices or ta
12850 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61  bles might.** ha
12860 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74  ve the same root
12870 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74  page number as t
12880 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72  he real table or
12890 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a   index that is.*
128a0 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20  * being moved.  
128b0 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f  So we cannot sto
128c0 70 20 73 65 61 72 63 68 69 6e 67 20 61 66 74 65  p searching afte
128d0 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  r the first matc
128e0 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68  h .** because th
128f0 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69  e first match mi
12900 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f  ght be for one o
12910 66 20 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e  f the deleted in
12920 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c  dices.** or tabl
12930 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74  es and not the t
12940 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20  able/index that 
12950 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  is actually bein
12960 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d  g moved..** We m
12970 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f  ust continue loo
12980 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74  ping until all t
12990 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65  ables and indice
129a0 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61  s with.** rootpa
129b0 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62  ge==iFrom have b
129c0 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f  een converted to
129d0 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65   have a rootpage
129e0 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72   of iTo.** in or
129f0 64 65 72 20 74 6f 20 62 65 20 63 65 72 74 61 69  der to be certai
12a00 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20 74 68  n that we got th
12a10 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a  e right one..*/.
12a20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12a30 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76  MIT_AUTOVACUUM.v
12a40 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50  oid sqlite3RootP
12a50 61 67 65 4d 6f 76 65 64 28 73 71 6c 69 74 65 33  ageMoved(sqlite3
12a60 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69   *db, int iDb, i
12a70 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
12a80 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  o){.  HashElem *
12a90 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70  pElem;.  Hash *p
12aa0 48 61 73 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b  Hash;.  Db *pDb;
12ab0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
12ac0 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
12ad0 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
12ae0 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  ;.  pDb = &db->a
12af0 44 62 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73 68  Db[iDb];.  pHash
12b00 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61   = &pDb->pSchema
12b10 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72  ->tblHash;.  for
12b20 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73  (pElem=sqliteHas
12b30 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70  hFirst(pHash); p
12b40 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69  Elem; pElem=sqli
12b50 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d  teHashNext(pElem
12b60 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
12b70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
12b80 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20  Data(pElem);.   
12b90 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d   if( pTab->tnum=
12ba0 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
12bb0 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f  pTab->tnum = iTo
12bc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48  ;.    }.  }.  pH
12bd0 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68  ash = &pDb->pSch
12be0 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20  ema->idxHash;.  
12bf0 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65  for(pElem=sqlite
12c00 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29  HashFirst(pHash)
12c10 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73  ; pElem; pElem=s
12c20 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45  qliteHashNext(pE
12c30 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78  lem)){.    Index
12c40 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48   *pIdx = sqliteH
12c50 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a  ashData(pElem);.
12c60 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e      if( pIdx->tn
12c70 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  um==iFrom ){.   
12c80 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20     pIdx->tnum = 
12c90 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  iTo;.    }.  }.}
12ca0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
12cb0 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61  rite code to era
12cc0 73 65 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  se the table wit
12cd0 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
12ce0 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  le from database
12cf0 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72   iDb..** Also wr
12d00 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69  ite code to modi
12d10 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  fy the sqlite_ma
12d20 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69  ster table and i
12d30 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a  nternal schema.*
12d40 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65  * if a root-page
12d50 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   of another tabl
12d60 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
12d70 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68  e btree-layer wh
12d80 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20  ilst.** erasing 
12d90 69 54 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e  iTable (this can
12da0 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
12db0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
12dc0 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69  base)..*/ .stati
12dd0 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f  c void destroyRo
12de0 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a 70 50  otPage(Parse *pP
12df0 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65  arse, int iTable
12e00 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
12e10 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
12e20 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
12e30 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
12e40 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
12e50 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  rse);.  sqlite3V
12e60 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
12e70 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c  Destroy, iTable,
12e80 20 72 31 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c   r1, iDb);.  sql
12e90 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61  ite3MayAbort(pPa
12ea0 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  rse);.#ifndef SQ
12eb0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
12ec0 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73  CUUM.  /* OP_Des
12ed0 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69  troy stores an i
12ee0 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66  n integer r1. If
12ef0 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20   this integer.  
12f00 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ** is non-zero, 
12f10 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
12f20 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
12f30 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64  of a table moved
12f40 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f   to.  ** locatio
12f50 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f  n iTable. The fo
12f60 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64  llowing code mod
12f70 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65  ifies the sqlite
12f80 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
12f90 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  .  ** reflect th
12fa0 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  is..  **.  ** Th
12fb0 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20  e "#NNN" in the 
12fc0 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c  SQL is a special
12fd0 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d   constant that m
12fe0 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61  eans whatever va
12ff0 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72  lue.  ** is in r
13000 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65  egister NNN.  Se
13010 65 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 20  e grammar rules 
13020 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
13030 74 68 65 20 54 4b 5f 52 45 47 49 53 54 45 52 0a  the TK_REGISTER.
13040 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61    ** token for a
13050 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
13060 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71  ation..  */.  sq
13070 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
13080 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 22  (pParse, .     "
13090 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54  UPDATE %Q.%s SET
130a0 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48 45   rootpage=%d WHE
130b0 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74 70  RE #%d AND rootp
130c0 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20 70  age=#%d",.     p
130d0 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69  Parse->db->aDb[i
130e0 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
130f0 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69 54  A_TABLE(iDb), iT
13100 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23  able, r1, r1);.#
13110 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 52  endif.  sqlite3R
13120 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
13130 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
13140 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 63  .** Write VDBE c
13150 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 62  ode to erase tab
13160 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20  le pTab and all 
13170 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 63  associated indic
13180 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43  es on disk..** C
13190 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 68  ode to update th
131a0 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
131b0 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 72  tables and inter
131c0 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 6e  nal schema defin
131d0 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73  itions.** in cas
131e0 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 65  e a root-page be
131f0 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68  longing to anoth
13200 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
13210 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 6c  d by the btree l
13220 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20  ayer.** is also 
13230 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e 20  added (this can 
13240 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61  happen with an a
13250 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
13260 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
13270 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 6c  void destroyTabl
13280 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
13290 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23   Table *pTab){.#
132a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
132b0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 49  T_AUTOVACUUM.  I
132c0 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e  ndex *pIdx;.  in
132d0 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
132e0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
132f0 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
13300 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74 72  Schema);.  destr
13310 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
13320 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69  e, pTab->tnum, i
13330 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  Db);.  for(pIdx=
13340 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
13350 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
13360 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74 72  Next){.    destr
13370 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73  oyRootPage(pPars
13380 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69  e, pIdx->tnum, i
13390 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  Db);.  }.#else. 
133a0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
133b0 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f 2d  ase may be auto-
133c0 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 28  vacuum capable (
133d0 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  if SQLITE_OMIT_A
133e0 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69  UTOVACUUM.  ** i
133f0 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c 20  s not defined), 
13400 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f 72  then it is impor
13410 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f  tant to call OP_
13420 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20  Destroy on the. 
13430 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 6e   ** table and in
13440 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 69  dex root-pages i
13450 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 6e  n order, startin
13460 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 72  g with the numer
13470 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72  ically .  ** lar
13480 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e  gest root-page n
13490 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 72  umber. This guar
134a0 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e 65  antees that none
134b0 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   of the root-pag
134c0 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 65  es.  ** to be de
134d0 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f 63  stroyed is reloc
134e0 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ated by an earli
134f0 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69  er OP_Destroy. i
13500 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  .e. if the.  ** 
13510 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 63  following were c
13520 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oded:.  **.  ** 
13530 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a 20  OP_Destroy 4 0. 
13540 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f   ** ....  ** OP_
13550 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a  Destroy 5 0.  **
13560 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70  .  ** and root p
13570 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 74  age 5 happened t
13580 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 74  o be the largest
13590 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
135a0 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  r in the.  ** da
135b0 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f  tabase, then roo
135c0 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 62  t page 5 would b
135d0 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 20  e moved to page 
135e0 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 22  4 by the .  ** "
135f0 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 20  OP_Destroy 4 0" 
13600 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 73  opcode. The subs
13610 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 72  equent "OP_Destr
13620 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 69  oy 5 0" would hi
13630 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69  t.  ** a free-li
13640 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  st page..  */.  
13650 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 2d  int iTab = pTab-
13660 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65  >tnum;.  int iDe
13670 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20  stroyed = 0;..  
13680 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
13690 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
136a0 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d 20   int iLargest = 
136b0 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 73  0;..    if( iDes
136c0 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61  troyed==0 || iTa
136d0 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b 0a  b<iDestroyed ){.
136e0 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d        iLargest =
136f0 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20   iTab;.    }.   
13700 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
13710 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
13720 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
13730 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 20  .      int iIdx 
13740 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20  = pIdx->tnum;.  
13750 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
13760 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
13770 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  >pSchema );.    
13780 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 65    if( (iDestroye
13790 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 44  d==0 || (iIdx<iD
137a0 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 49  estroyed)) && iI
137b0 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a 20  dx>iLargest ){. 
137c0 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20         iLargest 
137d0 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a  = iIdx;.      }.
137e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4c      }.    if( iL
137f0 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20  argest==0 ){.   
13800 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
13810 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
13820 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
13830 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
13840 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
13850 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73 73  hema);.      ass
13860 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
13870 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e  Db<pParse->db->n
13880 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73 74  Db );.      dest
13890 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
138a0 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 44  se, iLargest, iD
138b0 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74 72  b);.      iDestr
138c0 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 3b  oyed = iLargest;
138d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
138e0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  f.}../*.** Remov
138f0 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 74  e entries from t
13900 68 65 20 73 71 6c 69 74 65 5f 73 74 61 74 4e 20  he sqlite_statN 
13910 74 61 62 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e  tables (for N in
13920 20 28 31 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74   (1,2,3)).** aft
13930 65 72 20 61 20 44 52 4f 50 20 49 4e 44 45 58 20  er a DROP INDEX 
13940 6f 72 20 44 52 4f 50 20 54 41 42 4c 45 20 63 6f  or DROP TABLE co
13950 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  mmand..*/.static
13960 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c 65   void sqlite3Cle
13970 61 72 53 74 61 74 54 61 62 6c 65 73 28 0a 20 20  arStatTables(.  
13980 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
13990 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
139a0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
139b0 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20 20  .  int iDb,     
139c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
139d0 20 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   database number
139e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
139f0 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20   *zType,     /* 
13a00 22 69 64 78 22 20 6f 72 20 22 74 62 6c 22 20 2a  "idx" or "tbl" *
13a10 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
13a20 7a 4e 61 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61  zName      /* Na
13a30 6d 65 20 6f 66 20 69 6e 64 65 78 20 6f 72 20 74  me of index or t
13a40 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
13a50 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
13a60 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 70 50 61 72   *zDbName = pPar
13a70 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
13a80 2e 7a 4e 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d  .zName;.  for(i=
13a90 31 3b 20 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20  1; i<=4; i++){. 
13aa0 20 20 20 63 68 61 72 20 7a 54 61 62 5b 32 34 5d     char zTab[24]
13ab0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
13ac0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54  printf(sizeof(zT
13ad0 61 62 29 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65  ab),zTab,"sqlite
13ae0 5f 73 74 61 74 25 64 22 2c 69 29 3b 0a 20 20 20  _stat%d",i);.   
13af0 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
13b00 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
13b10 2c 20 7a 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29  , zTab, zDbName)
13b20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
13b30 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
13b40 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45  rse,.        "DE
13b50 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
13b60 57 48 45 52 45 20 25 73 3d 25 51 22 2c 0a 20 20  WHERE %s=%Q",.  
13b70 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a        zDbName, z
13b80 54 61 62 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d  Tab, zType, zNam
13b90 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
13ba0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
13bb0 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64  nerate code to d
13bc0 72 6f 70 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a  rop a table..*/.
13bd0 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
13be0 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
13bf0 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a  *pParse, Table *
13c00 70 54 61 62 2c 20 69 6e 74 20 69 44 62 2c 20 69  pTab, int iDb, i
13c10 6e 74 20 69 73 56 69 65 77 29 7b 0a 20 20 56 64  nt isView){.  Vd
13c20 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
13c30 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
13c40 62 3b 0a 20 20 54 72 69 67 67 65 72 20 2a 70 54  b;.  Trigger *pT
13c50 72 69 67 67 65 72 3b 0a 20 20 44 62 20 2a 70 44  rigger;.  Db *pD
13c60 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
13c70 5d 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65  ];..  v = sqlite
13c80 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
13c90 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
13ca0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67   );.  sqlite3Beg
13cb0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
13cc0 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
13cd0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
13ce0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
13cf0 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74  BLE.  if( IsVirt
13d00 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20  ual(pTab) ){.   
13d10 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13d20 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29  p0(v, OP_VBegin)
13d30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
13d40 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69 67  /* Drop all trig
13d50 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  gers associated 
13d60 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62  with the table b
13d70 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43 6f  eing dropped. Co
13d80 64 65 0a 20 20 2a 2a 20 69 73 20 67 65 6e 65 72  de.  ** is gener
13d90 61 74 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 65  ated to remove e
13da0 6e 74 72 69 65 73 20 66 72 6f 6d 20 73 71 6c 69  ntries from sqli
13db0 74 65 5f 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72  te_master and/or
13dc0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d  .  ** sqlite_tem
13dd0 70 5f 6d 61 73 74 65 72 20 69 66 20 72 65 71 75  p_master if requ
13de0 69 72 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72  ired..  */.  pTr
13df0 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33 54  igger = sqlite3T
13e00 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72 73  riggerList(pPars
13e10 65 2c 20 70 54 61 62 29 3b 0a 20 20 77 68 69 6c  e, pTab);.  whil
13e20 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a 20  e( pTrigger ){. 
13e30 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
13e40 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  ger->pSchema==pT
13e50 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a  ab->pSchema || .
13e60 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72          pTrigger
13e70 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61  ->pSchema==db->a
13e80 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b  Db[1].pSchema );
13e90 0a 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f 70  .    sqlite3Drop
13ea0 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72 73  TriggerPtr(pPars
13eb0 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20 20  e, pTrigger);.  
13ec0 20 20 70 54 72 69 67 67 65 72 20 3d 20 70 54 72    pTrigger = pTr
13ed0 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  igger->pNext;.  
13ee0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
13ef0 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45  E_OMIT_AUTOINCRE
13f00 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65  MENT.  /* Remove
13f10 20 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20   any entries of 
13f20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65  the sqlite_seque
13f30 6e 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69  nce table associ
13f40 61 74 65 64 20 77 69 74 68 0a 20 20 2a 2a 20 74  ated with.  ** t
13f50 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
13f60 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73 20  ropped. This is 
13f70 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20  done before the 
13f80 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64  table is dropped
13f90 0a 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74 72  .  ** at the btr
13fa0 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73  ee level, in cas
13fb0 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 71  e the sqlite_seq
13fc0 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65 64  uence table need
13fd0 73 20 74 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61  s to.  ** move a
13fe0 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
13ff0 65 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70  e drop (can happ
14000 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  en in auto-vacuu
14010 6d 20 6d 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20  m mode)..  */.  
14020 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61  if( pTab->tabFla
14030 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72  gs & TF_Autoincr
14040 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  ement ){.    sql
14050 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
14060 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 44  pParse,.      "D
14070 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71  ELETE FROM %Q.sq
14080 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 57 48  lite_sequence WH
14090 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20  ERE name=%Q",.  
140a0 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20      pDb->zName, 
140b0 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pTab->zName.    
140c0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
140d0 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c   /* Drop all SQL
140e0 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
140f0 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69   and index entri
14100 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f  es that refer to
14110 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e   the.  ** table.
14120 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d   The program nam
14130 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  e loops through 
14140 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
14150 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a   and deletes.  *
14160 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74  * every row that
14170 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62   refers to a tab
14180 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  le of the same n
14190 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62  ame as the one b
141a0 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65  eing.  ** droppe
141b0 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20  d. Triggers are 
141c0 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65  handled separate
141d0 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69  ly because a tri
141e0 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a  gger can be.  **
141f0 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
14200 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68  temp database th
14210 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74  at refers to a t
14220 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a  able in another.
14230 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20    ** database.. 
14240 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73   */.  sqlite3Nes
14250 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
14260 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20   .      "DELETE 
14270 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
14280 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64   tbl_name=%Q and
14290 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27   type!='trigger'
142a0 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  ",.      pDb->zN
142b0 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
142c0 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e  E(iDb), pTab->zN
142d0 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 69 73 56  ame);.  if( !isV
142e0 69 65 77 20 26 26 20 21 49 73 56 69 72 74 75 61  iew && !IsVirtua
142f0 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 64  l(pTab) ){.    d
14300 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72  estroyTable(pPar
14310 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a  se, pTab);.  }..
14320 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
14330 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d  table entry from
14340 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72 6e   SQLite's intern
14350 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f  al schema and mo
14360 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 73 63  dify.  ** the sc
14370 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a  hema cookie..  *
14380 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  /.  if( IsVirtua
14390 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73  l(pTab) ){.    s
143a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
143b0 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c  (v, OP_VDestroy,
143c0 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62   iDb, 0, 0, pTab
143d0 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d  ->zName, 0);.  }
143e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
143f0 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54  dOp4(v, OP_DropT
14400 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c  able, iDb, 0, 0,
14410 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
14420 3b 0a 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67  ;.  sqlite3Chang
14430 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
14440 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 56 69  iDb);.  sqliteVi
14450 65 77 52 65 73 65 74 41 6c 6c 28 64 62 2c 20 69  ewResetAll(db, i
14460 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Db);.}../*.** Th
14470 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
14480 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77  lled to do the w
14490 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41  ork of a DROP TA
144a0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
144b0 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e  * pName is the n
144c0 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
144d0 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a   to be dropped..
144e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
144f0 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a  ropTable(Parse *
14500 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
14510 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69  *pName, int isVi
14520 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a  ew, int noErr){.
14530 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
14540 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
14550 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
14560 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
14570 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
14580 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
14590 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
145a0 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65  able;.  }.  asse
145b0 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  rt( pParse->nErr
145c0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
145d0 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
145e0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
145f0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
14600 65 29 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 64  e) ) goto exit_d
14610 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 69 66 28  rop_table;.  if(
14620 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70   noErr ) db->sup
14630 70 72 65 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54  pressErr++;.  pT
14640 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
14650 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72  teTableItem(pPar
14660 73 65 2c 20 69 73 56 69 65 77 2c 20 26 70 4e 61  se, isView, &pNa
14670 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28  me->a[0]);.  if(
14680 20 6e 6f 45 72 72 20 29 20 64 62 2d 3e 73 75 70   noErr ) db->sup
14690 70 72 65 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69  pressErr--;..  i
146a0 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20  f( pTab==0 ){.  
146b0 20 20 69 66 28 20 6e 6f 45 72 72 20 29 20 73 71    if( noErr ) sq
146c0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 4e  lite3CodeVerifyN
146d0 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72 73  amedSchema(pPars
146e0 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
146f0 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 67  Database);.    g
14700 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
14710 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  ble;.  }.  iDb =
14720 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
14730 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
14740 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65  pSchema);.  asse
14750 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
14760 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
14770 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20 61 20  /* If pTab is a 
14780 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63  virtual table, c
14790 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d  all ViewGetColum
147a0 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75  nNames() to ensu
147b0 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e  re.  ** it is in
147c0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
147d0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
147e0 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33  pTab) && sqlite3
147f0 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
14800 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
14810 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
14820 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
14830 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
14840 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
14850 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
14860 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  code;.    const 
14870 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
14880 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a  EMA_TABLE(iDb);.
14890 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
148a0 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
148b0 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  b].zName;.    co
148c0 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20  nst char *zArg2 
148d0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
148e0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
148f0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
14900 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
14910 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  b)){.      goto 
14920 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
14930 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
14940 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
14950 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
14960 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
14970 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
14980 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
14990 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
149a0 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
149b0 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b  QLITE_DROP_VIEW;
149c0 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
149d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
149e0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65  TUALTABLE.    }e
149f0 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
14a00 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
14a10 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
14a20 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20  ROP_VTABLE;.    
14a30 20 20 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65    zArg2 = sqlite
14a40 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70  3GetVTable(db, p
14a50 54 61 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d  Tab)->pMod->zNam
14a60 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  e;.#endif.    }e
14a70 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21  lse{.      if( !
14a80 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
14a90 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
14aa0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
14ab0 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a  ROP_TEMP_TABLE;.
14ac0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14ad0 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
14ae0 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20  TE_DROP_TABLE;. 
14af0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
14b00 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
14b10 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f  Check(pParse, co
14b20 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  de, pTab->zName,
14b30 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a   zArg2, zDb) ){.
14b40 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
14b50 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
14b60 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
14b70 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
14b80 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
14b90 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
14ba0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
14bb0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
14bc0 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  able;.    }.  }.
14bd0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c  #endif.  if( sql
14be0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
14bf0 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
14c00 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20  e_", 7)==0 .    
14c10 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  && sqlite3StrNIC
14c20 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  mp(pTab->zName, 
14c30 22 73 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31  "sqlite_stat", 1
14c40 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  1)!=0 ){.    sql
14c50 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14c60 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
14c70 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65  ay not be droppe
14c80 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
14c90 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
14ca0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
14cb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14cc0 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45  OMIT_VIEW.  /* E
14cd0 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45  nsure DROP TABLE
14ce0 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20   is not used on 
14cf0 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50  a view, and DROP
14d00 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65   VIEW is not use
14d10 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c  d.  ** on a tabl
14d20 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  e..  */.  if( is
14d30 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53  View && pTab->pS
14d40 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elect==0 ){.    
14d50 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14d60 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f  pParse, "use DRO
14d70 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74  P TABLE to delet
14d80 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61  e table %s", pTa
14d90 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
14da0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
14db0 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ble;.  }.  if( !
14dc0 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
14dd0 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
14de0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
14df0 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
14e00 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20   VIEW to delete 
14e10 76 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e  view %s", pTab->
14e20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
14e30 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14e40 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
14e50 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
14e60 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
14e70 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61  able from the ma
14e80 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20  ster table.  ** 
14e90 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
14ea0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
14eb0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
14ec0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
14ed0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
14ee0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
14ef0 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
14f00 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
14f10 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  s(pParse, iDb, "
14f20 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  tbl", pTab->zNam
14f30 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  e);.    sqlite3F
14f40 6b 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73  kDropTable(pPars
14f50 65 2c 20 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b  e, pName, pTab);
14f60 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
14f70 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65  DropTable(pParse
14f80 2c 20 70 54 61 62 2c 20 69 44 62 2c 20 69 73 56  , pTab, iDb, isV
14f90 69 65 77 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  iew);.  }..exit_
14fa0 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71  drop_table:.  sq
14fb0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
14fc0 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d  te(db, pName);.}
14fd0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
14fe0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
14ff0 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66  o create a new f
15000 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68  oreign key on th
15010 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65  e table.** curre
15020 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
15030 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43  ruction.  pFromC
15040 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ol determines wh
15050 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69  ich columns.** i
15060 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
15070 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ble point to the
15080 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49   foreign key.  I
15090 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68  f pFromCol==0 th
150a0 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68  en.** connect th
150b0 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73  e key to the las
150c0 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65  t column inserte
150d0 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e  d.  pTo is the n
150e0 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61  ame of.** the ta
150f0 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 20  ble referred to 
15100 28 61 2e 6b 2e 61 20 74 68 65 20 22 70 61 72 65  (a.k.a the "pare
15110 6e 74 22 20 74 61 62 6c 65 29 2e 20 20 70 54 6f  nt" table).  pTo
15120 43 6f 6c 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a  Col is a list.**
15130 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
15140 65 20 70 61 72 65 6e 74 20 70 54 6f 20 74 61 62  e parent pTo tab
15150 6c 65 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74 61  le.  flags conta
15160 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72  ins all.** infor
15170 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
15180 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   conflict resolu
15190 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20  tion algorithms 
151a0 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20  specified.** in 
151b0 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f  the ON DELETE, O
151c0 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e 20  N UPDATE and ON 
151d0 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e 0a  INSERT clauses..
151e0 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74  **.** An FKey st
151f0 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
15200 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ed and added to 
15210 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e  the table curren
15220 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e  tly.** under con
15230 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  struction in the
15240 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
15250 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  le field..**.** 
15260 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  The foreign key 
15270 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44  is set for IMMED
15280 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e  IATE processing.
15290 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63    A subsequent c
152a0 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  all.** to sqlite
152b0 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
152c0 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  () might change 
152d0 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44  this to DEFERRED
152e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
152f0 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  3CreateForeignKe
15300 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
15310 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
15320 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
15330 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f    ExprList *pFro
15340 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e  mCol,  /* Column
15350 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20  s in this table 
15360 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74  that point to ot
15370 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54  her table */.  T
15380 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20  oken *pTo,      
15390 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
153a0 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
153b0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54  /.  ExprList *pT
153c0 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75  oCol,    /* Colu
153d0 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  mns in the other
153e0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
153f0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
15400 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
15410 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
15420 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ms. */.){.  sqli
15430 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
15440 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51  ->db;.#ifndef SQ
15450 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
15460 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70 46  N_KEY.  FKey *pF
15470 4b 65 79 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20  Key = 0;.  FKey 
15480 2a 70 4e 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c  *pNextTo;.  Tabl
15490 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *p = pParse->p
154a0 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20  NewTable;.  int 
154b0 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  nByte;.  int i;.
154c0 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68    int nCol;.  ch
154d0 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74  ar *z;..  assert
154e0 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66  ( pTo!=0 );.  if
154f0 28 20 70 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43  ( p==0 || IN_DEC
15500 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f  LARE_VTAB ) goto
15510 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70   fk_end;.  if( p
15520 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
15530 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
15540 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  nCol-1;.    if( 
15550 4e 45 56 45 52 28 69 43 6f 6c 3c 30 29 20 29 20  NEVER(iCol<0) ) 
15560 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20  goto fk_end;.   
15570 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70   if( pToCol && p
15580 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20  ToCol->nExpr!=1 
15590 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
155a0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
155b0 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e   "foreign key on
155c0 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22 20   %s".         " 
155d0 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65  should reference
155e0 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e   only one column
155f0 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20   of table %T",. 
15600 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b          p->aCol[
15610 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f  iCol].zName, pTo
15620 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b  );.      goto fk
15630 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _end;.    }.    
15640 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  nCol = 1;.  }els
15650 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20  e if( pToCol && 
15660 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70  pToCol->nExpr!=p
15670 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29  FromCol->nExpr )
15680 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
15690 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
156a0 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66        "number of
156b0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65   columns in fore
156c0 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ign key does not
156d0 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65   match the numbe
156e0 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22  r of ".        "
156f0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
15700 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22  eferenced table"
15710 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  );.    goto fk_e
15720 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  nd;.  }else{.   
15730 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c   nCol = pFromCol
15740 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e  ->nExpr;.  }.  n
15750 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
15760 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29  FKey) + (nCol-1)
15770 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61  *sizeof(pFKey->a
15780 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e  Col[0]) + pTo->n
15790 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f 43   + 1;.  if( pToC
157a0 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
157b0 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78  0; i<pToCol->nEx
157c0 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
157d0 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65 33  nByte += sqlite3
157e0 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d  Strlen30(pToCol-
157f0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31  >a[i].zName) + 1
15800 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46  ;.    }.  }.  pF
15810 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Key = sqlite3DbM
15820 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
15830 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46 4b  yte );.  if( pFK
15840 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  ey==0 ){.    got
15850 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  o fk_end;.  }.  
15860 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70  pFKey->pFrom = p
15870 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74  ;.  pFKey->pNext
15880 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b  From = p->pFKey;
15890 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26 70  .  z = (char*)&p
158a0 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d  FKey->aCol[nCol]
158b0 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d  ;.  pFKey->zTo =
158c0 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20   z;.  memcpy(z, 
158d0 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b  pTo->z, pTo->n);
158e0 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30  .  z[pTo->n] = 0
158f0 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f  ;.  sqlite3Dequo
15900 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54  te(z);.  z += pT
15910 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d  o->n+1;.  pFKey-
15920 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20  >nCol = nCol;.  
15930 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
15940 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  ){.    pFKey->aC
15950 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d  ol[0].iFrom = p-
15960 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65  >nCol-1;.  }else
15970 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
15980 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
15990 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
159a0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43  for(j=0; j<p->nC
159b0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
159c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
159d0 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e  ICmp(p->aCol[j].
159e0 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d  zName, pFromCol-
159f0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  >a[i].zName)==0 
15a00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46 4b  ){.          pFK
15a10 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f  ey->aCol[i].iFro
15a20 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  m = j;.         
15a30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
15a40 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
15a50 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29  if( j>=p->nCol )
15a60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
15a70 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15a80 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e  , .          "un
15a90 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25  known column \"%
15aa0 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b  s\" in foreign k
15ab0 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20  ey definition", 
15ac0 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f 6d  .          pFrom
15ad0 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
15ae0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
15af0 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20  k_end;.      }. 
15b00 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
15b10 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72  ToCol ){.    for
15b20 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
15b30 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  +){.      int n 
15b40 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
15b50 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  0(pToCol->a[i].z
15b60 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b  Name);.      pFK
15b70 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c  ey->aCol[i].zCol
15b80 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63   = z;.      memc
15b90 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b  py(z, pToCol->a[
15ba0 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20  i].zName, n);.  
15bb0 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20      z[n] = 0;.  
15bc0 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20      z += n+1;.  
15bd0 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d    }.  }.  pFKey-
15be0 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b  >isDeferred = 0;
15bf0 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f  .  pFKey->aActio
15c00 6e 5b 30 5d 20 3d 20 28 75 38 29 28 66 6c 61 67  n[0] = (u8)(flag
15c10 73 20 26 20 30 78 66 66 29 3b 20 20 20 20 20 20  s & 0xff);      
15c20 20 20 20 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45        /* ON DELE
15c30 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70  TE action */.  p
15c40 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d  FKey->aAction[1]
15c50 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20 3e   = (u8)((flags >
15c60 3e 20 38 20 29 20 26 20 30 78 66 66 29 3b 20 20  > 8 ) & 0xff);  
15c70 20 20 2f 2a 20 4f 4e 20 55 50 44 41 54 45 20 61    /* ON UPDATE a
15c80 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65  ction */..  asse
15c90 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
15ca0 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30  aMutexHeld(db, 0
15cb0 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b  , p->pSchema) );
15cc0 0a 20 20 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b  .  pNextTo = (FK
15cd0 65 79 20 2a 29 73 71 6c 69 74 65 33 48 61 73 68  ey *)sqlite3Hash
15ce0 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65  Insert(&p->pSche
15cf0 6d 61 2d 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20  ma->fkeyHash, . 
15d00 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c       pFKey->zTo,
15d10 20 28 76 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20   (void *)pFKey. 
15d20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 78 74 54   );.  if( pNextT
15d30 6f 3d 3d 70 46 4b 65 79 20 29 7b 0a 20 20 20 20  o==pFKey ){.    
15d40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
15d50 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 66   = 1;.    goto f
15d60 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28  k_end;.  }.  if(
15d70 20 70 4e 65 78 74 54 6f 20 29 7b 0a 20 20 20 20   pNextTo ){.    
15d80 61 73 73 65 72 74 28 20 70 4e 65 78 74 54 6f 2d  assert( pNextTo-
15d90 3e 70 50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20  >pPrevTo==0 );. 
15da0 20 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54     pFKey->pNextT
15db0 6f 20 3d 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20  o = pNextTo;.   
15dc0 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76 54   pNextTo->pPrevT
15dd0 6f 20 3d 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a  o = pFKey;.  }..
15de0 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f    /* Link the fo
15df0 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74 68 65  reign key to the
15e00 20 74 61 62 6c 65 20 61 73 20 74 68 65 20 6c 61   table as the la
15e10 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20  st step..  */.  
15e20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b 65 79  p->pFKey = pFKey
15e30 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a  ;.  pFKey = 0;..
15e40 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  fk_end:.  sqlite
15e50 33 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65  3DbFree(db, pFKe
15e60 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  y);.#endif /* !d
15e70 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15e80 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20  IT_FOREIGN_KEY) 
15e90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
15ea0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
15eb0 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  FromCol);.  sqli
15ec0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
15ed0 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d  e(db, pToCol);.}
15ee0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15ef0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
15f00 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59  hen an INITIALLY
15f10 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e   IMMEDIATE or IN
15f20 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
15f30 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65  .** clause is se
15f40 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  en as part of a 
15f50 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
15f60 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44  nition.  The isD
15f70 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d  eferred.** param
15f80 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e  eter is 1 for IN
15f90 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
15fa0 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49   and 0 for INITI
15fb0 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a  ALLY IMMEDIATE..
15fc0 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20  ** The behavior 
15fd0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
15fe0 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72  ntly created for
15ff0 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75  eign key is adju
16000 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  sted.** accordin
16010 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gly..*/.void sql
16020 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
16030 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  Key(Parse *pPars
16040 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65  e, int isDeferre
16050 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  d){.#ifndef SQLI
16060 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
16070 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  KEY.  Table *pTa
16080 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  b;.  FKey *pFKey
16090 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20  ;.  if( (pTab = 
160a0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
160b0 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20  e)==0 || (pFKey 
160c0 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d  = pTab->pFKey)==
160d0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
160e0 73 65 72 74 28 20 69 73 44 65 66 65 72 72 65 64  sert( isDeferred
160f0 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72 72 65  ==0 || isDeferre
16100 64 3d 3d 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52  d==1 ); /* EV: R
16110 2d 33 30 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a  -30323-21917 */.
16120 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72    pFKey->isDefer
16130 72 65 64 20 3d 20 28 75 38 29 69 73 44 65 66 65  red = (u8)isDefe
16140 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rred;.#endif.}..
16150 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
16160 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 72  ode that will er
16170 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c 20 69  ase and refill i
16180 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54 68 69  ndex *pIdx.  Thi
16190 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  s is.** used to 
161a0 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65 77  initialize a new
161b0 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 65 78  ly created index
161c0 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75 74 65   or to recompute
161d0 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
161e0 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e 20 72  of an index in r
161f0 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52 45 49  esponse to a REI
16200 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
16210 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61  .** if memRootPa
16220 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61 74 69  ge is not negati
16230 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ve, it means tha
16240 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6e  t the index is n
16250 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e  ewly.** created.
16260 20 20 54 68 65 20 72 65 67 69 73 74 65 72 20 73    The register s
16270 70 65 63 69 66 69 65 64 20 62 79 20 6d 65 6d 52  pecified by memR
16280 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  ootPage contains
16290 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
162a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
162b0 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f  index.  If memRo
162c0 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  otPage is negati
162d0 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ve, then.** the 
162e0 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
162f0 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20 62 65  ists and must be
16300 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
16310 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64 20 61  being refilled a
16320 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  nd.** the root p
16330 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
16340 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b 65 6e  e index is taken
16350 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e   from pIndex->tn
16360 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  um..*/.static vo
16370 69 64 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c  id sqlite3Refill
16380 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
16390 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64  rse, Index *pInd
163a0 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50  ex, int memRootP
163b0 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  age){.  Table *p
163c0 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54  Tab = pIndex->pT
163d0 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20 74 61  able;  /* The ta
163e0 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e 64 65  ble that is inde
163f0 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  xed */.  int iTa
16400 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  b = pParse->nTab
16410 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65  ++;     /* Btree
16420 20 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72   cursor used for
16430 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
16440 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Idx = pParse->nT
16450 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
16460 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
16470 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69  or pIndex */.  i
16480 6e 74 20 69 53 6f 72 74 65 72 3b 20 20 20 20 20  nt iSorter;     
16490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
164a0 20 43 75 72 73 6f 72 20 6f 70 65 6e 65 64 20 62   Cursor opened b
164b0 79 20 4f 70 65 6e 53 6f 72 74 65 72 20 28 69 66  y OpenSorter (if
164c0 20 69 6e 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e   in use) */.  in
164d0 74 20 61 64 64 72 31 3b 20 20 20 20 20 20 20 20  t addr1;        
164e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
164f0 41 64 64 72 65 73 73 20 6f 66 20 74 6f 70 20 6f  Address of top o
16500 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  f loop */.  int 
16510 61 64 64 72 32 3b 20 20 20 20 20 20 20 20 20 20  addr2;          
16520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
16530 64 72 65 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f  dress to jump to
16540 20 66 6f 72 20 6e 65 78 74 20 69 74 65 72 61 74   for next iterat
16550 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75  ion */.  int tnu
16560 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
16570 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
16580 70 61 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  page of index */
16590 0a 20 20 69 6e 74 20 69 50 61 72 74 49 64 78 4c  .  int iPartIdxL
165a0 61 62 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  abel;           
165b0 20 20 2f 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69    /* Jump to thi
165c0 73 20 6c 61 62 65 6c 20 74 6f 20 73 6b 69 70 20  s label to skip 
165d0 61 20 72 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20  a row */.  Vdbe 
165e0 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
165f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
16600 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
16610 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
16620 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  hine */.  KeyInf
16630 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20  o *pKey;        
16640 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49           /* KeyI
16650 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f  nfo for index */
16660 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
16670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16680 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
16690 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 65 64 20  lding assembled 
166a0 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a  index record */.
166b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
166c0 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
166d0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
166e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
166f0 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
16700 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
16710 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68  db, pIndex->pSch
16720 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ema);..#ifndef S
16730 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
16740 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73  RIZATION.  if( s
16750 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
16760 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52  pParse, SQLITE_R
16770 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e  EINDEX, pIndex->
16780 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20  zName, 0,.      
16790 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
167a0 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75  me ) ){.    retu
167b0 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  rn;.  }.#endif..
167c0 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77    /* Require a w
167d0 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
167e0 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72   table to perfor
167f0 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  m this operation
16800 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62   */.  sqlite3Tab
16810 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
16820 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
16830 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  1, pTab->zName);
16840 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ..  v = sqlite3G
16850 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
16860 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
16870 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  urn;.  if( memRo
16880 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  otPage>=0 ){.   
16890 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50   tnum = memRootP
168a0 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
168b0 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d    tnum = pIndex-
168c0 3e 74 6e 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65  >tnum;.  }.  pKe
168d0 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  y = sqlite3KeyIn
168e0 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
168f0 2c 20 70 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a  , pIndex);..  /*
16900 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 65 72   Open the sorter
16910 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 61 72   cursor if we ar
16920 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f  e to use one. */
16930 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 50 61  .  iSorter = pPa
16940 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
16950 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
16960 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65  (v, OP_SorterOpe
16970 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c 20 70  n, iSorter, 0, p
16980 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20  Index->nKeyCol, 
16990 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20 20 20  (char*).        
169a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
169b0 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b  te3KeyInfoRef(pK
169c0 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29  ey), P4_KEYINFO)
169d0 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  ;..  /* Open the
169e0 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72   table. Loop thr
169f0 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66  ough all rows of
16a00 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e 73 65   the table, inse
16a10 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a  rting index.  **
16a20 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 74 68   records into th
16a30 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73  e sorter. */.  s
16a40 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
16a50 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44  pParse, iTab, iD
16a60 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
16a70 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d  Read);.  addr1 =
16a80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16a90 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p2(v, OP_Rewind,
16aa0 20 69 54 61 62 2c 20 30 29 3b 20 56 64 62 65 43   iTab, 0); VdbeC
16ab0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 72 65  overage(v);.  re
16ac0 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65  gRecord = sqlite
16ad0 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
16ae0 73 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47  se);..  sqlite3G
16af0 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
16b00 70 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54  pParse,pIndex,iT
16b10 61 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26  ab,regRecord,0,&
16b20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c  iPartIdxLabel,0,
16b30 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  0);.  sqlite3Vdb
16b40 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f  eAddOp2(v, OP_So
16b50 72 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72  rterInsert, iSor
16b60 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  ter, regRecord);
16b70 0a 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  .  sqlite3Resolv
16b80 65 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50  ePartIdxLabel(pP
16b90 61 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61  arse, iPartIdxLa
16ba0 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  bel);.  sqlite3V
16bb0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16bc0 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72  Next, iTab, addr
16bd0 31 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61  1+1); VdbeCovera
16be0 67 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33  ge(v);.  sqlite3
16bf0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
16c00 61 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65  addr1);.  if( me
16c10 6d 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71  mRootPage<0 ) sq
16c20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16c30 76 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75  v, OP_Clear, tnu
16c40 6d 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74  m, iDb);.  sqlit
16c50 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
16c60 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49  OP_OpenWrite, iI
16c70 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a  dx, tnum, iDb, .
16c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c90 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79      (char *)pKey
16ca0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P4_KEYINFO);. 
16cb0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16cc0 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42  geP5(v, OPFLAG_B
16cd0 55 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74  ULKCSR|((memRoot
16ce0 50 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f  Page>=0)?OPFLAG_
16cf0 50 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20  P2ISREG:0));..  
16d00 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56  addr1 = sqlite3V
16d10 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16d20 53 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72  SorterSort, iSor
16d30 74 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76  ter, 0); VdbeCov
16d40 65 72 61 67 65 28 76 29 3b 0a 20 20 61 73 73 65  erage(v);.  asse
16d50 72 74 28 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64  rt( pKey!=0 || d
16d60 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
16d70 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
16d80 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75  );.  if( IsUniqu
16d90 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20 26  eIndex(pIndex) &
16da0 26 20 70 4b 65 79 21 3d 30 20 29 7b 0a 20 20 20  & pKey!=0 ){.   
16db0 20 69 6e 74 20 6a 32 20 3d 20 73 71 6c 69 74 65   int j2 = sqlite
16dc0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
16dd0 28 76 29 20 2b 20 33 3b 0a 20 20 20 20 73 71 6c  (v) + 3;.    sql
16de0 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
16df0 6a 32 29 3b 0a 20 20 20 20 61 64 64 72 32 20 3d  j2);.    addr2 =
16e00 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
16e10 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
16e20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16e30 34 49 6e 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65  4Int(v, OP_Sorte
16e40 72 43 6f 6d 70 61 72 65 2c 20 69 53 6f 72 74 65  rCompare, iSorte
16e50 72 2c 20 6a 32 2c 20 72 65 67 52 65 63 6f 72 64  r, j2, regRecord
16e60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16e70 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
16e80 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62  x->nKeyCol); Vdb
16e90 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
16ea0 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 43    sqlite3UniqueC
16eb0 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
16ec0 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64  , OE_Abort, pInd
16ed0 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ex);.  }else{.  
16ee0 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65    addr2 = sqlite
16ef0 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
16f00 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
16f10 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16f20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c 20 69  OP_SorterData, i
16f30 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63 6f 72  Sorter, regRecor
16f40 64 2c 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69  d, iIdx);.  sqli
16f50 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16f60 20 4f 50 5f 4c 61 73 74 2c 20 69 49 64 78 2c 20   OP_Last, iIdx, 
16f70 30 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65  0, -1);.  sqlite
16f80 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16f90 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64  P_IdxInsert, iId
16fa0 78 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30 29  x, regRecord, 0)
16fb0 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
16fc0 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
16fd0 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
16fe0 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
16ff0 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
17000 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
17010 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17020 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65  2(v, OP_SorterNe
17030 78 74 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64  xt, iSorter, add
17040 72 32 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  r2); VdbeCoverag
17050 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  e(v);.  sqlite3V
17060 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
17070 64 64 72 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65  ddr1);..  sqlite
17080 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
17090 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a  P_Close, iTab);.
170a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
170b0 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  Op1(v, OP_Close,
170c0 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65   iIdx);.  sqlite
170d0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
170e0 50 5f 43 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72  P_Close, iSorter
170f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  );.}../*.** Allo
17100 63 61 74 65 20 68 65 61 70 20 73 70 61 63 65 20  cate heap space 
17110 74 6f 20 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78  to hold an Index
17120 20 6f 62 6a 65 63 74 20 77 69 74 68 20 6e 43 6f   object with nCo
17130 6c 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a  l columns..**.**
17140 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 61 6c   Increase the al
17150 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f  location size to
17160 20 70 72 6f 76 69 64 65 20 61 6e 20 65 78 74 72   provide an extr
17170 61 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a  a nExtra bytes.*
17180 2a 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67  * of 8-byte alig
17190 6e 65 64 20 73 70 61 63 65 20 61 66 74 65 72 20  ned space after 
171a0 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
171b0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a   and return a.**
171c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
171d0 20 65 78 74 72 61 20 73 70 61 63 65 20 69 6e 20   extra space in 
171e0 2a 70 70 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64  *ppExtra..*/.Ind
171f0 65 78 20 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63  ex *sqlite3Alloc
17200 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a  ateIndexObject(.
17210 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
17220 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
17230 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
17240 0a 20 20 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20  .  i16 nCol,    
17250 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
17260 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
17270 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
17280 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
17290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
172a0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
172b0 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 61  extra space to a
172c0 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lloc */.  char *
172d0 2a 70 70 45 78 74 72 61 20 20 20 20 20 20 20 2f  *ppExtra       /
172e0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
172f0 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20 2a   "extra" space *
17300 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b  /.){.  Index *p;
17310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
17320 6c 6c 6f 63 61 74 65 64 20 69 6e 64 65 78 20 6f  llocated index o
17330 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  bject */.  int n
17340 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
17350 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70 61 63  /* Bytes of spac
17360 65 20 66 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65  e for Index obje
17370 63 74 20 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a  ct + arrays */..
17380 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
17390 28 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 20  (sizeof(Index)) 
173a0 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  +              /
173b0 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
173c0 65 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e  */.          
173d0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68  ROUND8(sizeof(ch
173e0 61 72 2a 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20  ar*)*nCol) +    
173f0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a       /* Index.az
17400 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20  Coll     */.    
17410 20 20 20 20 20 20 52 4f 55 4e 44 38 28 73 69 7a        ROUND8(siz
17420 65 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f  eof(LogEst)*(nCo
17430 6c 2b 31 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e  l+1) +     /* In
17440 64 65 78 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20  dex.aiRowLogEst 
17450 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
17460 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 31 36        sizeof(i16
17470 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20  )*nCol +        
17480 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43      /* Index.aiC
17490 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20  olumn   */.     
174a0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
174b0 6f 66 28 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20  of(u8)*nCol);   
174c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
174d0 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f  ex.aSortOrder */
174e0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62  .  p = sqlite3Db
174f0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
17500 42 79 74 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a  Byte + nExtra);.
17510 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 63    if( p ){.    c
17520 68 61 72 20 2a 70 45 78 74 72 61 20 3d 20 28 28  har *pExtra = ((
17530 63 68 61 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28  char*)p)+ROUND8(
17540 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a  sizeof(Index));.
17550 20 20 20 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20      p->azColl = 
17560 28 63 68 61 72 2a 2a 29 70 45 78 74 72 61 3b 20  (char**)pExtra; 
17570 20 20 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20        pExtra += 
17580 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 63 68  ROUND8(sizeof(ch
17590 61 72 2a 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20  ar*)*nCol);.    
175a0 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d  p->aiRowLogEst =
175b0 20 28 4c 6f 67 45 73 74 2a 29 70 45 78 74 72 61   (LogEst*)pExtra
175c0 3b 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a 65  ; pExtra += size
175d0 6f 66 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c  of(LogEst)*(nCol
175e0 2b 31 29 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f  +1);.    p->aiCo
175f0 6c 75 6d 6e 20 3d 20 28 69 31 36 2a 29 70 45 78  lumn = (i16*)pEx
17600 74 72 61 3b 20 20 20 20 20 20 20 70 45 78 74 72  tra;       pExtr
17610 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36 29  a += sizeof(i16)
17620 2a 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53  *nCol;.    p->aS
17630 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29  ortOrder = (u8*)
17640 70 45 78 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e  pExtra;.    p->n
17650 43 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20  Column = nCol;. 
17660 20 20 20 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20     p->nKeyCol = 
17670 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70  nCol - 1;.    *p
17680 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a  pExtra = ((char*
17690 29 70 29 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d  )p) + nByte;.  }
176a0 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
176b0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
176c0 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
176d0 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d  SQL table.  pNam
176e0 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65  e1.pName2 is the
176f0 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
17700 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c  ex .** and pTblL
17710 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ist is the name 
17720 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
17730 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
17740 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
17750 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
17760 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
17770 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
17780 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
17790 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
177a0 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
177b0 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
177c0 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
177d0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
177e0 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
177f0 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
17800 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
17810 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
17820 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
17830 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
17840 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
17850 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
17860 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
17870 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
17880 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
17890 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
178a0 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
178b0 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
178c0 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
178d0 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
178e0 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
178f0 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
17900 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
17910 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
17920 74 69 6f 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66  tion.  .**.** If
17930 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 63 72   the index is cr
17940 65 61 74 65 64 20 73 75 63 63 65 73 73 66 75 6c  eated successful
17950 6c 79 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69  ly, return a poi
17960 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20  nter to the new 
17970 49 6e 64 65 78 0a 2a 2a 20 73 74 72 75 63 74 75  Index.** structu
17980 72 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64  re. This is used
17990 20 62 79 20 73 71 6c 69 74 65 33 41 64 64 50 72   by sqlite3AddPr
179a0 69 6d 61 72 79 4b 65 79 28 29 20 74 6f 20 6d 61  imaryKey() to ma
179b0 72 6b 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20  rk the index.** 
179c0 61 73 20 74 68 65 20 74 61 62 6c 65 73 20 70 72  as the tables pr
179d0 69 6d 61 72 79 20 6b 65 79 20 28 49 6e 64 65 78  imary key (Index
179e0 2e 69 64 78 54 79 70 65 3d 3d 53 51 4c 49 54 45  .idxType==SQLITE
179f0 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59  _IDXTYPE_PRIMARY
17a00 4b 45 59 29 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73  KEY).*/.Index *s
17a10 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
17a20 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
17a30 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69  se,     /* All i
17a40 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
17a50 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20   this parse */. 
17a60 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
17a70 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72      /* First par
17a80 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
17a90 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
17aa0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
17ab0 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70       /* Second p
17ac0 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
17ad0 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
17ae0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62  /.  SrcList *pTb
17af0 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20  lName, /* Table 
17b00 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50  to index. Use pP
17b10 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
17b20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69  if 0 */.  ExprLi
17b30 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
17b40 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  A list of column
17b50 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
17b60 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
17b70 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62  ,       /* OE_Ab
17b80 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  ort, OE_Ignore, 
17b90 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f  OE_Replace, or O
17ba0 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65  E_None */.  Toke
17bb0 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f  n *pStart,     /
17bc0 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
17bd0 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
17be0 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  his statement */
17bf0 0a 20 20 45 78 70 72 20 2a 70 50 49 57 68 65 72  .  Expr *pPIWher
17c00 65 2c 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63  e,    /* WHERE c
17c10 6c 61 75 73 65 20 66 6f 72 20 70 61 72 74 69 61  lause for partia
17c20 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69  l indices */.  i
17c30 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20  nt sortOrder,   
17c40 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20    /* Sort order 
17c50 6f 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77  of primary key w
17c60 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20  hen pList==NULL 
17c70 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78  */.  int ifNotEx
17c80 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20  ist     /* Omit 
17c90 65 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61  error if index a
17ca0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f  lready exists */
17cb0 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 52 65  .){.  Index *pRe
17cc0 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 50 6f  t = 0;     /* Po
17cd0 69 6e 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20  inter to return 
17ce0 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
17cf0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62   = 0;     /* Tab
17d00 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
17d10 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
17d20 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  dex = 0;   /* Th
17d30 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72  e index to be cr
17d40 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eated */.  char 
17d50 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  *zName = 0;     
17d60 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
17d70 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  ndex */.  int nN
17d80 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
17d90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
17da0 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20  acters in zName 
17db0 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  */.  int i, j;. 
17dc0 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 20 20   DbFixer sFix;  
17dd0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 73 73        /* For ass
17de0 69 67 6e 69 6e 67 20 64 61 74 61 62 61 73 65 20  igning database 
17df0 6e 61 6d 65 73 20 74 6f 20 70 54 61 62 6c 65 20  names to pTable 
17e00 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
17e10 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74  erMask;   /* 1 t
17e20 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20  o honor DESC in 
17e30 69 6e 64 65 78 2e 20 20 30 20 74 6f 20 69 67 6e  index.  0 to ign
17e40 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ore. */.  sqlite
17e50 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
17e60 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  db;.  Db *pDb;  
17e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17e80 65 20 73 70 65 63 69 66 69 63 20 74 61 62 6c 65  e specific table
17e90 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
17ea0 69 6e 64 65 78 65 64 20 64 61 74 61 62 61 73 65  indexed database
17eb0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
17ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
17ed0 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62  dex of the datab
17ee0 61 73 65 20 74 68 61 74 20 69 73 20 62 65 69 6e  ase that is bein
17ef0 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54  g written */.  T
17f00 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b  oken *pName = 0;
17f10 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69      /* Unqualifi
17f20 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  ed name of the i
17f30 6e 64 65 78 20 74 6f 20 63 72 65 61 74 65 20 2a  ndex to create *
17f40 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
17f50 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49  ist_item *pListI
17f60 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  tem; /* For loop
17f70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73 74 20 2a  ing over pList *
17f80 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  /.  int nExtra =
17f90 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
17fa0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 6c       /* Space al
17fb0 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 45 78 74  located for zExt
17fc0 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ra[] */.  int nE
17fd0 78 74 72 61 43 6f 6c 3b 20 20 20 20 20 20 20 20  xtraCol;        
17fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
17ff0 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 63 6f  mber of extra co
18000 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a  lumns needed */.
18010 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61 20 3d    char *zExtra =
18020 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
18030 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70 61 63     /* Extra spac
18040 65 20 61 66 74 65 72 20 74 68 65 20 49 6e 64 65  e after the Inde
18050 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e  x object */.  In
18060 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20  dex *pPk = 0;   
18070 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45     /* PRIMARY KE
18080 59 20 69 6e 64 65 78 20 66 6f 72 20 57 49 54 48  Y index for WITH
18090 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 73  OUT ROWID tables
180a0 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   */..  if( db->m
180b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49  allocFailed || I
180c0 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 7c  N_DECLARE_VTAB |
180d0 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  | pParse->nErr>0
180e0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
180f0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
18100 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54 45    }.  if( SQLITE
18110 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
18120 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
18130 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
18140 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18150 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  }..  /*.  ** Fin
18160 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  d the table that
18170 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
18180 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79  d.  Return early
18190 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
181a0 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61   */.  if( pTblNa
181b0 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a  me!=0 ){..    /*
181c0 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72   Use the two-par
181d0 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20  t index name to 
181e0 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61  determine the da
181f0 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74  tabase .    ** t
18200 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  o search for the
18210 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68   table. 'Fix' th
18220 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  e table name to 
18230 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62  this db.    ** b
18240 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70  efore looking up
18250 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
18260 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
18270 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20  Name1 && pName2 
18280 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  );.    iDb = sql
18290 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
182a0 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
182b0 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
182c0 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
182d0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
182e0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
182f0 65 72 74 28 20 70 4e 61 6d 65 20 26 26 20 70 4e  ert( pName && pN
18300 61 6d 65 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64  ame->z );..#ifnd
18310 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
18320 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20  EMPDB.    /* If 
18330 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77  the index name w
18340 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20  as unqualified, 
18350 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 61 62  check if the tab
18360 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 74  le.    ** is a t
18370 65 6d 70 20 74 61 62 6c 65 2e 20 49 66 20 73 6f  emp table. If so
18380 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
18390 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20  se to 1. Do not 
183a0 64 6f 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 69  do this.    ** i
183b0 66 20 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 61  f initialising a
183c0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
183d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
183e0 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
183f0 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
18400 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 4c 6f  sqlite3SrcListLo
18410 6f 6b 75 70 28 70 50 61 72 73 65 2c 20 70 54 62  okup(pParse, pTb
18420 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  lName);.      if
18430 28 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26  ( pName2->n==0 &
18440 26 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e  & pTab && pTab->
18450 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62  pSchema==db->aDb
18460 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20  [1].pSchema ){. 
18470 20 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a         iDb = 1;.
18480 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
18490 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74 65  ndif..    sqlite
184a0 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20  3FixInit(&sFix, 
184b0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e  pParse, iDb, "in
184c0 64 65 78 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  dex", pName);.  
184d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
184e0 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70  SrcList(&sFix, p
184f0 54 62 6c 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  TblName) ){.    
18500 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65    /* Because the
18510 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63   parser construc
18520 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d  ts pTblName from
18530 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69   a single identi
18540 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73  fier,.      ** s
18550 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
18560 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e   can never fail.
18570 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
18580 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  (0);.    }.    p
18590 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
185a0 61 74 65 54 61 62 6c 65 49 74 65 6d 28 70 50 61  ateTableItem(pPa
185b0 72 73 65 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d  rse, 0, &pTblNam
185c0 65 2d 3e 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73  e->a[0]);.    as
185d0 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  sert( db->malloc
185e0 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61  Failed==0 || pTa
185f0 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  b==0 );.    if( 
18600 70 54 61 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65  pTab==0 ) goto e
18610 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18620 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3d 3d 31  ;.    if( iDb==1
18630 20 26 26 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d   && db->aDb[iDb]
18640 2e 70 53 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e  .pSchema!=pTab->
18650 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
18660 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18670 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
18680 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 63 72 65       "cannot cre
18690 61 74 65 20 61 20 54 45 4d 50 20 69 6e 64 65 78  ate a TEMP index
186a0 20 6f 6e 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62   on non-TEMP tab
186b0 6c 65 20 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20  le \"%s\"",.    
186c0 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
186d0 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
186e0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
186f0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
18700 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
18710 20 29 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33   ) pPk = sqlite3
18720 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
18730 70 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pTab);.  }else{.
18740 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
18750 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
18760 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 29 3b  rt( pStart==0 );
18770 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72  .    pTab = pPar
18780 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
18790 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67     if( !pTab ) g
187a0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
187b0 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20 3d  index;.    iDb =
187c0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
187d0 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
187e0 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20  pSchema);.  }.  
187f0 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
18800 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Db];..  assert( 
18810 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  pTab!=0 );.  ass
18820 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
18830 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71  r==0 );.  if( sq
18840 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54  lite3StrNICmp(pT
18850 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ab->zName, "sqli
18860 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20  te_", 7)==0 .   
18870 20 20 20 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e      && db->init.
18880 62 75 73 79 3d 3d 30 0a 23 69 66 20 53 51 4c 49  busy==0.#if SQLI
18890 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
188a0 43 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 26 26  CATION.       &&
188b0 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68   sqlite3UserAuth
188c0 54 61 62 6c 65 28 70 54 61 62 2d 3e 7a 4e 61 6d  Table(pTab->zNam
188d0 65 29 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20  e)==0.#endif.   
188e0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 53 74      && sqlite3St
188f0 72 4e 49 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e  rNICmp(&pTab->zN
18900 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62  ame[7],"altertab
18910 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20 20  _",9)!=0 ){.    
18920 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18930 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
18940 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
18950 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  exed", pTab->zNa
18960 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
18970 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18980 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
18990 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
189a0 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
189b0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
189c0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
189d0 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74 20   "views may not 
189e0 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
189f0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18a00 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
18a10 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
18a20 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
18a30 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
18a40 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
18a50 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
18a60 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74  sg(pParse, "virt
18a70 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e  ual tables may n
18a80 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
18a90 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
18aa0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
18ab0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20  .#endif..  /*.  
18ac0 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d 65  ** Find the name
18ad0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
18ae0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20  Make sure there 
18af0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
18b00 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65  nother.  ** inde
18b10 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68 20  x or table with 
18b20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
18b30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70  .  **.  ** Excep
18b40 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72 65  tion:  If we are
18b50 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61 6d   reading the nam
18b60 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20  es of permanent 
18b70 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68 65  indices from the
18b80 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73  .  ** sqlite_mas
18b90 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61 75  ter table (becau
18ba0 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
18bb0 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74 68  ocess changed th
18bc0 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20 20  e schema) and.  
18bd0 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  ** one of the in
18be0 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64  dex names collid
18bf0 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65  es with the name
18c00 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79 20   of a temporary 
18c10 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e  table or.  ** in
18c20 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69 6c  dex, then we wil
18c30 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72  l continue to pr
18c40 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65 78  ocess this index
18c50 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
18c60 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
18c70 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20 2a   that we are.  *
18c80 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  * dealing with a
18c90 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
18ca0 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
18cb0 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69  t.  We have to i
18cc0 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f  nvent our.  ** o
18cd0 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  wn name..  */.  
18ce0 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
18cf0 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
18d00 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
18d10 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , pName);.    if
18d20 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
18d30 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
18d40 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dex;.    assert(
18d50 20 70 4e 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a   pName->z!=0 );.
18d60 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
18d70 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f  K!=sqlite3CheckO
18d80 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65  bjectName(pParse
18d90 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
18da0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18db0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
18dc0 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
18dd0 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
18de0 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
18df0 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
18e00 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)!=0 ){.       
18e10 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
18e20 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
18e30 69 73 20 61 6c 72 65 61 64 79 20 61 20 74 61 62  is already a tab
18e40 6c 65 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e  le named %s", zN
18e50 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ame);.        go
18e60 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18e70 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ndex;.      }.  
18e80 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
18e90 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
18ea0 20 7a 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61   zName, pDb->zNa
18eb0 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
18ec0 69 66 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20  if( !ifNotExist 
18ed0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18ee0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
18ef0 65 2c 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72  e, "index %s alr
18f00 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e  eady exists", zN
18f10 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
18f20 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
18f30 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
18f40 79 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  y );.        sql
18f50 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63  ite3CodeVerifySc
18f60 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62  hema(pParse, iDb
18f70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18f80 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
18f90 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
18fa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
18fb0 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c  n;.    Index *pL
18fc0 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  oop;.    for(pLo
18fd0 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  op=pTab->pIndex,
18fe0 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f   n=1; pLoop; pLo
18ff0 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c  op=pLoop->pNext,
19000 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d   n++){}.    zNam
19010 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
19020 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61  tf(db, "sqlite_a
19030 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c  utoindex_%s_%d",
19040 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29   pTab->zName, n)
19050 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
19060 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
19070 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19080 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ex;.    }.  }.. 
19090 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75   /* Check for au
190a0 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63  thorization to c
190b0 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a  reate an index..
190c0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
190d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
190e0 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63  ZATION.  {.    c
190f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
19100 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20   pDb->zName;.   
19110 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
19120 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
19130 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
19140 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
19150 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
19160 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19170 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
19180 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52     i = SQLITE_CR
19190 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20  EATE_INDEX;.    
191a0 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
191b0 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d   && iDb==1 ) i =
191c0 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
191d0 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
191e0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
191f0 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a  eck(pParse, i, z
19200 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
19210 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
19220 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
19230 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
19240 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
19250 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20  If pList==0, it 
19260 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69  means this routi
19270 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ne was called to
19280 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a   make a primary.
19290 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20    ** key out of 
192a0 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
192b0 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
192c0 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
192d0 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63  ction..  ** So c
192e0 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73  reate a fake lis
192f0 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68  t to simulate th
19300 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  is..  */.  if( p
19310 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54  List==0 ){.    T
19320 6f 6b 65 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20  oken prevCol;.  
19330 20 20 70 72 65 76 43 6f 6c 2e 7a 20 3d 20 70 54    prevCol.z = pT
19340 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e  ab->aCol[pTab->n
19350 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  Col-1].zName;.  
19360 20 20 70 72 65 76 43 6f 6c 2e 6e 20 3d 20 73 71    prevCol.n = sq
19370 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 72  lite3Strlen30(pr
19380 65 76 43 6f 6c 2e 7a 29 3b 0a 20 20 20 20 70 4c  evCol.z);.    pL
19390 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
193a0 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
193b0 73 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  se, 0,.         
193c0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
193d0 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c  Alloc(db, TK_ID,
193e0 20 26 70 72 65 76 43 6f 6c 2c 20 30 29 29 3b 0a   &prevCol, 0));.
193f0 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
19400 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
19410 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61  ate_index;.    a
19420 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45  ssert( pList->nE
19430 78 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71  xpr==1 );.    sq
19440 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
19450 53 6f 72 74 4f 72 64 65 72 28 70 4c 69 73 74 2c  SortOrder(pList,
19460 20 73 6f 72 74 4f 72 64 65 72 29 3b 0a 20 20 7d   sortOrder);.  }
19470 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
19480 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65  3ExprListCheckLe
19490 6e 67 74 68 28 70 50 61 72 73 65 2c 20 70 4c 69  ngth(pParse, pLi
194a0 73 74 2c 20 22 69 6e 64 65 78 22 29 3b 0a 20 20  st, "index");.  
194b0 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
194c0 75 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65  ut how many byte
194d0 73 20 6f 66 20 73 70 61 63 65 20 61 72 65 20 72  s of space are r
194e0 65 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65  equired to store
194f0 20 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a   explicitly.  **
19500 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61   specified colla
19510 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61  tion sequence na
19520 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  mes..  */.  for(
19530 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
19540 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  xpr; i++){.    E
19550 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69  xpr *pExpr = pLi
19560 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
19570 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
19580 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  r!=0 );.    if( 
19590 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
195a0 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 6e  LLATE ){.      n
195b0 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 71  Extra += (1 + sq
195c0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45  lite3Strlen30(pE
195d0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b  xpr->u.zToken));
195e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
195f0 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20   .  ** Allocate 
19600 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74  the index struct
19610 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61  ure. .  */.  nNa
19620 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
19630 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e  en30(zName);.  n
19640 45 78 74 72 61 43 6f 6c 20 3d 20 70 50 6b 20 3f  ExtraCol = pPk ?
19650 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20   pPk->nKeyCol : 
19660 31 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  1;.  pIndex = sq
19670 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64  lite3AllocateInd
19680 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 4c 69  exObject(db, pLi
19690 73 74 2d 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74  st->nExpr + nExt
196a0 72 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20  raCol,.         
196b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196c0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4e 61               nNa
196d0 6d 65 20 2b 20 6e 45 78 74 72 61 20 2b 20 31 2c  me + nExtra + 1,
196e0 20 26 7a 45 78 74 72 61 29 3b 0a 20 20 69 66 28   &zExtra);.  if(
196f0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19700 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
19710 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19720 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45  .  }.  assert( E
19730 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
19740 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f  ENT(pIndex->aiRo
19750 77 4c 6f 67 45 73 74 29 20 29 3b 0a 20 20 61 73  wLogEst) );.  as
19760 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
19770 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65  _ALIGNMENT(pInde
19780 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20  x->azColl) );.  
19790 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20  pIndex->zName = 
197a0 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61  zExtra;.  zExtra
197b0 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20   += nName + 1;. 
197c0 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e   memcpy(pIndex->
197d0 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  zName, zName, nN
197e0 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78  ame+1);.  pIndex
197f0 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b  ->pTable = pTab;
19800 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  .  pIndex->onErr
19810 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72  or = (u8)onError
19820 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71  ;.  pIndex->uniq
19830 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f  NotNull = onErro
19840 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49  r!=OE_None;.  pI
19850 6e 64 65 78 2d 3e 69 64 78 54 79 70 65 20 3d 20  ndex->idxType = 
19860 70 4e 61 6d 65 20 3f 20 53 51 4c 49 54 45 5f 49  pName ? SQLITE_I
19870 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 3a 20  DXTYPE_APPDEF : 
19880 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 55  SQLITE_IDXTYPE_U
19890 4e 49 51 55 45 3b 0a 20 20 70 49 6e 64 65 78 2d  NIQUE;.  pIndex-
198a0 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  >pSchema = db->a
198b0 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
198c0 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  .  pIndex->nKeyC
198d0 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ol = pList->nExp
198e0 72 3b 0a 20 20 69 66 28 20 70 50 49 57 68 65 72  r;.  if( pPIWher
198f0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
19900 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72  ResolveSelfRefer
19910 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54 61  ence(pParse, pTa
19920 62 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c 20 70  b, NC_PartIdx, p
19930 50 49 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20  PIWhere, 0);.   
19940 20 70 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 64   pIndex->pPartId
19950 78 57 68 65 72 65 20 3d 20 70 50 49 57 68 65 72  xWhere = pPIWher
19960 65 3b 0a 20 20 20 20 70 50 49 57 68 65 72 65 20  e;.    pPIWhere 
19970 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  = 0;.  }.  asser
19980 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
19990 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
199a0 62 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  b, 0) );..  /* C
199b0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
199c0 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44  e should honor D
199d0 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20  ESC requests on 
199e0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20  index columns.  
199f0 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53  */.  if( pDb->pS
19a00 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
19a10 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72  at>=4 ){.    sor
19a20 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b  tOrderMask = -1;
19a30 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43     /* Honor DESC
19a40 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
19a50 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
19a60 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65   0;    /* Ignore
19a70 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20   DESC */.  }..  
19a80 2f 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 6c  /* Analyze the l
19a90 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
19aa0 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65  ns that form the
19ab0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e   terms of the in
19ac0 64 65 78 20 61 6e 64 0a 20 20 2a 2a 20 72 65 70  dex and.  ** rep
19ad0 6f 72 74 20 61 6e 79 20 65 72 72 6f 72 73 2e 20  ort any errors. 
19ae0 20 49 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   In the common c
19af0 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 78  ase where the ex
19b00 70 72 65 73 73 69 6f 6e 20 69 73 20 65 78 61 63  pression is exac
19b10 74 6c 79 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65  tly.  ** a table
19b20 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f 72 65 20 74   column, store t
19b30 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 69  hat column in ai
19b40 43 6f 6c 75 6d 6e 5b 5d 2e 20 20 46 6f 72 20 67  Column[].  For g
19b50 65 6e 65 72 61 6c 20 65 78 70 72 65 73 73 69 6f  eneral expressio
19b60 6e 73 2c 0a 20 20 2a 2a 20 70 6f 70 75 6c 61 74  ns,.  ** populat
19b70 65 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78  e pIndex->aColEx
19b80 70 72 20 61 6e 64 20 73 74 6f 72 65 20 58 4e 5f  pr and store XN_
19b90 45 58 50 52 20 28 2d 32 29 20 69 6e 20 61 69 43  EXPR (-2) in aiC
19ba0 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20 20  olumn[]..  **.  
19bb0 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61  ** TODO: Issue a
19bc0 20 77 61 72 6e 69 6e 67 20 69 66 20 74 77 6f 20   warning if two 
19bd0 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20  or more columns 
19be0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 72 65  of the index are
19bf0 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a   identical..  **
19c00 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 77   TODO: Issue a w
19c10 61 72 6e 69 6e 67 20 69 66 20 74 68 65 20 74 61  arning if the ta
19c20 62 6c 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  ble primary key 
19c30 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20  is used as part 
19c40 6f 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  of the.  ** inde
19c50 78 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f  x key..  */.  fo
19c60 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d  r(i=0, pListItem
19c70 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69  =pList->a; i<pLi
19c80 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
19c90 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20  pListItem++){.  
19ca0 20 20 45 78 70 72 20 2a 70 43 45 78 70 72 3b 20    Expr *pCExpr; 
19cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cc0 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 69 6e 64   /* The i-th ind
19cd0 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  ex expression */
19ce0 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65 73 74  .    int request
19cf0 65 64 53 6f 72 74 4f 72 64 65 72 3b 20 20 20 20  edSortOrder;    
19d00 20 20 20 20 2f 2a 20 41 53 43 20 6f 72 20 44 45      /* ASC or DE
19d10 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 65  SC on the i-th e
19d20 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
19d30 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20   char *zColl;   
19d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d50 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  /* Collation seq
19d60 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20  uence name */.. 
19d70 20 20 20 73 71 6c 69 74 65 33 53 74 72 69 6e 67     sqlite3String
19d80 54 6f 49 64 28 70 4c 69 73 74 49 74 65 6d 2d 3e  ToId(pListItem->
19d90 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69  pExpr);.    sqli
19da0 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65  te3ResolveSelfRe
19db0 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20  ference(pParse, 
19dc0 70 54 61 62 2c 20 4e 43 5f 49 64 78 45 78 70 72  pTab, NC_IdxExpr
19dd0 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  , pListItem->pEx
19de0 70 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  pr, 0);.    if( 
19df0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
19e00 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
19e10 69 6e 64 65 78 3b 0a 20 20 20 20 70 43 45 78 70  index;.    pCExp
19e20 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
19e30 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74  kipCollate(pList
19e40 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
19e50 20 20 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70    if( pCExpr->op
19e60 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  !=TK_COLUMN ){. 
19e70 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 70       if( pTab==p
19e80 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
19e90 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19ea0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
19eb0 73 65 2c 20 22 65 78 70 72 65 73 73 69 6f 6e 73  se, "expressions
19ec0 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 50   prohibited in P
19ed0 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 20 22  RIMARY KEY and "
19ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f00 20 22 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61   "UNIQUE constra
19f10 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 20 20  ints");.        
19f20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
19f30 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
19f40 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65 78        if( pIndex
19f50 2d 3e 61 43 6f 6c 45 78 70 72 3d 3d 30 20 29 7b  ->aColExpr==0 ){
19f60 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
19f70 74 20 2a 70 43 6f 70 79 20 3d 20 73 71 6c 69 74  t *pCopy = sqlit
19f80 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62  e3ExprListDup(db
19f90 2c 20 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20  , pList, 0);.   
19fa0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f       pIndex->aCo
19fb0 6c 45 78 70 72 20 3d 20 70 43 6f 70 79 3b 0a 20  lExpr = pCopy;. 
19fc0 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e         if( !db->
19fd0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
19fe0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
19ff0 28 20 70 43 6f 70 79 21 3d 30 20 29 3b 0a 20 20  ( pCopy!=0 );.  
1a000 20 20 20 20 20 20 20 20 70 4c 69 73 74 49 74 65          pListIte
1a010 6d 20 3d 20 26 70 43 6f 70 79 2d 3e 61 5b 69 5d  m = &pCopy->a[i]
1a020 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a030 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 58 4e    }.      j = XN
1a040 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e  _EXPR;.      pIn
1a050 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  dex->aiColumn[i]
1a060 20 3d 20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20   = XN_EXPR;.    
1a070 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f    pIndex->uniqNo
1a080 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d  tNull = 0;.    }
1a090 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 20 3d 20  else{.      j = 
1a0a0 70 43 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b  pCExpr->iColumn;
1a0b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
1a0c0 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20  <=0x7fff );.    
1a0d0 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20    if( j<0 ){.   
1a0e0 20 20 20 20 20 6a 20 3d 20 70 54 61 62 2d 3e 69       j = pTab->i
1a0f0 50 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73  PKey;.      }els
1a100 65 20 69 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c  e if( pTab->aCol
1a110 5b 6a 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29  [j].notNull==0 )
1a120 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  {.        pIndex
1a130 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20  ->uniqNotNull = 
1a140 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1a150 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1a160 6e 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b 0a 20  n[i] = (i16)j;. 
1a170 20 20 20 7d 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d     }.    zColl =
1a180 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   0;.    if( pLis
1a190 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70  tItem->pExpr->op
1a1a0 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a  ==TK_COLLATE ){.
1a1b0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b        int nColl;
1a1c0 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
1a1d0 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d  ListItem->pExpr-
1a1e0 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
1a1f0 20 6e 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   nColl = sqlite3
1a200 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20  Strlen30(zColl) 
1a210 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  + 1;.      asser
1a220 74 28 20 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c  t( nExtra>=nColl
1a230 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   );.      memcpy
1a240 28 7a 45 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20  (zExtra, zColl, 
1a250 6e 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43  nColl);.      zC
1a260 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20  oll = zExtra;.  
1a270 20 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43      zExtra += nC
1a280 6f 6c 6c 3b 0a 20 20 20 20 20 20 6e 45 78 74 72  oll;.      nExtr
1a290 61 20 2d 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20  a -= nColl;.    
1a2a0 7d 65 6c 73 65 20 69 66 28 20 6a 3e 3d 30 20 29  }else if( j>=0 )
1a2b0 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  {.      zColl = 
1a2c0 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43  pTab->aCol[j].zC
1a2d0 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  oll;.    }.    i
1a2e0 66 28 20 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c  f( !zColl ) zCol
1a2f0 6c 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  l = "BINARY";.  
1a300 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
1a310 62 75 73 79 20 26 26 20 21 73 71 6c 69 74 65 33  busy && !sqlite3
1a320 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
1a330 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  arse, zColl) ){.
1a340 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1a350 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1a360 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e    }.    pIndex->
1a370 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c  azColl[i] = zCol
1a380 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74 65 64  l;.    requested
1a390 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73  SortOrder = pLis
1a3a0 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  tItem->sortOrder
1a3b0 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b   & sortOrderMask
1a3c0 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53  ;.    pIndex->aS
1a3d0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75  ortOrder[i] = (u
1a3e0 38 29 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  8)requestedSortO
1a3f0 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rder;.  }..  /* 
1a400 41 70 70 65 6e 64 20 74 68 65 20 74 61 62 6c 65  Append the table
1a410 20 6b 65 79 20 74 6f 20 74 68 65 20 65 6e 64 20   key to the end 
1a420 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 46  of the index.  F
1a430 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
1a440 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 28 77 68  .  ** tables (wh
1a450 65 6e 20 70 50 6b 21 3d 30 29 20 74 68 69 73 20  en pPk!=0) this 
1a460 77 69 6c 6c 20 62 65 20 74 68 65 20 64 65 63 6c  will be the decl
1a470 61 72 65 64 20 50 52 49 4d 41 52 59 20 4b 45 59  ared PRIMARY KEY
1a480 2e 20 20 46 6f 72 0a 20 20 2a 2a 20 6e 6f 72 6d  .  For.  ** norm
1a490 61 6c 20 74 61 62 6c 65 73 20 28 77 68 65 6e 20  al tables (when 
1a4a0 70 50 6b 3d 3d 30 29 20 74 68 69 73 20 77 69 6c  pPk==0) this wil
1a4b0 6c 20 62 65 20 74 68 65 20 72 6f 77 69 64 2e 0a  l be the rowid..
1a4c0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 6b 20 29    */.  if( pPk )
1a4d0 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
1a4e0 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  <pPk->nKeyCol; j
1a4f0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  ++){.      int x
1a500 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e   = pPk->aiColumn
1a510 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  [j];.      asser
1a520 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20  t( x>=0 );.     
1a530 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70   if( hasColumn(p
1a540 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  Index->aiColumn,
1a550 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c   pIndex->nKeyCol
1a560 2c 20 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , x) ){.        
1a570 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  pIndex->nColumn-
1a580 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -; .      }else{
1a590 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  .        pIndex-
1a5a0 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78  >aiColumn[i] = x
1a5b0 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ;.        pIndex
1a5c0 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50  ->azColl[i] = pP
1a5d0 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20  k->azColl[j];.  
1a5e0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53        pIndex->aS
1a5f0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 50  ortOrder[i] = pP
1a600 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  k->aSortOrder[j]
1a610 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20  ;.        i++;. 
1a620 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a630 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49 6e 64   assert( i==pInd
1a640 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  ex->nColumn );. 
1a650 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64   }else{.    pInd
1a660 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
1a670 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20  = XN_ROWID;.    
1a680 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
1a690 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  ] = "BINARY";.  
1a6a0 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61 75  }.  sqlite3Defau
1a6b0 6c 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29  ltRowEst(pIndex)
1a6c0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1a6d0 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 20 65  pNewTable==0 ) e
1a6e0 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74  stimateIndexWidt
1a6f0 68 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66  h(pIndex);..  if
1a700 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e  ( pTab==pParse->
1a710 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20  pNewTable ){.   
1a720 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65   /* This routine
1a730 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64   has been called
1a740 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61 75   to create an au
1a750 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61 73  tomatic index as
1a760 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74   a.    ** result
1a770 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b 45   of a PRIMARY KE
1a780 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75  Y or UNIQUE clau
1a790 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64  se on a column d
1a7a0 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20  efinition, or.  
1a7b0 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20 4b    ** a PRIMARY K
1a7c0 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
1a7d0 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  use following th
1a7e0 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  e column definit
1a7f0 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65  ions..    ** i.e
1a800 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a  . one of:.    **
1a810 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54  .    ** CREATE T
1a820 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52 59  ABLE t(x PRIMARY
1a830 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a   KEY, y);.    **
1a840 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
1a850 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c 20  x, y, UNIQUE(x, 
1a860 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  y));.    **.    
1a870 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 63  ** Either way, c
1a880 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
1a890 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
1a8a0 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e 64   has such an ind
1a8b0 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f  ex. If.    ** so
1a8c0 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20 63  , don't bother c
1a8d0 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e 65  reating this one
1a8e0 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c  . This only appl
1a8f0 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75  ies to.    ** au
1a900 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65 61  tomatically crea
1a910 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73 65  ted indices. Use
1a920 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68 65  rs can do as the
1a930 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20 20  y wish with.    
1a940 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64 69  ** explicit indi
1a950 63 65 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ces..    **.    
1a960 2a 2a 20 54 77 6f 20 55 4e 49 51 55 45 20 6f 72  ** Two UNIQUE or
1a970 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
1a980 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 6e  straints are con
1a990 73 69 64 65 72 65 64 20 65 71 75 69 76 61 6c 65  sidered equivale
1a9a0 6e 74 0a 20 20 20 20 2a 2a 20 28 61 6e 64 20 74  nt.    ** (and t
1a9b0 68 75 73 20 73 75 70 70 72 65 73 73 69 6e 67 20  hus suppressing 
1a9c0 74 68 65 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20  the second one) 
1a9d0 65 76 65 6e 20 69 66 20 74 68 65 79 20 68 61 76  even if they hav
1a9e0 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20  e different.    
1a9f0 2a 2a 20 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a  ** sort orders..
1aa00 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
1aa10 20 74 68 65 72 65 20 61 72 65 20 64 69 66 66 65   there are diffe
1aa20 72 65 6e 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73  rent collating s
1aa30 65 71 75 65 6e 63 65 73 20 6f 72 20 69 66 20 74  equences or if t
1aa40 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  he columns of.  
1aa50 20 20 2a 2a 20 74 68 65 20 63 6f 6e 73 74 72 61    ** the constra
1aa60 69 6e 74 20 6f 63 63 75 72 20 69 6e 20 64 69 66  int occur in dif
1aa70 66 65 72 65 6e 74 20 6f 72 64 65 72 73 2c 20 74  ferent orders, t
1aa80 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69  hen the constrai
1aa90 6e 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 63  nts are.    ** c
1aaa0 6f 6e 73 69 64 65 72 65 64 20 64 69 73 74 69 6e  onsidered distin
1aab0 63 74 20 61 6e 64 20 62 6f 74 68 20 72 65 73 75  ct and both resu
1aac0 6c 74 20 69 6e 20 73 65 70 61 72 61 74 65 20 69  lt in separate i
1aad0 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  ndices..    */. 
1aae0 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
1aaf0 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
1ab00 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
1ab10 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
1ab20 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b  t){.      int k;
1ab30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 49  .      assert( I
1ab40 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
1ab50 78 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  x) );.      asse
1ab60 72 74 28 20 70 49 64 78 2d 3e 69 64 78 54 79 70  rt( pIdx->idxTyp
1ab70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58 54 59 50  e!=SQLITE_IDXTYP
1ab80 45 5f 41 50 50 44 45 46 20 29 3b 0a 20 20 20 20  E_APPDEF );.    
1ab90 20 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71    assert( IsUniq
1aba0 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 20  ueIndex(pIndex) 
1abb0 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49  );..      if( pI
1abc0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e  dx->nKeyCol!=pIn
1abd0 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63  dex->nKeyCol ) c
1abe0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
1abf0 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e  or(k=0; k<pIdx->
1ac00 6e 4b 65 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20  nKeyCol; k++){. 
1ac10 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
1ac20 72 20 2a 7a 31 3b 0a 20 20 20 20 20 20 20 20 63  r *z1;.        c
1ac30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20  onst char *z2;. 
1ac40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1ac50 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  Idx->aiColumn[k]
1ac60 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  >=0 );.        i
1ac70 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  f( pIdx->aiColum
1ac80 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69  n[k]!=pIndex->ai
1ac90 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61  Column[k] ) brea
1aca0 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20  k;.        z1 = 
1acb0 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b  pIdx->azColl[k];
1acc0 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 49  .        z2 = pI
1acd0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b  ndex->azColl[k];
1ace0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 31 21  .        if( z1!
1acf0 3d 7a 32 20 26 26 20 73 71 6c 69 74 65 33 53 74  =z2 && sqlite3St
1ad00 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20  rICmp(z1, z2) ) 
1ad10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1ad20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78       if( k==pIdx
1ad30 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20  ->nKeyCol ){.   
1ad40 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
1ad50 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e  nError!=pIndex->
1ad60 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  onError ){.     
1ad70 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
1ad80 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20  straint creates 
1ad90 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61  the same index a
1ada0 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  s a previous.   
1adb0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
1adc0 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73  aint specified s
1add0 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  omewhere in the 
1ade0 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
1adf0 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20  tement..        
1ae00 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65    ** However the
1ae10 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
1ae20 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65  uses are differe
1ae30 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73  nt. If both this
1ae40 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63   .          ** c
1ae50 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
1ae60 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76  e previous equiv
1ae70 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  alent constraint
1ae80 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20   have explicit. 
1ae90 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43           ** ON C
1aea0 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
1aeb0 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  this is an error
1aec0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
1aed0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
1aee0 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  * explicitly spe
1aef0 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 72 20  cified behavior 
1af00 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  for the index.. 
1af10 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1af20 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78        if( !(pIdx
1af30 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
1af40 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d  fault || pIndex-
1af50 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
1af60 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20  ault) ){.       
1af70 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
1af80 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
1af90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
1afa0 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f  onflicting ON CO
1afb0 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73  NFLICT clauses s
1afc0 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20  pecified", 0);. 
1afd0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1afe0 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
1aff0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
1b000 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  lt ){.          
1b010 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20    pIdx->onError 
1b020 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  = pIndex->onErro
1b030 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
1b040 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b050 20 70 52 65 74 20 3d 20 70 49 64 78 3b 0a 20 20   pRet = pIdx;.  
1b060 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1b070 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1b080 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1b090 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e  .  /* Link the n
1b0a0 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  ew Index structu
1b0b0 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20  re to its table 
1b0c0 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72  and to the other
1b0d0 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  .  ** in-memory 
1b0e0 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
1b0f0 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73  res. .  */.  ass
1b100 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
1b110 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 62  r==0 );.  if( db
1b120 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
1b130 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20     Index *p;.   
1b140 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1b150 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
1b160 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70  db, 0, pIndex->p
1b170 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 70  Schema) );.    p
1b180 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
1b190 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53  sert(&pIndex->pS
1b1a0 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
1b1b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b1c0 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
1b1d0 78 2d 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78  x->zName, pIndex
1b1e0 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a  );.    if( p ){.
1b1f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
1b200 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d  =pIndex );  /* M
1b210 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20  alloc must have 
1b220 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20  failed */.      
1b230 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1b240 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
1b250 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
1b260 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  ex;.    }.    db
1b270 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
1b280 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
1b290 0a 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d  .    if( pTblNam
1b2a0 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49  e!=0 ){.      pI
1b2b0 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d  ndex->tnum = db-
1b2c0 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20  >init.newTnum;. 
1b2d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
1b2e0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 69 6e  f this is the in
1b2f0 69 74 69 61 6c 20 43 52 45 41 54 45 20 49 4e 44  itial CREATE IND
1b300 45 58 20 73 74 61 74 65 6d 65 6e 74 20 28 6f 72  EX statement (or
1b310 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 69 66   CREATE TABLE if
1b320 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
1b330 69 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e  is an implied in
1b340 64 65 78 20 66 6f 72 20 61 20 55 4e 49 51 55 45  dex for a UNIQUE
1b350 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20   or PRIMARY KEY 
1b360 63 6f 6e 73 74 72 61 69 6e 74 29 20 74 68 65 6e  constraint) then
1b370 0a 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20  .  ** emit code 
1b380 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  to allocate the 
1b390 69 6e 64 65 78 20 72 6f 6f 74 70 61 67 65 20 6f  index rootpage o
1b3a0 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20  n disk and make 
1b3b0 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  an entry for.  *
1b3c0 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 74  * the index in t
1b3d0 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
1b3e0 20 74 61 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c   table and popul
1b3f0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 77 69  ate the index wi
1b400 74 68 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e  th.  ** content.
1b410 20 20 42 75 74 2c 20 64 6f 20 6e 6f 74 20 64 6f    But, do not do
1b420 20 74 68 69 73 20 69 66 20 77 65 20 61 72 65 20   this if we are 
1b430 73 69 6d 70 6c 79 20 72 65 61 64 69 6e 67 20 74  simply reading t
1b440 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
1b450 0a 20 20 2a 2a 20 74 61 62 6c 65 20 74 6f 20 70  .  ** table to p
1b460 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2c  arse the schema,
1b470 20 6f 72 20 69 66 20 74 68 69 73 20 69 6e 64 65   or if this inde
1b480 78 20 69 73 20 74 68 65 20 50 52 49 4d 41 52 59  x is the PRIMARY
1b490 20 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2a 20   KEY index.  ** 
1b4a0 6f 66 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57  of a WITHOUT ROW
1b4b0 49 44 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  ID table..  **. 
1b4c0 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d   ** If pTblName=
1b4d0 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
1b4e0 20 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61   index is genera
1b4f0 74 65 64 20 61 73 20 61 6e 20 69 6d 70 6c 69 65  ted as an implie
1b500 64 20 50 52 49 4d 41 52 59 20 4b 45 59 0a 20 20  d PRIMARY KEY.  
1b510 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64  ** or UNIQUE ind
1b520 65 78 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  ex in a CREATE T
1b530 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
1b540 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65   Since the table
1b550 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62  .  ** has just b
1b560 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20  een created, it 
1b570 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
1b580 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69   and the index i
1b590 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
1b5a0 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73  ** step can be s
1b5b0 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65  kipped..  */.  e
1b5c0 6c 73 65 20 69 66 28 20 48 61 73 52 6f 77 69 64  lse if( HasRowid
1b5d0 28 70 54 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61  (pTab) || pTblNa
1b5e0 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 56 64 62  me!=0 ){.    Vdb
1b5f0 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a  e *v;.    char *
1b600 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69  zStmt;.    int i
1b610 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
1b620 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73  nMem;..    v = s
1b630 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1b640 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
1b650 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
1b660 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20  create_index;.. 
1b670 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1b680 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1b690 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a  arse, 1, iDb);..
1b6a0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68      /* Create th
1b6b0 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74  e rootpage for t
1b6c0 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67 20 43  he index using C
1b6d0 72 65 61 74 65 49 6e 64 65 78 2e 20 42 75 74 20  reateIndex. But 
1b6e0 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 64 6f  before.    ** do
1b6f0 69 6e 67 20 73 6f 2c 20 63 6f 64 65 20 61 20 4e  ing so, code a N
1b700 6f 6f 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  oop instruction 
1b710 61 6e 64 20 73 74 6f 72 65 20 69 74 73 20 61 64  and store its ad
1b720 64 72 65 73 73 20 69 6e 20 0a 20 20 20 20 2a 2a  dress in .    **
1b730 20 49 6e 64 65 78 2e 74 6e 75 6d 2e 20 54 68 69   Index.tnum. Thi
1b740 73 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  s is required in
1b750 20 63 61 73 65 20 74 68 69 73 20 69 6e 64 65 78   case this index
1b760 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 0a   is actually a .
1b770 20 20 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b      ** PRIMARY K
1b780 45 59 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  EY and the table
1b790 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20 57   is actually a W
1b7a0 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
1b7b0 6c 65 2e 20 49 6e 20 0a 20 20 20 20 2a 2a 20 74  le. In .    ** t
1b7c0 68 61 74 20 63 61 73 65 20 74 68 65 20 63 6f 6e  hat case the con
1b7d0 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77  vertToWithoutRow
1b7e0 69 64 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e  idTable() routin
1b7f0 65 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20  e will replace. 
1b800 20 20 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77     ** the Noop w
1b810 69 74 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75  ith a Goto to ju
1b820 6d 70 20 6f 76 65 72 20 74 68 65 20 56 44 42 45  mp over the VDBE
1b830 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
1b840 62 65 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 70 49  below. */.    pI
1b850 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c  ndex->tnum = sql
1b860 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76  ite3VdbeAddOp0(v
1b870 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20  , OP_Noop);.    
1b880 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b890 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e  2(v, OP_CreateIn
1b8a0 64 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b  dex, iDb, iMem);
1b8b0 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20  ..    /* Gather 
1b8c0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
1b8d0 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  t of the CREATE 
1b8e0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
1b8f0 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  into.    ** the 
1b900 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20  zStmt variable. 
1b910 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53     */.    if( pS
1b920 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  tart ){.      in
1b930 74 20 6e 20 3d 20 28 69 6e 74 29 28 70 50 61 72  t n = (int)(pPar
1b940 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a  se->sLastToken.z
1b950 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70   - pName->z) + p
1b960 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
1b970 6e 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n.n;.      if( p
1b980 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b  Name->z[n-1]==';
1b990 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f  ' ) n--;.      /
1b9a0 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  * A named index 
1b9b0 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74  with an explicit
1b9c0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
1b9d0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20  atement */.     
1b9e0 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
1b9f0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45  MPrintf(db, "CRE
1ba00 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73  ATE%s INDEX %.*s
1ba10 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72  ",.        onErr
1ba20 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22  or==OE_None ? ""
1ba30 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c   : " UNIQUE", n,
1ba40 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20   pName->z);.    
1ba50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
1ba60 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  An automatic ind
1ba70 65 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ex created by a 
1ba80 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
1ba90 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
1baa0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74   */.      /* zSt
1bab0 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
1bac0 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20  ntf(""); */.    
1bad0 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    zStmt = 0;.   
1bae0 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61   }..    /* Add a
1baf0 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74  n entry in sqlit
1bb00 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69  e_master for thi
1bb10 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20  s index.    */. 
1bb20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
1bb30 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
1bb40 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
1bb50 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53  NTO %Q.%s VALUES
1bb60 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23  ('index',%Q,%Q,#
1bb70 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20  %d,%Q);",.      
1bb80 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
1bb90 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
1bba0 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20  LE(iDb),.       
1bbb0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a   pIndex->zName,.
1bbc0 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
1bbd0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 69 4d 65  ame,.        iMe
1bbe0 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74  m,.        zStmt
1bbf0 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
1bc00 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
1bc10 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  tmt);..    /* Fi
1bc20 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  ll the index wit
1bc30 68 20 64 61 74 61 20 61 6e 64 20 72 65 70 61 72  h data and repar
1bc40 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43  se the schema. C
1bc50 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65  ode an OP_Expire
1bc60 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c  .    ** to inval
1bc70 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f  idate all pre-co
1bc80 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
1bc90 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
1bca0 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20  ( pTblName ){.  
1bcb0 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
1bcc0 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
1bcd0 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20  Index, iMem);.  
1bce0 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
1bcf0 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
1bd00 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
1bd10 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53  te3VdbeAddParseS
1bd20 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a  chemaOp(v, iDb,.
1bd30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1bd40 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d  MPrintf(db, "nam
1bd50 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d  e='%q' AND type=
1bd60 27 69 6e 64 65 78 27 22 2c 20 70 49 6e 64 65 78  'index'", pIndex
1bd70 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20  ->zName));.     
1bd80 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1bd90 70 31 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c  p1(v, OP_Expire,
1bda0 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
1bdb0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
1bdc0 65 72 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 74  ere(v, pIndex->t
1bdd0 6e 75 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  num);.  }..  /* 
1bde0 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69  When adding an i
1bdf0 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74  ndex to the list
1be00 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20   of indices for 
1be10 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20  a table, make.  
1be20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69  ** sure all indi
1be30 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52  ces labeled OE_R
1be40 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65  eplace come afte
1be50 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65  r all those labe
1be60 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f  led.  ** OE_Igno
1be70 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  re.  This is nec
1be80 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63  essary for the c
1be90 6f 72 72 65 63 74 20 63 6f 6e 73 74 72 61 69 6e  orrect constrain
1bea0 74 20 63 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f  t check.  ** pro
1beb0 63 65 73 73 69 6e 67 20 28 69 6e 20 73 71 6c 69  cessing (in sqli
1bec0 74 65 33 47 65 6e 65 72 61 74 65 43 6f 6e 73 74  te3GenerateConst
1bed0 72 61 69 6e 74 43 68 65 63 6b 73 28 29 29 20 61  raintChecks()) a
1bee0 73 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55  s part of.  ** U
1bef0 50 44 41 54 45 20 61 6e 64 20 49 4e 53 45 52 54  PDATE and INSERT
1bf00 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20   statements.  . 
1bf10 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
1bf20 69 74 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e  it.busy || pTblN
1bf30 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  ame==0 ){.    if
1bf40 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ( onError!=OE_Re
1bf50 70 6c 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70  place || pTab->p
1bf60 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20  Index==0.       
1bf70 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65    || pTab->pInde
1bf80 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52  x->onError==OE_R
1bf90 65 70 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70  eplace){.      p
1bfa0 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70  Index->pNext = p
1bfb0 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Tab->pIndex;.   
1bfc0 20 20 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20     pTab->pIndex 
1bfd0 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65  = pIndex;.    }e
1bfe0 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
1bff0 20 2a 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d   *pOther = pTab-
1c000 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77  >pIndex;.      w
1c010 68 69 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e  hile( pOther->pN
1c020 65 78 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70  ext && pOther->p
1c030 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  Next->onError!=O
1c040 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  E_Replace ){.   
1c050 20 20 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f       pOther = pO
1c060 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
1c070 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65     }.      pInde
1c080 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65  x->pNext = pOthe
1c090 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
1c0a0 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20  pOther->pNext = 
1c0b0 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  pIndex;.    }.  
1c0c0 20 20 70 52 65 74 20 3d 20 70 49 6e 64 65 78 3b    pRet = pIndex;
1c0d0 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b  .    pIndex = 0;
1c0e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
1c0f0 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69   up before exiti
1c100 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74  ng */.exit_creat
1c110 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70  e_index:.  if( p
1c120 49 6e 64 65 78 20 29 20 66 72 65 65 49 6e 64 65  Index ) freeInde
1c130 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  x(db, pIndex);. 
1c140 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1c150 74 65 28 64 62 2c 20 70 50 49 57 68 65 72 65 29  te(db, pPIWhere)
1c160 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
1c170 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
1c180 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ist);.  sqlite3S
1c190 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
1c1a0 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71   pTblName);.  sq
1c1b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1c1c0 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  zName);.  return
1c1d0 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
1c1e0 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61  Fill the Index.a
1c1f0 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20  iRowEst[] array 
1c200 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66  with default inf
1c210 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72  ormation - infor
1c220 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20  mation.** to be 
1c230 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61 76  used when we hav
1c240 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e  e not run the AN
1c250 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  ALYZE command..*
1c260 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d  *.** aiRowEst[0]
1c270 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20   is supposed to 
1c280 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
1c290 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
1c2a0 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20  n the index..** 
1c2b0 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20  Since we do not 
1c2c0 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69  know, guess 1 mi
1c2d0 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74  llion.  aiRowEst
1c2e0 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [1] is an estima
1c2f0 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d  te of the.** num
1c300 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
1c310 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61  he table that ma
1c320 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
1c330 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  ar value of the.
1c340 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20  ** first column 
1c350 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61  of the index.  a
1c360 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e  iRowEst[2] is an
1c370 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
1c380 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f   number.** of ro
1c390 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e  ws that match an
1c3a0 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d  y particular com
1c3b0 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  bination of the 
1c3c0 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a  first 2 columns.
1c3d0 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ** of the index.
1c3e0 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20    And so forth. 
1c3f0 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20   It must always 
1c400 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
1c410 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .*.**           
1c420 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52  aiRowEst[N]<=aiR
1c430 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20  owEst[N-1].**   
1c440 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74          aiRowEst
1c450 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61  [N]>=1.**.** Apa
1c460 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65  rt from that, we
1c470 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20   have little to 
1c480 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e  go on besides in
1c490 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a  tuition as to.**
1c4a0 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20   how aiRowEst[] 
1c4b0 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
1c4c0 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62  lized.  The numb
1c4d0 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68 65  ers generated he
1c4e0 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20  re.** are based 
1c4f0 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65  on typical value
1c500 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61  s found in actua
1c510 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f  l indices..*/.vo
1c520 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  id sqlite3Defaul
1c530 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70  tRowEst(Index *p
1c540 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20 20 20  Idx){.  /*      
1c550 20 20 20 20 20 20 20 20 20 20 31 30 2c 20 20 39            10,  9
1c560 2c 20 20 38 2c 20 20 37 2c 20 20 36 20 2a 2f 0a  ,  8,  7,  6 */.
1c570 20 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b 5d 20    LogEst aVal[] 
1c580 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33 30 2c 20  = { 33, 32, 30, 
1c590 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f 67 45  28, 26 };.  LogE
1c5a0 73 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69  st *a = pIdx->ai
1c5b0 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 6e 74  RowLogEst;.  int
1c5c0 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41 72 72   nCopy = MIN(Arr
1c5d0 61 79 53 69 7a 65 28 61 56 61 6c 29 2c 20 70 49  aySize(aVal), pI
1c5e0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20  dx->nKeyCol);.  
1c5f0 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 65 74  int i;..  /* Set
1c600 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1c610 20 28 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73   (number of rows
1c620 20 69 6e 20 74 68 65 20 69 6e 64 65 78 29 20 74   in the index) t
1c630 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  o the estimated 
1c640 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
1c650 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
1c660 65 2e 20 4f 72 20 31 30 2c 20 69 66 20 74 68 65  e. Or 10, if the
1c670 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
1c680 72 20 6f 66 20 72 6f 77 73 20 0a 20 20 2a 2a 20  r of rows .  ** 
1c690 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  in the table is 
1c6a0 6c 65 73 73 20 74 68 61 6e 20 74 68 61 74 2e 20  less than that. 
1c6b0 20 2a 2f 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64   */.  a[0] = pId
1c6c0 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c  x->pTable->nRowL
1c6d0 6f 67 45 73 74 3b 0a 20 20 69 66 28 20 61 5b 30  ogEst;.  if( a[0
1c6e0 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d 20 33 33  ]<33 ) a[0] = 33
1c6f0 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  ;        assert(
1c700 20 33 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   33==sqlite3LogE
1c710 73 74 28 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  st(10) );..  /* 
1c720 45 73 74 69 6d 61 74 65 20 74 68 61 74 20 61 5b  Estimate that a[
1c730 31 5d 20 69 73 20 31 30 2c 20 61 5b 32 5d 20 69  1] is 10, a[2] i
1c740 73 20 39 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20  s 9, a[3] is 8, 
1c750 61 5b 34 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20  a[4] is 7, a[5] 
1c760 69 73 0a 20 20 2a 2a 20 36 20 61 6e 64 20 65 61  is.  ** 6 and ea
1c770 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 76 61  ch subsequent va
1c780 6c 75 65 20 28 69 66 20 61 6e 79 29 20 69 73 20  lue (if any) is 
1c790 35 2e 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  5.  */.  memcpy(
1c7a0 26 61 5b 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f  &a[1], aVal, nCo
1c7b0 70 79 2a 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74  py*sizeof(LogEst
1c7c0 29 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70  ));.  for(i=nCop
1c7d0 79 2b 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b  y+1; i<=pIdx->nK
1c7e0 65 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  eyCol; i++){.   
1c7f0 20 61 5b 69 5d 20 3d 20 32 33 3b 20 20 20 20 20   a[i] = 23;     
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1c810 73 73 65 72 74 28 20 32 33 3d 3d 73 71 6c 69 74  ssert( 23==sqlit
1c820 65 33 4c 6f 67 45 73 74 28 35 29 20 29 3b 0a 20  e3LogEst(5) );. 
1c830 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 30 3d   }..  assert( 0=
1c840 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
1c850 29 20 29 3b 0a 20 20 69 66 28 20 49 73 55 6e 69  ) );.  if( IsUni
1c860 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29  queIndex(pIdx) )
1c870 20 61 5b 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   a[pIdx->nKeyCol
1c880 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = 0;.}../*.** 
1c890 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
1c8a0 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69  l drop an existi
1c8b0 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20  ng named index. 
1c8c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
1c8d0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
1c8e0 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65  DROP INDEX state
1c8f0 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
1c900 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50  lite3DropIndex(P
1c910 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72  arse *pParse, Sr
1c920 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e  cList *pName, in
1c930 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49  t ifExists){.  I
1c940 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20  ndex *pIndex;.  
1c950 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
1c960 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1c970 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
1c980 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1c990 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20  e->nErr==0 );   
1c9a0 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64 20  /* Never called 
1c9b0 77 69 74 68 20 70 72 69 6f 72 20 65 72 72 6f 72  with prior error
1c9c0 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d  s */.  if( db->m
1c9d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
1c9e0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1c9f0 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61  p_index;.  }.  a
1ca00 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
1ca10 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53  rc==1 );.  if( S
1ca20 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
1ca30 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
1ca40 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  se) ){.    goto 
1ca50 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1ca60 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20  .  }.  pIndex = 
1ca70 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
1ca80 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  (db, pName->a[0]
1ca90 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61  .zName, pName->a
1caa0 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a  [0].zDatabase);.
1cab0 20 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20    if( pIndex==0 
1cac0 29 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78  ){.    if( !ifEx
1cad0 69 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71  ists ){.      sq
1cae0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1caf0 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69  arse, "no such i
1cb00 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65  ndex: %S", pName
1cb10 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
1cb20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
1cb30 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63 68  deVerifyNamedSch
1cb40 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ema(pParse, pNam
1cb50 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
1cb60 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  e);.    }.    pP
1cb70 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
1cb80 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20  a = 1;.    goto 
1cb90 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1cba0 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64 65  .  }.  if( pInde
1cbb0 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c 49  x->idxType!=SQLI
1cbc0 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45  TE_IDXTYPE_APPDE
1cbd0 46 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  F ){.    sqlite3
1cbe0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1cbf0 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
1cc00 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
1cc10 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
1cc20 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
1cc30 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
1cc40 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f  ped", 0);.    go
1cc50 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
1cc60 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  ex;.  }.  iDb = 
1cc70 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
1cc80 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d  ndex(db, pIndex-
1cc90 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64  >pSchema);.#ifnd
1cca0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1ccb0 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
1ccc0 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20  .    int code = 
1ccd0 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45  SQLITE_DROP_INDE
1cce0 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  X;.    Table *pT
1ccf0 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
1cd00 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ble;.    const c
1cd10 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
1cd20 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
1cd30 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1cd40 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
1cd50 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28  LE(iDb);.    if(
1cd60 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1cd70 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1cd80 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
1cd90 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
1cda0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1cdb0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
1cdc0 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
1cdd0 20 26 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d   && iDb ) code =
1cde0 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
1cdf0 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
1ce00 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1ce10 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
1ce20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70  pIndex->zName, p
1ce30 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
1ce40 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
1ce50 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1ce60 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1ce70 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1ce80 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
1ce90 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f  he index and fro
1cea0 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
1ceb0 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  le */.  v = sqli
1cec0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1ced0 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
1cee0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1cef0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1cf00 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20  arse, 1, iDb);. 
1cf10 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
1cf20 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
1cf30 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
1cf40 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61  M %Q.%s WHERE na
1cf50 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27  me=%Q AND type='
1cf60 69 6e 64 65 78 27 22 2c 0a 20 20 20 20 20 20 20  index'",.       
1cf70 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
1cf80 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
1cf90 28 69 44 62 29 2c 20 70 49 6e 64 65 78 2d 3e 7a  (iDb), pIndex->z
1cfa0 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  Name.    );.    
1cfb0 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74  sqlite3ClearStat
1cfc0 54 61 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69  Tables(pParse, i
1cfd0 44 62 2c 20 22 69 64 78 22 2c 20 70 49 6e 64 65  Db, "idx", pInde
1cfe0 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  x->zName);.    s
1cff0 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
1d000 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
1d010 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
1d020 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e  Page(pParse, pIn
1d030 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  dex->tnum, iDb);
1d040 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d050 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f  AddOp4(v, OP_Dro
1d060 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20  pIndex, iDb, 0, 
1d070 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  0, pIndex->zName
1d080 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f  , 0);.  }..exit_
1d090 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71  drop_index:.  sq
1d0a0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1d0b0 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d  te(db, pName);.}
1d0c0 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69  ../*.** pArray i
1d0d0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
1d0e0 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  n array of objec
1d0f0 74 73 2e 20 45 61 63 68 20 6f 62 6a 65 63 74 20  ts. Each object 
1d100 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61 79 20  in the.** array 
1d110 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74 65 73  is szEntry bytes
1d120 20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73 20 72   in size. This r
1d130 6f 75 74 69 6e 65 20 75 73 65 73 20 73 71 6c 69  outine uses sqli
1d140 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a  te3DbRealloc().*
1d150 2a 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20  * to extend the 
1d160 61 72 72 61 79 20 73 6f 20 74 68 61 74 20 74 68  array so that th
1d170 65 72 65 20 69 73 20 73 70 61 63 65 20 66 6f 72  ere is space for
1d180 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 74   a new object at
1d190 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20   the end..**.** 
1d1a0 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
1d1b0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70  on is called, *p
1d1c0 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69 6e 73 20  nEntry contains 
1d1d0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
1d1e0 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72 72 61 79   of.** the array
1d1f0 20 28 69 6e 20 65 6e 74 72 69 65 73 20 2d 20 73   (in entries - s
1d200 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  o the allocation
1d210 20 69 73 20 28 28 2a 70 6e 45 6e 74 72 79 29 20   is ((*pnEntry) 
1d220 2a 20 73 7a 45 6e 74 72 79 29 20 62 79 74 65 73  * szEntry) bytes
1d230 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a  .** in total)..*
1d240 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 61 6c  *.** If the real
1d250 6c 6f 63 28 29 20 69 73 20 73 75 63 63 65 73 73  loc() is success
1d260 66 75 6c 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20  ful (i.e. if no 
1d270 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63  OOM condition oc
1d280 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70  curs), the.** sp
1d290 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f  ace allocated fo
1d2a0 72 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  r the new object
1d2b0 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45   is zeroed, *pnE
1d2c0 6e 74 72 79 20 75 70 64 61 74 65 64 20 74 6f 0a  ntry updated to.
1d2d0 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e  ** reflect the n
1d2e0 65 77 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  ew size of the a
1d2f0 72 72 61 79 20 61 6e 64 20 61 20 70 6f 69 6e 74  rray and a point
1d300 65 72 20 74 6f 20 74 68 65 20 6e 65 77 20 61 6c  er to the new al
1d310 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75  location.** retu
1d320 72 6e 65 64 2e 20 2a 70 49 64 78 20 69 73 20 73  rned. *pIdx is s
1d330 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
1d340 6f 66 20 74 68 65 20 6e 65 77 20 61 72 72 61 79  of the new array
1d350 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 63   entry in this c
1d360 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ase..**.** Other
1d370 77 69 73 65 2c 20 69 66 20 74 68 65 20 72 65 61  wise, if the rea
1d380 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c 20 2a 70  lloc() fails, *p
1d390 49 64 78 20 69 73 20 73 65 74 20 74 6f 20 2d 31  Idx is set to -1
1d3a0 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65 6d 61 69  , *pnEntry remai
1d3b0 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  ns.** unchanged 
1d3c0 61 6e 64 20 61 20 63 6f 70 79 20 6f 66 20 70 41  and a copy of pA
1d3d0 72 72 61 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a  rray returned..*
1d3e0 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41  /.void *sqlite3A
1d3f0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
1d400 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1d410 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1d420 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c  to notify of mal
1d430 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a  loc failures */.
1d440 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20    void *pArray, 
1d450 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
1d460 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20  objects.  Might 
1d470 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a  be reallocated *
1d480 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c  /.  int szEntry,
1d490 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1d4a0 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20   each object in 
1d4b0 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  the array */.  i
1d4c0 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20  nt *pnEntry,    
1d4d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62   /* Number of ob
1d4e0 6a 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20  jects currently 
1d4f0 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  in use */.  int 
1d500 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f 2a  *pIdx         /*
1d510 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65 78   Write the index
1d520 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20 68   of a new slot h
1d530 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ere */.){.  char
1d540 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a   *z;.  int n = *
1d550 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66 28 20 28  pnEntry;.  if( (
1d560 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b  n & (n-1))==0 ){
1d570 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e  .    int sz = (n
1d580 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a  ==0) ? 1 : 2*n;.
1d590 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d      void *pNew =
1d5a0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
1d5b0 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20 73 7a  c(db, pArray, sz
1d5c0 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69  *szEntry);.    i
1d5d0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1d5e0 20 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a      *pIdx = -1;.
1d5f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 72        return pAr
1d600 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ray;.    }.    p
1d610 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20  Array = pNew;.  
1d620 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 70  }.  z = (char*)p
1d630 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28  Array;.  memset(
1d640 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c  &z[n * szEntry],
1d650 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20   0, szEntry);.  
1d660 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a  *pIdx = n;.  ++*
1d670 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72  pnEntry;.  retur
1d680 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a  n pArray;.}../*.
1d690 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
1d6a0 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67  element to the g
1d6b0 69 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72  iven IdList.  Cr
1d6c0 65 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73  eate a new IdLis
1d6d0 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
1d6e0 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c  .**.** A new IdL
1d6f0 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ist is returned,
1d700 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c   or NULL if mall
1d710 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49  oc() fails..*/.I
1d720 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
1d730 4c 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74  ListAppend(sqlit
1d740 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a  e3 *db, IdList *
1d750 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
1d760 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  oken){.  int i;.
1d770 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1d780 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
1d790 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
1d7a0 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c  o(db, sizeof(IdL
1d7b0 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
1d7c0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1d7d0 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
1d7e0 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72  ->a = sqlite3Arr
1d7f0 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
1d800 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73    db,.      pLis
1d810 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65  t->a,.      size
1d820 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c  of(pList->a[0]),
1d830 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e  .      &pList->n
1d840 49 64 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29  Id,.      &i.  )
1d850 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20  ;.  if( i<0 ){. 
1d860 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
1d870 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
1d880 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1d890 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  .  }.  pList->a[
1d8a0 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
1d8b0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1d8c0 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72  db, pToken);.  r
1d8d0 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
1d8e0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
1d8f0 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
1d900 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
1d910 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
1d920 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b   IdList *pList){
1d930 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1d940 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1d950 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
1d960 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
1d970 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1d980 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
1d990 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
1d9a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1d9b0 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  db, pList->a);. 
1d9c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1d9d0 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
1d9e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
1d9f0 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66  ndex in pList of
1da00 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20   the identifier 
1da10 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75  named zId.  Retu
1da20 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20  rn -1.** if not 
1da30 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
1da40 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
1da50 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
1da60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1da70 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
1da80 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1da90 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69  turn -1;.  for(i
1daa0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
1dab0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1dac0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1dad0 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
1dae0 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65  , zName)==0 ) re
1daf0 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
1db00 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
1db10 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73 70 61  * Expand the spa
1db20 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
1db30 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
1db40 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20  st object by.** 
1db50 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61 20  creating nExtra 
1db60 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e  new slots beginn
1db70 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20 20  ing at iStart.  
1db80 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20 62  iStart is zero b
1db90 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f  ased..** New slo
1dba0 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  ts are zeroed..*
1dbb0 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
1dbc0 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72 63 4c  , suppose a SrcL
1dbd0 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f  ist initially co
1dbe0 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72 69  ntains two entri
1dbf0 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61  es: A,B..** To a
1dc00 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74 72  ppend 3 new entr
1dc10 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ies onto the end
1dc20 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  , do this:.**.**
1dc30 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
1dc40 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
1dc50 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a  rclist, 3, 2);.*
1dc60 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 63  *.** After the c
1dc70 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f 75  all above it wou
1dc80 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20  ld contain:  A, 
1dc90 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c  B, nil, nil, nil
1dca0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74 61  ..** If the iSta
1dcb0 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64 20  rt argument had 
1dcc0 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20 6f  been 1 instead o
1dcd0 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72 65  f 2, then the re
1dce0 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61  sult.** would ha
1dcf0 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c  ve been:  A, nil
1dd00 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20  , nil, nil, B.  
1dd10 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20 6e  To prepend the n
1dd20 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65  ew slots,.** the
1dd30 20 69 53 74 61 72 74 20 76 61 6c 75 65 20 77 6f   iStart value wo
1dd40 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 72  uld be 0.  The r
1dd50 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64  esult then would
1dd60 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c  .** be: nil, nil
1dd70 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a  , nil, A, B..**.
1dd80 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
1dd90 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 20  llocation fails 
1dda0 74 68 65 20 53 72 63 4c 69 73 74 20 69 73 20 75  the SrcList is u
1ddb0 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a  nchanged.  The.*
1ddc0 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  * db->mallocFail
1ddd0 65 64 20 66 6c 61 67 20 77 69 6c 6c 20 62 65 20  ed flag will be 
1dde0 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a  set to true..*/.
1ddf0 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
1de00 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a  SrcListEnlarge(.
1de10 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
1de20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1de30 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e   connection to n
1de40 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72  otify of OOM err
1de50 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ors */.  SrcList
1de60 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54   *pSrc,     /* T
1de70 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65  he SrcList to be
1de80 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69   enlarged */.  i
1de90 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
1dea0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
1deb0 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20  ew slots to add 
1dec0 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a  to pSrc->a[] */.
1ded0 20 20 69 6e 74 20 69 53 74 61 72 74 20 20 20 20    int iStart    
1dee0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
1def0 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69   pSrc->a[] of fi
1df00 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a  rst new slot */.
1df10 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  ){.  int i;..  /
1df20 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
1df30 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72  g on calling par
1df40 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73  ameters */.  ass
1df50 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29  ert( iStart>=0 )
1df60 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 74  ;.  assert( nExt
1df70 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ra>=1 );.  asser
1df80 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20 20  t( pSrc!=0 );.  
1df90 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c 3d  assert( iStart<=
1dfa0 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20  pSrc->nSrc );.. 
1dfb0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64 64   /* Allocate add
1dfc0 69 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69 66  itional space if
1dfd0 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28   needed */.  if(
1dfe0 20 28 75 33 32 29 70 53 72 63 2d 3e 6e 53 72 63   (u32)pSrc->nSrc
1dff0 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41  +nExtra>pSrc->nA
1e000 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c  lloc ){.    SrcL
1e010 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  ist *pNew;.    i
1e020 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63  nt nAlloc = pSrc
1e030 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20  ->nSrc+nExtra;. 
1e040 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20     int nGot;.   
1e050 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
1e060 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72  bRealloc(db, pSr
1e070 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c,.             
1e080 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20    sizeof(*pSrc) 
1e090 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a  + (nAlloc-1)*siz
1e0a0 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20  eof(pSrc->a[0]) 
1e0b0 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
1e0c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1e0d0 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
1e0e0 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
1e0f0 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d  turn pSrc;.    }
1e100 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77  .    pSrc = pNew
1e110 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71  ;.    nGot = (sq
1e120 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
1e130 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69  e(db, pNew) - si
1e140 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a  zeof(*pSrc))/siz
1e150 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b  eof(pSrc->a[0])+
1e160 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c  1;.    pSrc->nAl
1e170 6c 6f 63 20 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a  loc = nGot;.  }.
1e180 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74  .  /* Move exist
1e190 69 6e 67 20 73 6c 6f 74 73 20 74 68 61 74 20 63  ing slots that c
1e1a0 6f 6d 65 20 61 66 74 65 72 20 74 68 65 20 6e 65  ome after the ne
1e1b0 77 6c 79 20 69 6e 73 65 72 74 65 64 20 73 6c 6f  wly inserted slo
1e1c0 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74  ts.  ** out of t
1e1d0 68 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28  he way */.  for(
1e1e0 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20  i=pSrc->nSrc-1; 
1e1f0 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b  i>=iStart; i--){
1e200 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e  .    pSrc->a[i+n
1e210 45 78 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61  Extra] = pSrc->a
1e220 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d  [i];.  }.  pSrc-
1e230 3e 6e 53 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b  >nSrc += nExtra;
1e240 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
1e250 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
1e260 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65  slots */.  memse
1e270 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72  t(&pSrc->a[iStar
1e280 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  t], 0, sizeof(pS
1e290 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61  rc->a[0])*nExtra
1e2a0 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72  );.  for(i=iStar
1e2b0 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74  t; i<iStart+nExt
1e2c0 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53  ra; i++){.    pS
1e2d0 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
1e2e0 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
1e2f0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1e300 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65  r to the enlarge
1e310 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72  d SrcList */.  r
1e320 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a  eturn pSrc;.}...
1e330 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
1e340 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  ew table name to
1e350 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
1e360 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
1e370 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20  w SrcList if.** 
1e380 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20  need be.  A new 
1e390 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64  entry is created
1e3a0 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
1e3b0 65 76 65 6e 20 69 66 20 70 54 61 62 6c 65 20 69  even if pTable i
1e3c0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20  s NULL..**.** A 
1e3d0 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72  SrcList is retur
1e3e0 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
1e3f0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20  there is an OOM 
1e400 65 72 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75  error.  The retu
1e410 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20  rned.** SrcList 
1e420 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d  might be the sam
1e430 65 20 61 73 20 74 68 65 20 53 72 63 4c 69 73 74  e as the SrcList
1e440 20 74 68 61 74 20 77 61 73 20 69 6e 70 75 74 20   that was input 
1e450 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a  or it might be.*
1e460 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66  * a new one.  If
1e470 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f   an OOM error do
1e480 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  es occurs, then 
1e490 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20  the prior value 
1e4a0 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74  of pList.** that
1e4b0 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69   is input to thi
1e4c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74  s routine is aut
1e4d0 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64  omatically freed
1e4e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61  ..**.** If pData
1e4f0 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  base is not null
1e500 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1e510 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
1e520 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74   optional.** dat
1e530 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69  abase name prefi
1e540 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20  x.  Like this:  
1e550 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22  "database.table"
1e560 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65  .  The pDatabase
1e570 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
1e580 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
1e590 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e   the pTable poin
1e5a0 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ts to the databa
1e5b0 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20  se name..** The 
1e5c0 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  SrcList.a[].zNam
1e5d0 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65  e field is fille
1e5e0 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
1e5f0 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68   name which migh
1e600 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70  t.** come from p
1e610 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62  Table (if pDatab
1e620 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20  ase is NULL) or 
1e630 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20  from pDatabase. 
1e640 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d   .** SrcList.a[]
1e650 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69  .zDatabase is fi
1e660 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
1e670 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d  tabase name from
1e680 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77   pTable,.** or w
1e690 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64  ith NULL if no d
1e6a0 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69  atabase is speci
1e6b0 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  fied..**.** In o
1e6c0 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63  ther words, if c
1e6d0 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  all like this:.*
1e6e0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
1e6f0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1e700 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a  d(D,A,B,0);.**.*
1e710 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61  * Then B is a ta
1e720 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
1e730 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
1e740 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20  s unspecified.  
1e750 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b  If called.** lik
1e760 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
1e770 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
1e780 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42  ListAppend(D,A,B
1e790 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,C);.**.** Then 
1e7a0 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  C is the table n
1e7b0 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65  ame and B is the
1e7c0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20   database name. 
1e7d0 20 49 66 20 43 20 69 73 20 64 65 66 69 6e 65 64   If C is defined
1e7e0 0a 2a 2a 20 74 68 65 6e 20 73 6f 20 69 73 20 42  .** then so is B
1e7f0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
1e800 73 2c 20 77 65 20 6e 65 76 65 72 20 68 61 76 65  s, we never have
1e810 20 61 20 63 61 73 65 20 77 68 65 72 65 3a 0a 2a   a case where:.*
1e820 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
1e830 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1e840 64 28 44 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a  d(D,A,0,C);.**.*
1e850 2a 20 42 6f 74 68 20 70 54 61 62 6c 65 20 61 6e  * Both pTable an
1e860 64 20 70 44 61 74 61 62 61 73 65 20 61 72 65 20  d pDatabase are 
1e870 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20 71 75  assumed to be qu
1e880 6f 74 65 64 2e 20 20 54 68 65 79 20 61 72 65 20  oted.  They are 
1e890 64 65 71 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f  dequoted.** befo
1e8a0 72 65 20 62 65 69 6e 67 20 61 64 64 65 64 20 74  re being added t
1e8b0 6f 20 74 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a  o the SrcList..*
1e8c0 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
1e8d0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1e8e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1e8f0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
1e900 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
1e910 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  f malloc failure
1e920 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  s */.  SrcList *
1e930 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70  pList,     /* Ap
1e940 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63  pend to this Src
1e950 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74  List. NULL creat
1e960 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  es a new SrcList
1e970 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
1e980 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62  ble,      /* Tab
1e990 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a  le to append */.
1e9a0 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61    Token *pDataba
1e9b0 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  se    /* Databas
1e9c0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  e of the table *
1e9d0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
1e9e0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
1e9f0 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 61  m;.  assert( pDa
1ea00 74 61 62 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61  tabase==0 || pTa
1ea10 62 6c 65 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61  ble!=0 );  /* Ca
1ea20 6e 6e 6f 74 20 68 61 76 65 20 43 20 77 69 74 68  nnot have C with
1ea30 6f 75 74 20 42 20 2a 2f 0a 20 20 69 66 28 20 70  out B */.  if( p
1ea40 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
1ea50 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
1ea60 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
1ea70 69 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29  izeof(SrcList) )
1ea80 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
1ea90 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1eaa0 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
1eab0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 69 73   = 1;.  }.  pLis
1eac0 74 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  t = sqlite3SrcLi
1ead0 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c  stEnlarge(db, pL
1eae0 69 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e  ist, 1, pList->n
1eaf0 53 72 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  Src);.  if( db->
1eb00 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
1eb10 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
1eb20 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69  stDelete(db, pLi
1eb30 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  st);.    return 
1eb40 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d  0;.  }.  pItem =
1eb50 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
1eb60 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28  ->nSrc-1];.  if(
1eb70 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44   pDatabase && pD
1eb80 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b  atabase->z==0 ){
1eb90 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
1eba0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44   0;.  }.  if( pD
1ebb0 61 74 61 62 61 73 65 20 29 7b 0a 20 20 20 20 54  atabase ){.    T
1ebc0 6f 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44  oken *pTemp = pD
1ebd0 61 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61  atabase;.    pDa
1ebe0 74 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b  tabase = pTable;
1ebf0 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54  .    pTable = pT
1ec00 65 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  emp;.  }.  pItem
1ec10 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
1ec20 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1ec30 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 70 49  b, pTable);.  pI
1ec40 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
1ec50 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1ec60 54 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62  Token(db, pDatab
1ec70 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ase);.  return p
1ec80 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  List;.}../*.** A
1ec90 73 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72  ssign VdbeCursor
1eca0 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74   index numbers t
1ecb0 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  o all tables in 
1ecc0 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69  a SrcList.*/.voi
1ecd0 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
1ece0 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61  AssignCursors(Pa
1ecf0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
1ed00 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1ed10 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1ed20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1ed30 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c  tem;.  assert(pL
1ed40 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ist || pParse->d
1ed50 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1ed60 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
1ed70 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  {.    for(i=0, p
1ed80 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
1ed90 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
1eda0 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1edb0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43     if( pItem->iC
1edc0 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b  ursor>=0 ) break
1edd0 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69  ;.      pItem->i
1ede0 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
1edf0 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69  >nTab++;.      i
1ee00 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
1ee10 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1ee20 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
1ee30 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
1ee40 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d   pItem->pSelect-
1ee50 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  >pSrc);.      }.
1ee60 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1ee70 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
1ee80 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
1ee90 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
1eea0 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
1eeb0 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
1eec0 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
1eed0 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
1eee0 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
1eef0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1ef00 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1ef10 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1ef20 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74  eturn;.  for(pIt
1ef30 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
1ef40 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b  ; i<pList->nSrc;
1ef50 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
1ef60 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1ef70 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61  e(db, pItem->zDa
1ef80 74 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c  tabase);.    sql
1ef90 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
1efa0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
1efb0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1efc0 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  db, pItem->zAlia
1efd0 73 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65  s);.    if( pIte
1efe0 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
1eff0 79 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  y ) sqlite3DbFre
1f000 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e  e(db, pItem->u1.
1f010 7a 49 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20  zIndexedBy);.   
1f020 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
1f030 73 54 61 62 46 75 6e 63 20 29 20 73 71 6c 69 74  sTabFunc ) sqlit
1f040 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
1f050 28 64 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70  (db, pItem->u1.p
1f060 46 75 6e 63 41 72 67 29 3b 0a 20 20 20 20 73 71  FuncArg);.    sq
1f070 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
1f080 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62  (db, pItem->pTab
1f090 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
1f0a0 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1f0b0 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
1f0c0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
1f0d0 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
1f0e0 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74  >pOn);.    sqlit
1f0f0 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1f100 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  b, pItem->pUsing
1f110 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1f120 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
1f130 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1f140 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1f150 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
1f160 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65   to add a new te
1f170 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  rm to the.** end
1f180 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52   of a growing FR
1f190 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20  OM clause.  The 
1f1a0 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  "p" parameter is
1f1b0 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20   the part of.** 
1f1c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1f1d0 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79  that has already
1f1e0 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65   been constructe
1f1f0 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a  d.  "p" is NULL.
1f200 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ** if this is th
1f210 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20  e first term of 
1f220 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
1f230 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61    pTable and pDa
1f240 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68  tabase.** are th
1f250 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
1f260 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73 65  ble and database
1f270 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52   named in the FR
1f280 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a  OM clause term..
1f290 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73 20  ** pDatabase is 
1f2a0 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61  NULL if the data
1f2b0 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66  base name qualif
1f2c0 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d  ier is missing -
1f2d0 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61   the.** usual ca
1f2e0 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d  se.  If the term
1f2f0 20 68 61 73 20 61 6e 20 61 6c 69 61 73 2c 20 74   has an alias, t
1f300 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74  hen pAlias point
1f310 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61  s to the.** alia
1f320 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65  s token.  If the
1f330 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71 75   term is a subqu
1f340 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75  ery, then pSubqu
1f350 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45  ery is the.** SE
1f360 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
1f370 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79  hat the subquery
1f380 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70   encodes.  The p
1f390 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61  Table and.** pDa
1f3a0 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72  tabase parameter
1f3b0 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73  s are NULL for s
1f3c0 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20  ubqueries.  The 
1f3d0 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a  pOn and pUsing.*
1f3e0 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  * parameters are
1f3f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1f400 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
1f410 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
1f420 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63  Return a new Src
1f430 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64  List which encod
1f440 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77  es is the FROM w
1f450 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74  ith the new.** t
1f460 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72  erm added..*/.Sr
1f470 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
1f480 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
1f490 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
1f4a0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
1f4b0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
1f4c0 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
1f4d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1f4e0 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74 20  * The left part 
1f4f0 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
1f500 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20  se already seen 
1f510 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
1f520 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
1f530 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
1f540 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  e to add to the 
1f550 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
1f560 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
1f570 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  e,       /* Name
1f580 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f590 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62   containing pTab
1f5a0 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
1f5b0 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20 20  Alias,          
1f5c0 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  /* The right-han
1f5d0 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41 53  d side of the AS
1f5e0 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a   subexpression *
1f5f0 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
1f600 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41  query,      /* A
1f610 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20 69   subquery used i
1f620 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62  n place of a tab
1f630 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70  le name */.  Exp
1f640 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20  r *pOn,         
1f650 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63       /* The ON c
1f660 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
1f670 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73  */.  IdList *pUs
1f680 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ing          /* 
1f690 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  The USING clause
1f6a0 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b   of a join */.){
1f6b0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1f6c0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1f6d0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1f6e0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
1f6f0 20 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70   !p && (pOn || p
1f700 55 73 69 6e 67 29 20 29 7b 0a 20 20 20 20 73 71  Using) ){.    sq
1f710 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1f720 61 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c  arse, "a JOIN cl
1f730 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64  ause is required
1f740 20 62 65 66 6f 72 65 20 25 73 22 2c 20 0a 20 20   before %s", .  
1f750 20 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20      (pOn ? "ON" 
1f760 3a 20 22 55 53 49 4e 47 22 29 0a 20 20 20 20 29  : "USING").    )
1f770 3b 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e  ;.    goto appen
1f780 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20  d_from_error;.  
1f790 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53  }.  p = sqlite3S
1f7a0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c  rcListAppend(db,
1f7b0 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74   p, pTable, pDat
1f7c0 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d  abase);.  if( p=
1f7d0 3d 30 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e  =0 || NEVER(p->n
1f7e0 53 72 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 67  Src==0) ){.    g
1f7f0 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f  oto append_from_
1f800 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 49 74  error;.  }.  pIt
1f810 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53  em = &p->a[p->nS
1f820 72 63 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  rc-1];.  assert(
1f830 20 70 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20   pAlias!=0 );.  
1f840 69 66 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b  if( pAlias->n ){
1f850 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  .    pItem->zAli
1f860 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  as = sqlite3Name
1f870 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41  FromToken(db, pA
1f880 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74  lias);.  }.  pIt
1f890 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53  em->pSelect = pS
1f8a0 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d  ubquery;.  pItem
1f8b0 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70  ->pOn = pOn;.  p
1f8c0 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70  Item->pUsing = p
1f8d0 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20  Using;.  return 
1f8e0 70 3b 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d  p;.. append_from
1f8f0 5f 65 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74  _error:.  assert
1f900 28 20 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( p==0 );.  sqli
1f910 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1f920 2c 20 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65  , pOn);.  sqlite
1f930 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62  3IdListDelete(db
1f940 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c  , pUsing);.  sql
1f950 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1f960 28 64 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b  (db, pSubquery);
1f970 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1f980 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44  /*.** Add an IND
1f990 45 58 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49  EXED BY or NOT I
1f9a0 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f  NDEXED clause to
1f9b0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
1f9c0 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65  ly added .** ele
1f9d0 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72  ment of the sour
1f9e0 63 65 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61  ce-list passed a
1f9f0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
1fa00 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
1fa10 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64  qlite3SrcListInd
1fa20 65 78 65 64 42 79 28 50 61 72 73 65 20 2a 70 50  exedBy(Parse *pP
1fa30 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
1fa40 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65  , Token *pIndexe
1fa50 64 42 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20  dBy){.  assert( 
1fa60 70 49 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b  pIndexedBy!=0 );
1fa70 0a 20 20 69 66 28 20 70 20 26 26 20 41 4c 57 41  .  if( p && ALWA
1fa80 59 53 28 70 2d 3e 6e 53 72 63 3e 30 29 20 29 7b  YS(p->nSrc>0) ){
1fa90 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
1faa0 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
1fab0 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
1fac0 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
1fad0 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64  pItem->fg.notInd
1fae0 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  exed==0 );.    a
1faf0 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
1fb00 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20  .isIndexedBy==0 
1fb10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1fb20 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
1fb30 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  nc==0 );.    if(
1fb40 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d   pIndexedBy->n==
1fb50 31 20 26 26 20 21 70 49 6e 64 65 78 65 64 42 79  1 && !pIndexedBy
1fb60 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ->z ){.      /* 
1fb70 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20  A "NOT INDEXED" 
1fb80 63 6c 61 75 73 65 20 77 61 73 20 73 75 70 70 6c  clause was suppl
1fb90 69 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79  ied. See parse.y
1fba0 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74   .      ** const
1fbb0 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70  ruct "indexed_op
1fbc0 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  t" for details. 
1fbd0 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  */.      pItem->
1fbe0 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20  fg.notIndexed = 
1fbf0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
1fc00 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49      pItem->u1.zI
1fc10 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74  ndexedBy = sqlit
1fc20 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1fc30 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64  pParse->db, pInd
1fc40 65 78 65 64 42 79 29 3b 0a 20 20 20 20 20 20 70  exedBy);.      p
1fc50 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78  Item->fg.isIndex
1fc60 65 64 42 79 20 3d 20 28 70 49 74 65 6d 2d 3e 75  edBy = (pItem->u
1fc70 31 2e 7a 49 6e 64 65 78 65 64 42 79 21 3d 30 29  1.zIndexedBy!=0)
1fc80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
1fc90 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 6c 69 73  *.** Add the lis
1fca0 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20 61 72  t of function ar
1fcb0 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 53  guments to the S
1fcc0 72 63 4c 69 73 74 20 65 6e 74 72 79 20 66 6f 72  rcList entry for
1fcd0 20 61 0a 2a 2a 20 74 61 62 6c 65 2d 76 61 6c 75   a.** table-valu
1fce0 65 64 2d 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ed-function..*/.
1fcf0 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
1fd00 69 73 74 46 75 6e 63 41 72 67 73 28 50 61 72 73  istFuncArgs(Pars
1fd10 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
1fd20 73 74 20 2a 70 2c 20 45 78 70 72 4c 69 73 74 20  st *p, ExprList 
1fd30 2a 70 4c 69 73 74 29 7b 0a 20 20 69 66 28 20 70  *pList){.  if( p
1fd40 20 26 26 20 70 4c 69 73 74 20 29 7b 0a 20 20 20   && pList ){.   
1fd50 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1fd60 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
1fd70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  ->a[p->nSrc-1];.
1fd80 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1fd90 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64  m->fg.notIndexed
1fda0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
1fdb0 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49  t( pItem->fg.isI
1fdc0 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20  ndexedBy==0 );. 
1fdd0 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d     assert( pItem
1fde0 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d  ->fg.isTabFunc==
1fdf0 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  0 );.    pItem->
1fe00 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4c  u1.pFuncArg = pL
1fe10 69 73 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  ist;.    pItem->
1fe20 66 67 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 31  fg.isTabFunc = 1
1fe30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1fe40 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
1fe50 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
1fe60 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a   pList);.  }.}..
1fe70 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64  /*.** When build
1fe80 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c  ing up a FROM cl
1fe90 61 75 73 65 20 69 6e 20 74 68 65 20 70 61 72 73  ause in the pars
1fea0 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65  er, the join ope
1feb0 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74  rator.** is init
1fec0 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74  ially attached t
1fed0 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61  o the left opera
1fee0 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64  nd.  But the cod
1fef0 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65  e generator.** e
1ff00 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20  xpects the join 
1ff10 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f  operator to be o
1ff20 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  n the right oper
1ff30 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  and.  This routi
1ff40 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c  ne.** Shifts all
1ff50 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20   join operators 
1ff60 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67  from left to rig
1ff70 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65  ht for an entire
1ff80 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e   FROM.** clause.
1ff90 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20  .**.** Example: 
1ffa0 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e  Suppose the join
1ffb0 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a   is like this:.*
1ffc0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41  *.**           A
1ffd0 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a   natural cross j
1ffe0 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oin B.**.** The 
1fff0 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74  operator is "nat
20000 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22  ural cross join"
20010 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f  .  The A and B o
20020 70 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72  perands are stor
20030 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d  ed.** in p->a[0]
20040 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65   and p->a[1], re
20050 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65  spectively.  The
20060 20 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c   parser initiall
20070 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20  y stores the.** 
20080 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e  operator with A.
20090 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
200a0 68 69 66 74 73 20 74 68 61 74 20 6f 70 65 72 61  hifts that opera
200b0 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a  tor over to B..*
200c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
200d0 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79  cListShiftJoinTy
200e0 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a  pe(SrcList *p){.
200f0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
20100 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
20110 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20  p->nSrc-1; i>0; 
20120 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  i--){.      p->a
20130 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20  [i].fg.jointype 
20140 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a  = p->a[i-1].fg.j
20150 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20  ointype;.    }. 
20160 20 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f     p->a[0].fg.jo
20170 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a  intype = 0;.  }.
20180 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61  }../*.** Begin a
20190 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
201a0 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
201b0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  nTransaction(Par
201c0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
201d0 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  type){.  sqlite3
201e0 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
201f0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73  .  int i;..  ass
20200 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29  ert( pParse!=0 )
20210 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
20220 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
20230 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28 20  b!=0 );./*  if( 
20240 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d  db->aDb[0].pBt==
20250 30 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a 20  0 ) return; */. 
20260 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
20270 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
20280 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
20290 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29  , "BEGIN", 0, 0)
202a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
202b0 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65    }.  v = sqlite
202c0 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
202d0 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74  ;.  if( !v ) ret
202e0 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21  urn;.  if( type!
202f0 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a  =TK_DEFERRED ){.
20300 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
20310 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
20320 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
20330 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e  ddOp2(v, OP_Tran
20340 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70  saction, i, (typ
20350 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29  e==TK_EXCLUSIVE)
20360 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1);.      sqlit
20370 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
20380 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  v, i);.    }.  }
20390 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
203a0 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
203b0 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a  ommit, 0, 0);.}.
203c0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
203d0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76  transaction.*/.v
203e0 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
203f0 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  tTransaction(Par
20400 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
20410 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72  dbe *v;..  asser
20420 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
20430 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
20440 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ->db!=0 );.  if(
20450 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
20460 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
20470 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43  _TRANSACTION, "C
20480 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 7b  OMMIT", 0, 0) ){
20490 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
204a0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
204b0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
204c0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
204d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
204e0 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
204f0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 0);.  }.}..
20500 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
20510 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
20520 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
20530 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
20540 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
20550 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73    Vdbe *v;..  as
20560 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
20570 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
20580 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20  rse->db!=0 );.  
20590 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
205a0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
205b0 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
205c0 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20   "ROLLBACK", 0, 
205d0 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
205e0 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69  ;.  }.  v = sqli
205f0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
20600 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
20610 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20620 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43  dOp2(v, OP_AutoC
20630 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20  ommit, 1, 1);.  
20640 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
20650 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
20660 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
20670 20 77 68 65 6e 20 69 74 20 70 61 72 73 65 73 20   when it parses 
20680 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65  a command to cre
20690 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20  ate,.** release 
206a0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53  or rollback an S
206b0 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a  QL savepoint. .*
206c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 61  /.void sqlite3Sa
206d0 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a 70  vepoint(Parse *p
206e0 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54  Parse, int op, T
206f0 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
20700 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71  char *zName = sq
20710 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
20720 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
20730 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
20740 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  me ){.    Vdbe *
20750 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
20760 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e  be(pParse);.#ifn
20770 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20780 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
20790 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
207a0 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d  har * const az[]
207b0 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52   = { "BEGIN", "R
207c0 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41  ELEASE", "ROLLBA
207d0 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72  CK" };.    asser
207e0 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45  t( !SAVEPOINT_BE
207f0 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54  GIN && SAVEPOINT
20800 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53  _RELEASE==1 && S
20810 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
20820 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20  K==2 );.#endif. 
20830 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c     if( !v || sql
20840 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
20850 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56  arse, SQLITE_SAV
20860 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20  EPOINT, az[op], 
20870 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20  zName, 0) ){.   
20880 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
20890 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
208a0 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
208b0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  n;.    }.    sql
208c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
208d0 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20  , OP_Savepoint, 
208e0 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c  op, 0, 0, zName,
208f0 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
20900 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
20910 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  sure the TEMP da
20920 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61  tabase is open a
20930 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  nd available for
20940 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a   use.  Return.**
20950 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
20960 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e  rrors.  Leave an
20970 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
20980 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
20990 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
209a0 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
209b0 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a  Database(Parse *
209c0 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
209d0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
209e0 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61  >db;.  if( db->a
209f0 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20  Db[1].pBt==0 && 
20a00 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
20a10 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
20a20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a      Btree *pBt;.
20a30 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
20a40 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20   int flags = .  
20a50 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
20a60 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a  PEN_READWRITE |.
20a70 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
20a80 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
20a90 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
20aa0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
20ab0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
20ac0 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
20ad0 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
20ae0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
20af0 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20  P_DB;..    rc = 
20b00 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
20b10 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62  (db->pVfs, 0, db
20b20 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61 67 73  , &pBt, 0, flags
20b30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
20b40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20b50 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
20b60 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
20b70 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  e to open a temp
20b80 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22  orary database "
20b90 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66  .        "file f
20ba0 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f  or storing tempo
20bb0 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20  rary tables");. 
20bc0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
20bd0 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
20be0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
20bf0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d  db->aDb[1].pBt =
20c00 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74   pBt;.    assert
20c10 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ( db->aDb[1].pSc
20c20 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20  hema );.    if( 
20c30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71  SQLITE_NOMEM==sq
20c40 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
20c50 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e  eSize(pBt, db->n
20c60 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c  extPagesize, -1,
20c70 20 30 29 20 29 7b 0a 20 20 20 20 20 20 64 62 2d   0) ){.      db-
20c80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
20c90 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
20ca0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
20cb0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
20cc0 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61 63  * Record the fac
20cd0 74 20 74 68 61 74 20 74 68 65 20 73 63 68 65 6d  t that the schem
20ce0 61 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e 65  a cookie will ne
20cf0 65 64 20 74 6f 20 62 65 20 76 65 72 69 66 69 65  ed to be verifie
20d00 64 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62 61 73  d.** for databas
20d10 65 20 69 44 62 2e 20 20 54 68 65 20 63 6f 64 65  e iDb.  The code
20d20 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 76 65 72   to actually ver
20d30 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63  ify the schema c
20d40 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f 63  ookie.** will oc
20d50 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 20 6f  cur at the end o
20d60 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20  f the top-level 
20d70 56 44 42 45 20 61 6e 64 20 77 69 6c 6c 20 62 65  VDBE and will be
20d80 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 6c 61   generated.** la
20d90 74 65 72 2c 20 62 79 20 73 71 6c 69 74 65 33 46  ter, by sqlite3F
20da0 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a  inishCoding()..*
20db0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f  /.void sqlite3Co
20dc0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50  deVerifySchema(P
20dd0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
20de0 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20  t iDb){.  Parse 
20df0 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
20e00 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
20e10 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  l(pParse);.  sql
20e20 69 74 65 33 20 2a 64 62 20 3d 20 70 54 6f 70 6c  ite3 *db = pTopl
20e30 65 76 65 6c 2d 3e 64 62 3b 0a 0a 20 20 61 73 73  evel->db;..  ass
20e40 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
20e50 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
20e60 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
20e70 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69  iDb].pBt!=0 || i
20e80 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  Db==1 );.  asser
20e90 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41  t( iDb<SQLITE_MA
20ea0 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a  X_ATTACHED+2 );.
20eb0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20ec0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
20ed0 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a  (db, iDb, 0) );.
20ee0 20 20 69 66 28 20 44 62 4d 61 73 6b 54 65 73 74    if( DbMaskTest
20ef0 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b  (pToplevel->cook
20f00 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20  ieMask, iDb)==0 
20f10 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74  ){.    DbMaskSet
20f20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f 6b  (pToplevel->cook
20f30 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20  ieMask, iDb);.  
20f40 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f    pToplevel->coo
20f50 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20  kieValue[iDb] = 
20f60 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
20f70 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
20f80 6b 69 65 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d  kie;.    if( !OM
20f90 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
20fa0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==1 ){.      sql
20fb0 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61  ite3OpenTempData
20fc0 62 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29 3b  base(pToplevel);
20fd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
20fe0 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
20ff0 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  zDb is NULL, the
21000 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f  n call sqlite3Co
21010 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 29  deVerifySchema()
21020 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61 74   for each .** at
21030 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 2e  tached database.
21040 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 76 6f   Otherwise, invo
21050 6b 65 20 69 74 20 66 6f 72 20 74 68 65 20 64 61  ke it for the da
21060 74 61 62 61 73 65 20 6e 61 6d 65 64 20 7a 44 62  tabase named zDb
21070 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73   only..*/.void s
21080 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
21090 4e 61 6d 65 64 53 63 68 65 6d 61 28 50 61 72 73  NamedSchema(Pars
210a0 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
210b0 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 73   char *zDb){.  s
210c0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
210d0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
210e0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
210f0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
21100 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
21110 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
21120 20 70 44 62 2d 3e 70 42 74 20 26 26 20 28 21 7a   pDb->pBt && (!z
21130 44 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33  Db || 0==sqlite3
21140 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 70 44 62  StrICmp(zDb, pDb
21150 2d 3e 7a 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20  ->zName)) ){.   
21160 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
21170 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
21180 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, i);.    }.  }
21190 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
211a0 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
211b0 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64  t prepares for d
211c0 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  oing an operatio
211d0 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20  n that.** might 
211e0 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62  change the datab
211f0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ase..**.** This 
21200 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61  routine starts a
21210 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
21220 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61   if we are not a
21230 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a  lready within.**
21240 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
21250 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61   If we are alrea
21260 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e  dy within a tran
21270 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20  saction, then a 
21280 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73  checkpoint.** is
21290 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53   set if the setS
212a0 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74  tatement paramet
212b0 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63  er is true.  A c
212c0 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
212d0 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f  .** be set for o
212e0 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d  perations that m
212f0 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74  ight fail (due t
21300 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20  o a constraint) 
21310 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77  part of.** the w
21320 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77  ay through and w
21330 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74  hich will need t
21340 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74  o undo some writ
21350 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  es without havin
21360 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  g to.** rollback
21370 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73   the whole trans
21380 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65  action.  For ope
21390 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c  rations where al
213a0 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  l constraints.**
213b0 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20   can be checked 
213c0 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
213d0 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
213e0 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
213f0 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65  is never.** nece
21400 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20  ssary to undo a 
21410 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68  write and the ch
21420 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20  eckpoint should 
21430 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76  not be set..*/.v
21440 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e  oid sqlite3Begin
21450 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50  WriteOperation(P
21460 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
21470 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20  t setStatement, 
21480 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73  int iDb){.  Pars
21490 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73  e *pToplevel = s
214a0 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65  qlite3ParseTople
214b0 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73  vel(pParse);.  s
214c0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
214d0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
214e0 44 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74  Db);.  DbMaskSet
214f0 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74  (pToplevel->writ
21500 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70  eMask, iDb);.  p
21510 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74  Toplevel->isMult
21520 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53 74 61  iWrite |= setSta
21530 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tement;.}../*.**
21540 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   Indicate that t
21550 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75 72  he statement cur
21560 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
21570 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68 74 20  struction might 
21580 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68  write.** more th
21590 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28 65 78  an one entry (ex
215a0 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20  ample: deleting 
215b0 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69 6e 73  one row then ins
215c0 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a  erting another,.
215d0 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c  ** inserting mul
215e0 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20 61 20  tiple rows in a 
215f0 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74  table, or insert
21600 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20 69 6e  ing a row and in
21610 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a  dex entries.).**
21620 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f 63 63   If an abort occ
21630 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65 20 6f  urs after some o
21640 66 20 74 68 65 73 65 20 77 72 69 74 65 73 20 68  f these writes h
21650 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74  ave completed, t
21660 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62  hen it will.** b
21670 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75  e necessary to u
21680 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ndo the complete
21690 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69  d writes..*/.voi
216a0 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57 72  d sqlite3MultiWr
216b0 69 74 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ite(Parse *pPars
216c0 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  e){.  Parse *pTo
216d0 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
216e0 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
216f0 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76  arse);.  pToplev
21700 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  el->isMultiWrite
21710 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20   = 1;.}../* .** 
21720 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  The code generat
21730 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  or calls this ro
21740 75 74 69 6e 65 20 69 66 20 69 73 20 64 69 73 63  utine if is disc
21750 6f 76 65 72 73 20 74 68 61 74 20 69 74 20 69 73  overs that it is
21760 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  .** possible to 
21770 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d 65 6e  abort a statemen
21780 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c  t prior to compl
21790 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72  etion.  In order
217a0 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20   to .** perform 
217b0 74 68 69 73 20 61 62 6f 72 74 20 77 69 74 68 6f  this abort witho
217c0 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68  ut corrupting th
217d0 65 20 64 61 74 61 62 61 73 65 2c 20 77 65 20 6e  e database, we n
217e0 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73  eed to make.** s
217f0 75 72 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ure that the sta
21800 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74 65 63  tement is protec
21810 74 65 64 20 62 79 20 61 20 73 74 61 74 65 6d 65  ted by a stateme
21820 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
21830 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c  **.** Technicall
21840 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20  y, we only need 
21850 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79 41 62  to set the mayAb
21860 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68 65 0a  ort flag if the.
21870 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74 65 20  ** isMultiWrite 
21880 66 6c 61 67 20 77 61 73 20 70 72 65 76 69 6f 75  flag was previou
21890 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72 65 20  sly set.  There 
218a0 69 73 20 61 20 74 69 6d 65 20 64 65 70 65 6e 64  is a time depend
218b0 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74 68 61  ency.** such tha
218c0 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75 73 74  t the abort must
218d0 20 6f 63 63 75 72 20 61 66 74 65 72 20 74 68 65   occur after the
218e0 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20 54 68   multiwrite.  Th
218f0 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65  is makes.** some
21900 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f   statements invo
21910 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c 41 43  lving the REPLAC
21920 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  E conflict resol
21930 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a  ution algorithm.
21940 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65 20 66  ** go a little f
21950 61 73 74 65 72 2e 20 20 42 75 74 20 74 61 6b 69  aster.  But taki
21960 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  ng advantage of 
21970 74 68 69 73 20 74 69 6d 65 20 64 65 70 65 6e 64  this time depend
21980 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74  ency.** makes it
21990 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74 20   more difficult 
219a0 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20 74 68  to prove that th
219b0 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72 65 63  e code is correc
219c0 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63  t (in .** partic
219d0 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65 6e 74  ular, it prevent
219e0 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  s us from writin
219f0 67 20 61 6e 20 65 66 66 65 63 74 69 76 65 0a 2a  g an effective.*
21a00 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
21a10 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73 65 72   of sqlite3Asser
21a20 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61 6e 64  tMayAbort()) and
21a30 20 73 6f 20 77 65 20 68 61 76 65 20 63 68 6f 73   so we have chos
21a40 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68  en.** to take th
21a50 65 20 73 61 66 65 20 72 6f 75 74 65 20 61 6e 64  e safe route and
21a60 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69 6d 69   skip the optimi
21a70 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  zation..*/.void 
21a80 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
21a90 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
21aa0 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
21ab0 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
21ac0 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
21ad0 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  );.  pToplevel->
21ae0 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a  mayAbort = 1;.}.
21af0 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f  ./*.** Code an O
21b00 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61 75 73  P_Halt that caus
21b10 65 73 20 74 68 65 20 76 64 62 65 20 74 6f 20 72  es the vdbe to r
21b20 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
21b30 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72  CONSTRAINT.** er
21b40 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72  ror. The onError
21b50 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65 72   parameter deter
21b60 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69 66 20  mines which (if 
21b70 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74 61 74  any) of the stat
21b80 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20  ement.** and/or 
21b90 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
21ba0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
21bb0 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ck..*/.void sqli
21bc0 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
21bd0 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
21be0 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
21bf0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
21c00 6e 74 20 65 72 72 43 6f 64 65 2c 20 20 20 20 20  nt errCode,     
21c10 20 2f 2a 20 65 78 74 65 6e 64 65 64 20 65 72 72   /* extended err
21c20 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  or code */.  int
21c30 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f   onError,      /
21c40 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70  * Constraint typ
21c50 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c  e */.  char *p4,
21c60 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
21c70 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 69  r message */.  i
21c80 38 20 70 34 74 79 70 65 2c 20 20 20 20 20 20 20  8 p4type,       
21c90 20 2f 2a 20 50 34 5f 53 54 41 54 49 43 20 6f 72   /* P4_STATIC or
21ca0 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f   P4_TRANSIENT */
21cb0 0a 20 20 75 38 20 70 35 45 72 72 6d 73 67 20 20  .  u8 p5Errmsg  
21cc0 20 20 20 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73       /* P5_ErrMs
21cd0 67 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56  g type */.){.  V
21ce0 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
21cf0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
21d00 0a 20 20 61 73 73 65 72 74 28 20 28 65 72 72 43  .  assert( (errC
21d10 6f 64 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  ode&0xff)==SQLIT
21d20 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a  E_CONSTRAINT );.
21d30 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f    if( onError==O
21d40 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 73  E_Abort ){.    s
21d50 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
21d60 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Parse);.  }.  sq
21d70 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
21d80 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43  v, OP_Halt, errC
21d90 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ode, onError, 0,
21da0 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20   p4, p4type);.  
21db0 69 66 28 20 70 35 45 72 72 6d 73 67 20 29 20 73  if( p5Errmsg ) s
21dc0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
21dd0 50 35 28 76 2c 20 70 35 45 72 72 6d 73 67 29 3b  P5(v, p5Errmsg);
21de0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61  .}../*.** Code a
21df0 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f  n OP_Halt due to
21e00 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41   UNIQUE or PRIMA
21e10 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
21e20 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a  t violation..*/.
21e30 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69 71  void sqlite3Uniq
21e40 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ueConstraint(.  
21e50 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
21e60 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
21e70 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  text */.  int on
21e80 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43  Error,      /* C
21e90 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a  onstraint type *
21ea0 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
21eb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
21ec0 65 78 20 74 68 61 74 20 74 72 69 67 67 65 72 73  ex that triggers
21ed0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
21ee0 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45  */.){.  char *zE
21ef0 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53  rr;.  int j;.  S
21f00 74 72 41 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a  trAccum errMsg;.
21f10 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
21f20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20  pIdx->pTable;.. 
21f30 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
21f40 49 6e 69 74 28 26 65 72 72 4d 73 67 2c 20 70 50  Init(&errMsg, pP
21f50 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20  arse->db, 0, 0, 
21f60 32 30 30 29 3b 0a 20 20 69 66 28 20 70 49 64 78  200);.  if( pIdx
21f70 2d 3e 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20 20  ->aColExpr ){.  
21f80 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
21f90 28 26 65 72 72 4d 73 67 2c 20 30 2c 20 22 69 6e  (&errMsg, 0, "in
21fa0 64 65 78 20 27 25 71 27 22 2c 20 70 49 64 78 2d  dex '%q'", pIdx-
21fb0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  >zName);.  }else
21fc0 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
21fd0 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
21fe0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  j++){.      char
21ff0 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 61 73   *zCol;.      as
22000 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f  sert( pIdx->aiCo
22010 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20  lumn[j]>=0 );.  
22020 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d      zCol = pTab-
22030 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f  >aCol[pIdx->aiCo
22040 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a  lumn[j]].zName;.
22050 20 20 20 20 20 20 69 66 28 20 6a 20 29 20 73 71        if( j ) sq
22060 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
22070 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2c 20  end(&errMsg, ", 
22080 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  ", 2);.      sql
22090 69 74 65 33 58 50 72 69 6e 74 66 28 26 65 72 72  ite3XPrintf(&err
220a0 4d 73 67 2c 20 30 2c 20 22 25 73 2e 25 73 22 2c  Msg, 0, "%s.%s",
220b0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43   pTab->zName, zC
220c0 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ol);.    }.  }. 
220d0 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 53   zErr = sqlite3S
220e0 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 65  trAccumFinish(&e
220f0 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
22100 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28  3HaltConstraint(
22110 70 50 61 72 73 65 2c 20 0a 20 20 20 20 49 73 50  pParse, .    IsP
22120 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
22130 49 64 78 29 20 3f 20 53 51 4c 49 54 45 5f 43 4f  Idx) ? SQLITE_CO
22140 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
22150 4b 45 59 20 0a 20 20 20 20 20 20 20 20 20 20 20  KEY .           
22160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22170 20 3a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   : SQLITE_CONSTR
22180 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20 20  AINT_UNIQUE,.   
22190 20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72 72 2c 20   onError, zErr, 
221a0 50 34 5f 44 59 4e 41 4d 49 43 2c 20 50 35 5f 43  P4_DYNAMIC, P5_C
221b0 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29  onstraintUnique)
221c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  ;.}.../*.** Code
221d0 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20   an OP_Halt due 
221e0 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f  to non-unique ro
221f0 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wid..*/.void sql
22200 69 74 65 33 52 6f 77 69 64 43 6f 6e 73 74 72 61  ite3RowidConstra
22210 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
22220 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
22230 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
22240 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
22250 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72     /* Conflict r
22260 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
22270 74 68 6d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  thm */.  Table *
22280 70 54 61 62 20 20 20 20 20 20 20 2f 2a 20 54 68  pTab       /* Th
22290 65 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  e table with the
222a0 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77 69   non-unique rowi
222b0 64 20 2a 2f 20 0a 29 7b 0a 20 20 63 68 61 72 20  d */ .){.  char 
222c0 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63 3b  *zMsg;.  int rc;
222d0 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b  .  if( pTab->iPK
222e0 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 4d 73  ey>=0 ){.    zMs
222f0 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
22300 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
22310 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s.%s", pTab->zN
22320 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
22330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
22340 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
22350 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  iPKey].zName);. 
22360 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
22370 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
22380 59 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  YKEY;.  }else{. 
22390 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
223a0 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d  3MPrintf(pParse-
223b0 3e 64 62 2c 20 22 25 73 2e 72 6f 77 69 64 22 2c  >db, "%s.rowid",
223c0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
223d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
223e0 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3b  ONSTRAINT_ROWID;
223f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
22400 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ltConstraint(pPa
22410 72 73 65 2c 20 72 63 2c 20 6f 6e 45 72 72 6f 72  rse, rc, onError
22420 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d  , zMsg, P4_DYNAM
22430 49 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  IC,.            
22440 20 20 20 20 20 20 20 20 20 20 20 20 50 35 5f 43              P5_C
22450 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65 29  onstraintUnique)
22460 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
22470 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65   to see if pInde
22480 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61  x uses the colla
22490 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43  ting sequence pC
224a0 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  oll.  Return.** 
224b0 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 20  true if it does 
224c0 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74 20  and false if it 
224d0 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66  does not..*/.#if
224e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
224f0 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20  _REINDEX.static 
22500 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74  int collationMat
22510 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ch(const char *z
22520 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e  Coll, Index *pIn
22530 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  dex){.  int i;. 
22540 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21 3d   assert( zColl!=
22550 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0 );.  for(i=0; 
22560 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  i<pIndex->nColum
22570 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  n; i++){.    con
22580 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e  st char *z = pIn
22590 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  dex->azColl[i];.
225a0 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d 30      assert( z!=0
225b0 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f   || pIndex->aiCo
225c0 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20 20  lumn[i]<0 );.   
225d0 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43   if( pIndex->aiC
225e0 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20 30  olumn[i]>=0 && 0
225f0 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
22600 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  (z, zColl) ){.  
22610 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
22620 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
22630 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
22640 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
22650 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
22660 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63  b that use the c
22670 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
22680 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70  e pColl..** If p
22690 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
226a0 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
226b0 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23  es of pTab..*/.#
226c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
226d0 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
226e0 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61  c void reindexTa
226f0 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
22700 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
22710 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
22720 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  l){.  Index *pIn
22730 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
22740 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
22750 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
22760 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e  ab */..  for(pIn
22770 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  dex=pTab->pIndex
22780 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
22790 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b  =pIndex->pNext){
227a0 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d  .    if( zColl==
227b0 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61  0 || collationMa
227c0 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65  tch(zColl, pInde
227d0 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  x) ){.      int 
227e0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
227f0 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
22800 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
22810 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
22820 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
22830 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
22840 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  0, iDb);.      s
22850 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
22860 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
22870 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , -1);.    }.  }
22880 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
22890 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
228a0 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61  ndices of all ta
228b0 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  bles in all data
228c0 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a  bases where the.
228d0 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74  ** indices use t
228e0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
228f0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66  uence pColl.  If
22900 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
22910 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20  ecompute.** all 
22920 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65  indices everywhe
22930 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  re..*/.#ifndef S
22940 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
22950 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
22960 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
22970 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
22980 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
22990 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  ){.  Db *pDb;   
229a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229b0 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74   /* A single dat
229c0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
229d0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
229e0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
229f0 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
22a00 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
22a10 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
22a20 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
22a30 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
22a40 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b  */.  HashElem *k
22a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22a60 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
22a70 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70  over tables in p
22a80 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  Db */.  Table *p
22a90 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
22aa0 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
22ab0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
22ac0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
22ad0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
22ae0 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 20  lMutexes(db) ); 
22af0 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20 73   /* Needed for s
22b00 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f 0a  chema access */.
22b10 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62    for(iDb=0, pDb
22b20 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62  =db->aDb; iDb<db
22b30 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44  ->nDb; iDb++, pD
22b40 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  b++){.    assert
22b50 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20  ( pDb!=0 );.    
22b60 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68  for(k=sqliteHash
22b70 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68  First(&pDb->pSch
22b80 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20  ema->tblHash);  
22b90 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e  k; k=sqliteHashN
22ba0 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70  ext(k)){.      p
22bb0 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71  Tab = (Table*)sq
22bc0 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b  liteHashData(k);
22bd0 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61  .      reindexTa
22be0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
22bf0 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  , zColl);.    }.
22c00 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
22c10 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
22c20 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45  e for the REINDE
22c30 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
22c40 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
22c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c60 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a             -- 1.
22c70 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
22c80 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20  X  <collation>  
22c90 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
22ca0 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  2.**        REIN
22cb0 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
22cc0 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d  .?<tablename>  -
22cd0 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 3.**        RE
22ce0 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
22cf0 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20  e>.?<indexname> 
22d00 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d   -- 4.**.** Form
22d10 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e   1 causes all in
22d20 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74  dices in all att
22d30 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
22d40 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a  to be rebuilt..*
22d50 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64  * Form 2 rebuild
22d60 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
22d70 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74   all databases t
22d80 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65  hat use the name
22d90 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66  d.** collating f
22da0 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20  unction.  Forms 
22db0 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20  3 and 4 rebuild 
22dc0 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
22dd0 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65  or all.** indice
22de0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
22df0 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  h the named tabl
22e00 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
22e10 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
22e20 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  X.void sqlite3Re
22e30 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  index(Parse *pPa
22e40 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
22e50 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  e1, Token *pName
22e60 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  2){.  CollSeq *p
22e70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
22e80 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
22e90 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65  equence to be re
22ea0 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c  indexed, or NULL
22eb0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ed0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74    /* Name of a t
22ee0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f  able or index */
22ef0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
22f00 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Db;            /
22f10 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
22f20 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c  tabase */.  Tabl
22f30 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
22f40 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
22f50 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
22f60 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  se */.  Index *p
22f70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
22f80 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
22f90 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22fa0 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44  pTab */.  int iD
22fb0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
22fc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
22fd0 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
22fe0 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
22ff0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
23000 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
23010 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
23020 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e  /.  Token *pObjN
23030 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
23040 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
23050 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
23060 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f   be reindexed */
23070 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
23080 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
23090 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
230a0 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
230b0 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
230c0 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
230d0 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
230e0 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
230f0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
23100 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
23110 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
23120 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61  ;.  }..  if( pNa
23130 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  me1==0 ){.    re
23140 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
23150 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72  Parse, 0);.    r
23160 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  eturn;.  }else i
23170 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32 3d  f( NEVER(pName2=
23180 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a  =0) || pName2->z
23190 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
231a0 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65  *zColl;.    asse
231b0 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b  rt( pName1->z );
231c0 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c  .    zColl = sql
231d0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
231e0 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e  n(pParse->db, pN
231f0 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 21  ame1);.    if( !
23200 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a  zColl ) return;.
23210 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
23220 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
23230 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c  b, ENC(db), zCol
23240 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  l, 0);.    if( p
23250 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
23260 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
23270 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  Parse, zColl);. 
23280 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
23290 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20  ee(db, zColl);. 
232a0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
232b0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
232c0 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
232d0 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
232e0 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
232f0 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
23300 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d  pName2, &pObjNam
23310 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20  e);.  if( iDb<0 
23320 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20  ) return;.  z = 
23330 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
23340 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d  oken(db, pObjNam
23350 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  e);.  if( z==0 )
23360 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d   return;.  zDb =
23370 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
23380 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ame;.  pTab = sq
23390 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
233a0 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66  b, z, zDb);.  if
233b0 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65  ( pTab ){.    re
233c0 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
233d0 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20  e, pTab, 0);.   
233e0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
233f0 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72  b, z);.    retur
23400 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  n;.  }.  pIndex 
23410 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
23420 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a  ex(db, z, zDb);.
23430 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
23440 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49  db, z);.  if( pI
23450 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
23460 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
23470 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
23480 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
23490 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
234a0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
234b0 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
234c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
234d0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
234e0 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66  nable to identif
234f0 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20  y the object to 
23500 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a  be reindexed");.
23510 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
23520 52 65 74 75 72 6e 20 61 20 4b 65 79 49 6e 66 6f  Return a KeyInfo
23530 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
23540 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  is appropriate f
23550 6f 72 20 74 68 65 20 67 69 76 65 6e 20 49 6e 64  or the given Ind
23560 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4b 65  ex..**.** The Ke
23570 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
23580 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 69 73 20  for an index is 
23590 63 61 63 68 65 64 20 69 6e 20 74 68 65 20 49 6e  cached in the In
235a0 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 53  dex object..** S
235b0 6f 20 74 68 65 72 65 20 6d 69 67 68 74 20 62 65  o there might be
235c0 20 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72 65   multiple refere
235d0 6e 63 65 73 20 74 6f 20 74 68 65 20 72 65 74 75  nces to the retu
235e0 72 6e 65 64 20 70 6f 69 6e 74 65 72 2e 20 20 54  rned pointer.  T
235f0 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f  he.** caller sho
23600 75 6c 64 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d  uld not try to m
23610 6f 64 69 66 79 20 74 68 65 20 4b 65 79 49 6e 66  odify the KeyInf
23620 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  o object..**.** 
23630 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  The caller shoul
23640 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  d invoke sqlite3
23650 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 29 20 6f  KeyInfoUnref() o
23660 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 6f  n the returned o
23670 62 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69 74  bject.** when it
23680 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 75 73   has finished us
23690 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49 6e  ing it..*/.KeyIn
236a0 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49 6e  fo *sqlite3KeyIn
236b0 66 6f 4f 66 49 6e 64 65 78 28 50 61 72 73 65 20  foOfIndex(Parse 
236c0 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
236d0 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pIdx){.  int i;.
236e0 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64    int nCol = pId
236f0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e  x->nColumn;.  in
23700 74 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e 6e  t nKey = pIdx->n
23710 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e 66  KeyCol;.  KeyInf
23720 6f 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20 70  o *pKey;.  if( p
23730 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
23740 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49  turn 0;.  if( pI
23750 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  dx->uniqNotNull 
23760 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71  ){.    pKey = sq
23770 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f  lite3KeyInfoAllo
23780 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b  c(pParse->db, nK
23790 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b 0a  ey, nCol-nKey);.
237a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b 65    }else{.    pKe
237b0 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  y = sqlite3KeyIn
237c0 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  foAlloc(pParse->
237d0 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20  db, nCol, 0);.  
237e0 7d 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  }.  if( pKey ){.
237f0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
23800 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69 74  te3KeyInfoIsWrit
23810 65 61 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a 20  eable(pKey) );. 
23820 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
23830 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
23840 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
23850 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20  dx->azColl[i];. 
23860 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 43 6f       assert( zCo
23870 6c 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ll!=0 );.      p
23880 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Key->aColl[i] = 
23890 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49  strcmp(zColl,"BI
238a0 4e 41 52 59 22 29 3d 3d 30 20 3f 20 30 20 3a 0a  NARY")==0 ? 0 :.
238b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c          sqlite3L
238d0 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
238e0 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
238f0 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72     pKey->aSortOr
23900 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61  der[i] = pIdx->a
23910 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20  SortOrder[i];.  
23920 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72    }.    if( pPar
23930 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20  se->nErr ){.    
23940 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
23950 55 6e 72 65 66 28 70 4b 65 79 29 3b 0a 20 20 20  Unref(pKey);.   
23960 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20     pKey = 0;.   
23970 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
23980 70 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  pKey;.}..#ifndef
23990 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45   SQLITE_OMIT_CTE
239a0 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ./* .** This rou
239b0 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  tine is invoked 
239c0 6f 6e 63 65 20 70 65 72 20 43 54 45 20 62 79 20  once per CTE by 
239d0 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
239e0 20 70 61 72 73 69 6e 67 20 61 20 0a 2a 2a 20 57   parsing a .** W
239f0 49 54 48 20 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a  ITH clause. .*/.
23a00 57 69 74 68 20 2a 73 71 6c 69 74 65 33 57 69 74  With *sqlite3Wit
23a10 68 41 64 64 28 0a 20 20 50 61 72 73 65 20 2a 70  hAdd(.  Parse *p
23a20 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
23a30 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
23a40 78 74 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57  xt */.  With *pW
23a50 69 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ith,            
23a60 2f 2a 20 45 78 69 73 74 69 6e 67 20 57 49 54 48  /* Existing WITH
23a70 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c   clause, or NULL
23a80 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
23a90 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me,           /*
23aa0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6d   Name of the com
23ab0 6d 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 45  mon-table */.  E
23ac0 78 70 72 4c 69 73 74 20 2a 70 41 72 67 6c 69 73  xprList *pArglis
23ad0 74 2c 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e  t,     /* Option
23ae0 61 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c  al column name l
23af0 69 73 74 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ist for the tabl
23b00 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
23b10 51 75 65 72 79 20 20 20 20 20 20 20 20 20 20 2f  Query          /
23b20 2a 20 51 75 65 72 79 20 75 73 65 64 20 74 6f 20  * Query used to 
23b30 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74  initialize the t
23b40 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  able */.){.  sql
23b50 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
23b60 65 2d 3e 64 62 3b 0a 20 20 57 69 74 68 20 2a 70  e->db;.  With *p
23b70 4e 65 77 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  New;.  char *zNa
23b80 6d 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  me;..  /* Check 
23b90 74 68 61 74 20 74 68 65 20 43 54 45 20 6e 61 6d  that the CTE nam
23ba0 65 20 69 73 20 75 6e 69 71 75 65 20 77 69 74 68  e is unique with
23bb0 69 6e 20 74 68 69 73 20 57 49 54 48 20 63 6c 61  in this WITH cla
23bc0 75 73 65 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f 74  use. If.  ** not
23bd0 2c 20 73 74 6f 72 65 20 61 6e 20 65 72 72 6f 72  , store an error
23be0 20 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74   in the Parse st
23bf0 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e  ructure. */.  zN
23c00 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
23c10 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
23c20 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  e->db, pName);. 
23c30 20 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 70 57   if( zName && pW
23c40 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ith ){.    int i
23c50 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
23c60 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b  <pWith->nCte; i+
23c70 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
23c80 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61  lite3StrICmp(zNa
23c90 6d 65 2c 20 70 57 69 74 68 2d 3e 61 5b 69 5d 2e  me, pWith->a[i].
23ca0 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
23cb0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
23cc0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75  rMsg(pParse, "du
23cd0 70 6c 69 63 61 74 65 20 57 49 54 48 20 74 61 62  plicate WITH tab
23ce0 6c 65 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e  le name: %s", zN
23cf0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
23d00 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
23d10 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20  With ){.    int 
23d20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
23d30 70 57 69 74 68 29 20 2b 20 28 73 69 7a 65 6f 66  pWith) + (sizeof
23d40 28 70 57 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20  (pWith->a[1]) * 
23d50 70 57 69 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20  pWith->nCte);.  
23d60 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
23d70 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57  DbRealloc(db, pW
23d80 69 74 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  ith, nByte);.  }
23d90 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d  else{.    pNew =
23da0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
23db0 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
23dc0 2a 70 57 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20  *pWith));.  }.  
23dd0 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30  assert( zName!=0
23de0 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 3b 0a 20   || pNew==0 );. 
23df0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c   assert( db->mal
23e00 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20  locFailed==0 || 
23e10 70 4e 65 77 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  pNew==0 );..  if
23e20 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
23e30 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
23e40 44 65 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c  Delete(db, pArgl
23e50 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
23e60 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
23e70 2c 20 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73  , pQuery);.    s
23e80 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
23e90 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65   zName);.    pNe
23ea0 77 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c  w = pWith;.  }el
23eb0 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b  se{.    pNew->a[
23ec0 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c  pNew->nCte].pSel
23ed0 65 63 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20  ect = pQuery;.  
23ee0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
23ef0 6e 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41  nCte].pCols = pA
23f00 72 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77  rglist;.    pNew
23f10 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e  ->a[pNew->nCte].
23f20 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20  zName = zName;. 
23f30 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
23f40 3e 6e 43 74 65 5d 2e 7a 43 74 65 45 72 72 20 3d  >nCte].zCteErr =
23f50 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43   0;.    pNew->nC
23f60 74 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  te++;.  }..  ret
23f70 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
23f80 2a 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74  ** Free the cont
23f90 65 6e 74 73 20 6f 66 20 74 68 65 20 57 69 74 68  ents of the With
23fa0 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
23fb0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
23fc0 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ument..*/.void s
23fd0 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65  qlite3WithDelete
23fe0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69  (sqlite3 *db, Wi
23ff0 74 68 20 2a 70 57 69 74 68 29 7b 0a 20 20 69 66  th *pWith){.  if
24000 28 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69  ( pWith ){.    i
24010 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
24020 30 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65  0; i<pWith->nCte
24030 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
24040 72 75 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d  ruct Cte *pCte =
24050 20 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20   &pWith->a[i];. 
24060 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
24070 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
24080 43 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20  Cte->pCols);.   
24090 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
240a0 44 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d  Delete(db, pCte-
240b0 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  >pSelect);.     
240c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
240d0 62 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b  b, pCte->zName);
240e0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
240f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 69  e3DbFree(db, pWi
24100 74 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  th);.  }.}.#endi
24110 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
24120 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a  LITE_OMIT_CTE) *
24130 2f 0a                                            /.