/ Hex Artifact Content
Login

Artifact 2baeed38bdaa9f1199f101c63db41fdcc4b39ba5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t.h"../*.** This
02f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
0300: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53 51  ed when a new SQ
0310: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 62  L statement is b
0320: 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20 62  eginning to.** b
0330: 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74 69  e parsed.  Initi
0340: 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73 65  alize the pParse
0350: 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e 65   structure as ne
0360: 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  eded..*/.void sq
0370: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0380: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
0390: 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29 7b  nt explainFlag){
03a0: 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61  .  pParse->expla
03b0: 69 6e 20 3d 20 28 75 38 29 65 78 70 6c 61 69 6e  in = (u8)explain
03c0: 46 6c 61 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e  Flag;.  pParse->
03d0: 6e 56 61 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66  nVar = 0;.}..#if
03e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
03f0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0400: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 4c 6f 63  .** The TableLoc
0410: 6b 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6f  k structure is o
0420: 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68 65 20  nly used by the 
0430: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
0440: 28 29 20 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61  () and.** codeTa
0450: 62 6c 65 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74  bleLocks() funct
0460: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ions..*/.struct 
0470: 54 61 62 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e  TableLock {.  in
0480: 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
0490: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
04a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
04b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
04c0: 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  cked */.  int iT
04d0: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ab;            /
04e0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
04f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0500: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  be locked */.  u
0510: 38 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20  8 isWriteLock;  
0520: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
0530: 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c  write lock.  Fal
0540: 73 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f  se for a read lo
0550: 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ck */.  const ch
0560: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20  ar *zName;   /* 
0570: 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
0580: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  e */.};../*.** R
0590: 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
05a0: 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6c  hat we want to l
05b0: 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 72  ock a table at r
05c0: 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a  un-time.  .**.**
05d0: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   The table to be
05e0: 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f 74   locked has root
05f0: 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 69   page iTab and i
0600: 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 62  s found in datab
0610: 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65  ase iDb..** A re
0620: 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f  ad or a write lo
0630: 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e 20  ck can be taken 
0640: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57  depending on isW
0650: 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ritelock..**.** 
0660: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
0670: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 61  t records the fa
0680: 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ct that the lock
0690: 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 68   is desired.  Th
06a0: 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b  e.** code to mak
06b0: 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72  e the lock occur
06c0: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
06d0: 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f   a later call to
06e0: 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  .** codeTableLoc
06f0: 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 72  ks() which occur
0700: 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33  s during sqlite3
0710: 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
0720: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  */.void sqlite3T
0730: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73  ableLock(.  Pars
0740: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
0750: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0760: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20  t */.  int iDb, 
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
0780: 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ex of the databa
0790: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
07a0: 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20  e table to lock 
07b0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 20  */.  int iTab,  
07c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
07d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
07e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c  he table to be l
07f0: 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 73  ocked */.  u8 is
0800: 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a  WriteLock,    /*
0810: 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 74   True for a writ
0820: 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  e lock */.  cons
0830: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f  t char *zName  /
0840: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
0850: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0860: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
0870: 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69  pToplevel = sqli
0880: 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c  te3ParseToplevel
0890: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
08a0: 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 3b  i;.  int nBytes;
08b0: 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 3b  .  TableLock *p;
08c0: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
08d0: 30 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  0 );..  for(i=0;
08e0: 20 69 3c 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54   i<pToplevel->nT
08f0: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a  ableLock; i++){.
0900: 20 20 20 20 70 20 3d 20 26 70 54 6f 70 6c 65 76      p = &pToplev
0910: 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  el->aTableLock[i
0920: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0930: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0940: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0950: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0960: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0970: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
0980: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
0990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09a0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09b0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 54 6f 70  bleLock) * (pTop
09c0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
09d0: 6b 2b 31 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65  k+1);.  pTopleve
09e0: 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 3d 0a  l->aTableLock =.
09f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 52        sqlite3DbR
0a00: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70 54 6f  eallocOrFree(pTo
0a10: 70 6c 65 76 65 6c 2d 3e 64 62 2c 20 70 54 6f 70  plevel->db, pTop
0a20: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63  level->aTableLoc
0a30: 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66  k, nBytes);.  if
0a40: 28 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61  ( pToplevel->aTa
0a50: 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70  bleLock ){.    p
0a60: 20 3d 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61   = &pToplevel->a
0a70: 54 61 62 6c 65 4c 6f 63 6b 5b 70 54 6f 70 6c 65  TableLock[pTople
0a80: 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b  vel->nTableLock+
0a90: 2b 5d 3b 0a 20 20 20 20 70 2d 3e 69 44 62 20 3d  +];.    p->iDb =
0aa0: 20 69 44 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61   iDb;.    p->iTa
0ab0: 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  b = iTab;.    p-
0ac0: 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 69  >isWriteLock = i
0ad0: 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20 20 20  sWriteLock;.    
0ae0: 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  p->zName = zName
0af0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
0b00: 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65  Toplevel->nTable
0b10: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 54  Lock = 0;.    pT
0b20: 6f 70 6c 65 76 65 6c 2d 3e 64 62 2d 3e 6d 61 6c  oplevel->db->mal
0b30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
0b40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65   }.}../*.** Code
0b50: 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b   an OP_TableLock
0b60: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72   instruction for
0b70: 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b   each table lock
0b80: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61  ed by the.** sta
0b90: 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72  tement (configur
0ba0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73  ed by calls to s
0bb0: 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
0bc0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ))..*/.static vo
0bd0: 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  id codeTableLock
0be0: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  s(Parse *pParse)
0bf0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
0c00: 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56  e *pVdbe; ..  pV
0c10: 64 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74  dbe = sqlite3Get
0c20: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
0c30: 61 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30  assert( pVdbe!=0
0c40: 20 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65   ); /* sqlite3Ge
0c50: 74 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69  tVdbe cannot fai
0c60: 6c 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20  l: VDBE already 
0c70: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20  allocated */..  
0c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
0c90: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69  e->nTableLock; i
0ca0: 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f  ++){.    TableLo
0cb0: 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d  ck *p = &pParse-
0cc0: 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a  >aTableLock[i];.
0cd0: 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e      int p1 = p->
0ce0: 69 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  iDb;.    sqlite3
0cf0: 56 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65  VdbeAddOp4(pVdbe
0d00: 2c 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20  , OP_TableLock, 
0d10: 70 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e  p1, p->iTab, p->
0d20: 69 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20  isWriteLock,.   
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f     p->zName, P4_
0d50: 53 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23  STATIC);.  }.}.#
0d60: 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63  else.  #define c
0d70: 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29  odeTableLocks(x)
0d80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
0d90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
0da0: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69  alled after a si
0db0: 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65  ngle SQL stateme
0dc0: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0dd0: 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45  arsed and a VDBE
0de0: 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63   program to exec
0df0: 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65  ute that stateme
0e00: 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70  nt has been.** p
0e10: 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72  repared.  This r
0e20: 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20  outine puts the 
0e30: 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65  finishing touche
0e40: 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45  s on the.** VDBE
0e50: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73   program and res
0e60: 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73  ets the pParse s
0e70: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
0e80: 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a   next.** parse..
0e90: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
0ea0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
0eb0: 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62  rred, it might b
0ec0: 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
0ed0: 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20  ** no VDBE code 
0ee0: 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a  was generated..*
0ef0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69  /.void sqlite3Fi
0f00: 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65  nishCoding(Parse
0f10: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c   *pParse){.  sql
0f20: 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
0f30: 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *v;..  assert( 
0f40: 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76 65  pParse->pTopleve
0f50: 6c 3d 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  l==0 );.  db = p
0f60: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
0f70: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
0f80: 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
0f90: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
0fa0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0fb0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20   pParse->nErr ) 
0fc0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65  return;..  /* Be
0fd0: 67 69 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e  gin by generatin
0fe0: 67 20 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69  g some terminati
0ff0: 6f 6e 20 63 6f 64 65 20 61 74 20 74 68 65 20 65  on code at the e
1000: 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76  nd of the.  ** v
1010: 64 62 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f  dbe program.  */
1020: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1030: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1040: 20 61 73 73 65 72 74 28 20 21 70 50 61 72 73 65   assert( !pParse
1050: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a  ->isMultiWrite .
1060: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
1070: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
1080: 6f 72 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d  ort(v, pParse->m
1090: 61 79 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28  ayAbort));.  if(
10a0: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
10b0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
10c0: 50 5f 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a  P_Halt);..    /*
10d0: 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b   The cookie mask
10e0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69   contains one bi
10f0: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
1100: 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20  ase file open.. 
1110: 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20     ** (Bit 0 is 
1120: 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20  for main, bit 1 
1130: 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64  is for temp, and
1140: 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74   so forth.)  Bit
1150: 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74  s are.    ** set
1160: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
1170: 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e  se that is used.
1180: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
1190: 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a  to start a.    *
11a0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  * transaction on
11b0: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
11c0: 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66  ase and to verif
11d0: 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
11e0: 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61  kie.    ** on ea
11f0: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
1200: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1210: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1220: 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 79  oto>0 ){.      y
1230: 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 20  DbMask mask;.   
1240: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
1250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
1260: 70 48 65 72 65 28 76 2c 20 70 50 61 72 73 65 2d  pHere(v, pParse-
1270: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a  >cookieGoto-1);.
1280: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30 2c        for(iDb=0,
1290: 20 6d 61 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d   mask=1; iDb<db-
12a0: 3e 6e 44 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20  >nDb; mask<<=1, 
12b0: 69 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  iDb++){.        
12c0: 69 66 28 20 28 6d 61 73 6b 20 26 20 70 50 61 72  if( (mask & pPar
12d0: 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d  se->cookieMask)=
12e0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
12f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1300: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
1310: 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
1320: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1330: 2c 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c  ,OP_Transaction,
1340: 20 69 44 62 2c 20 28 6d 61 73 6b 20 26 20 70 50   iDb, (mask & pP
1350: 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29  arse->writeMask)
1360: 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  !=0);.        if
1370: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
1380: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1390: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
13a0: 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
13b0: 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20  b, iDb, 0) );.  
13c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13d0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
13e0: 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 0a 20 20  VerifyCookie,.  
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 20 20 20 20 20 20 20 20 20 69 44 62 2c 20 70            iDb, p
1410: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c  Parse->cookieVal
1420: 75 65 5b 69 44 62 5d 2c 0a 20 20 20 20 20 20 20  ue[iDb],.       
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
1450: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65  ].pSchema->iGene
1460: 72 61 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20  ration);.       
1470: 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64   }.      }.#ifnd
1480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1490: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
14a0: 20 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20    {.        int 
14b0: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
14c0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56  =0; i<pParse->nV
14d0: 74 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20  tabLock; i++){. 
14e0: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 76           char *v
14f0: 74 61 62 20 3d 20 28 63 68 61 72 20 2a 29 73 71  tab = (char *)sq
1500: 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
1510: 62 2c 20 70 50 61 72 73 65 2d 3e 61 70 56 74 61  b, pParse->apVta
1520: 62 4c 6f 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20  bLock[i]);.     
1530: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1540: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65  AddOp4(v, OP_VBe
1550: 67 69 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74  gin, 0, 0, 0, vt
1560: 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20  ab, P4_VTAB);.  
1570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1580: 70 50 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63  pParse->nVtabLoc
1590: 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23  k = 0;.      }.#
15a0: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
15b0: 4f 6e 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f  Once all the coo
15c0: 6b 69 65 73 20 68 61 76 65 20 62 65 65 6e 20 76  kies have been v
15d0: 65 72 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e  erified and tran
15e0: 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c  sactions opened,
15f0: 20 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69   .      ** obtai
1600: 6e 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  n the required t
1610: 61 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73  able-locks. This
1620: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65   is a no-op unle
1630: 73 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  ss the .      **
1640: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65   shared-cache fe
1650: 61 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64  ature is enabled
1660: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1670: 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28   codeTableLocks(
1680: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20  pParse);..      
1690: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  /* Initialize an
16a0: 79 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  y AUTOINCREMENT 
16b0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
16c0: 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20  required..      
16d0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
16e0: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67  AutoincrementBeg
16f0: 69 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20  in(pParse);..   
1700: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a     /* Finally, j
1710: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ump back to the 
1720: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1730: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65   executable code
1740: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
1750: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1760: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72  OP_Goto, 0, pPar
1770: 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b  se->cookieGoto);
1780: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
1790: 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20 70  * Get the VDBE p
17a0: 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72  rogram ready for
17b0: 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a   execution.  */.
17c0: 20 20 69 66 28 20 76 20 26 26 20 41 4c 57 41 59    if( v && ALWAY
17d0: 53 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  S(pParse->nErr==
17e0: 30 29 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f  0) && !db->mallo
17f0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61  cFailed ){.    a
1800: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69  ssert( pParse->i
1810: 43 61 63 68 65 4c 65 76 65 6c 3d 3d 30 20 29 3b  CacheLevel==0 );
1820: 20 20 2f 2a 20 44 69 73 61 62 6c 65 73 20 61 6e    /* Disables an
1830: 64 20 72 65 2d 65 6e 61 62 6c 65 73 20 6d 61 74  d re-enables mat
1840: 63 68 20 2a 2f 0a 20 20 20 20 2f 2a 20 41 20 6d  ch */.    /* A m
1850: 69 6e 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75  inimum of one cu
1860: 72 73 6f 72 20 69 73 20 72 65 71 75 69 72 65 64  rsor is required
1870: 20 69 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   if autoincremen
1880: 74 20 69 73 20 75 73 65 64 0a 20 20 20 20 2a 20  t is used.    * 
1890: 20 53 65 65 20 74 69 63 6b 65 74 20 5b 61 36 39   See ticket [a69
18a0: 36 33 37 39 63 31 66 30 38 38 36 36 5d 20 2a 2f  6379c1f08866] */
18b0: 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d  .    if( pParse-
18c0: 3e 70 41 69 6e 63 21 3d 30 20 26 26 20 70 50 61  >pAinc!=0 && pPa
18d0: 72 73 65 2d 3e 6e 54 61 62 3d 3d 30 20 29 20 70  rse->nTab==0 ) p
18e0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 31 3b  Parse->nTab = 1;
18f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1900: 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61  MakeReady(v, pPa
1910: 72 73 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65  rse);.    pParse
1920: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f  ->rc = SQLITE_DO
1930: 4e 45 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  NE;.    pParse->
1940: 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b  colNamesSet = 0;
1950: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
1960: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
1970: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  E_ERROR;.  }.  p
1980: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b  Parse->nTab = 0;
1990: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20  .  pParse->nMem 
19a0: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
19b0: 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Set = 0;.  pPars
19c0: 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70  e->nVar = 0;.  p
19d0: 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
19e0: 6b 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  k = 0;.  pParse-
19f0: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b  >cookieGoto = 0;
1a00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68  .}../*.** Run th
1a10: 65 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64  e parser and cod
1a20: 65 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75  e generator recu
1a30: 72 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72  rsively in order
1a40: 20 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20   to generate.** 
1a50: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c  code for the SQL
1a60: 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e   statement given
1a70: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
1a80: 20 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74   the pParse cont
1a90: 65 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  ext.** currently
1aa0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
1ab0: 69 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70  ion.  When the p
1ac0: 61 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63  arser is run rec
1ad0: 75 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73  ursively.** this
1ae0: 20 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20   way, the final 
1af0: 4f 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61  OP_Halt is not a
1b00: 70 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65  ppended and othe
1b10: 72 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  r initialization
1b20: 0a 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61  .** and finaliza
1b30: 74 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f  tion steps are o
1b40: 6d 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74  mitted because t
1b50: 68 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e  hose are handlin
1b60: 67 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65  g by the.** oute
1b70: 72 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a  rmost parser..**
1b80: 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69  .** Not everythi
1b90: 6e 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20  ng is nestable. 
1ba0: 20 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69   This facility i
1bb0: 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65  s designed to pe
1bc0: 72 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20  rmit.** INSERT, 
1bd0: 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45  UPDATE, and DELE
1be0: 54 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67  TE operations ag
1bf0: 61 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53  ainst SQLITE_MAS
1c00: 54 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72  TER.  Use.** car
1c10: 65 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20  e if you decide 
1c20: 74 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68  to try to use th
1c30: 69 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73  is routine for s
1c40: 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73  ome other purpos
1c50: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
1c60: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50  te3NestedParse(P
1c70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f  arse *pParse, co
1c80: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
1c90: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
1ca0: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
1cb0: 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  Sql;.  char *zEr
1cc0: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69  rMsg = 0;.  sqli
1cd0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1ce0: 2d 3e 64 62 3b 0a 23 20 64 65 66 69 6e 65 20 53  ->db;.# define S
1cf0: 41 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28  AVE_SZ  (sizeof(
1d00: 50 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74 6f  Parse) - offseto
1d10: 66 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a 20  f(Parse,nVar)). 
1d20: 20 63 68 61 72 20 73 61 76 65 42 75 66 5b 53 41   char saveBuf[SA
1d30: 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70  VE_SZ];..  if( p
1d40: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65  Parse->nErr ) re
1d50: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
1d60: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31  pParse->nested<1
1d70: 30 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67  0 );  /* Nesting
1d80: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
1d90: 6f 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68  of limited depth
1da0: 20 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61   */.  va_start(a
1db0: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a  p, zFormat);.  z
1dc0: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d 50  Sql = sqlite3VMP
1dd0: 72 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61  rintf(db, zForma
1de0: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
1df0: 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  (ap);.  if( zSql
1e00: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1e10: 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  n;   /* A malloc
1e20: 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
1e30: 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73  d */.  }.  pPars
1e40: 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d  e->nested++;.  m
1e50: 65 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26  emcpy(saveBuf, &
1e60: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41  pParse->nVar, SA
1e70: 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74  VE_SZ);.  memset
1e80: 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  (&pParse->nVar, 
1e90: 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73  0, SAVE_SZ);.  s
1ea0: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
1eb0: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a  pParse, zSql, &z
1ec0: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
1ed0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
1ee0: 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  rMsg);.  sqlite3
1ef0: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29  DbFree(db, zSql)
1f00: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 72  ;.  memcpy(&pPar
1f10: 73 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42 75  se->nVar, saveBu
1f20: 66 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70  f, SAVE_SZ);.  p
1f30: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b  Parse->nested--;
1f40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
1f50: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73   the in-memory s
1f60: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
1f70: 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63  scribes a partic
1f80: 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a  ular database.**
1f90: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65   table given the
1fa0: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61   name of that ta
1fb0: 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61  ble and (optiona
1fc0: 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66  lly) the name of
1fd0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
1fe0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1ff0: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e  table.  Return N
2000: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
2010: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61  ..**.** If zData
2020: 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64  base is 0, all d
2030: 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61  atabases are sea
2040: 72 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61  rched for the ta
2050: 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66  ble and the.** f
2060: 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61  irst matching ta
2070: 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ble is returned.
2080: 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66    (No checking f
2090: 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62  or duplicate tab
20a0: 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64  le.** names is d
20b0: 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63  one.)  The searc
20c0: 68 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20  h order is TEMP 
20d0: 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e  first, then MAIN
20e0: 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75  , then any.** au
20f0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
2100: 73 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68  s added using th
2110: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
2120: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
2130: 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61   sqlite3LocateTa
2140: 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20  ble()..*/.Table 
2150: 2a 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c  *sqlite3FindTabl
2160: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
2170: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2180: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
2190: 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c  atabase){.  Tabl
21a0: 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  e *p = 0;.  int 
21b0: 69 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  i;.  int nName;.
21c0: 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21    assert( zName!
21d0: 3d 30 20 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20  =0 );.  nName = 
21e0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
21f0: 7a 4e 61 6d 65 29 3b 0a 20 20 2f 2a 20 41 6c 6c  zName);.  /* All
2200: 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71   mutexes are req
2210: 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61  uired for schema
2220: 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73   access.  Make s
2230: 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d  ure we hold them
2240: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  . */.  assert( z
2250: 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c 20 73  Database!=0 || s
2260: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
2270: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
2280: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
2290: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
22a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
22b0: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
22c0: 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72 63 68  : i;   /* Search
22d0: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
22e0: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 61  N */.    if( zDa
22f0: 74 61 62 61 73 65 21 3d 30 20 26 26 20 73 71 6c  tabase!=0 && sql
2300: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74  ite3StrICmp(zDat
2310: 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a  abase, db->aDb[j
2320: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2330: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
2340: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
2350: 74 65 78 48 65 6c 64 28 64 62 2c 20 6a 2c 20 30  texHeld(db, j, 0
2360: 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
2370: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
2380: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
2390: 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65  ->tblHash, zName
23a0: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , nName);.    if
23b0: 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ( p ) break;.  }
23c0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
23d0: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
23e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
23f0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2400: 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  bes a particular
2410: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
2420: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
2430: 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  e of that table 
2440: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
2450: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
2460: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
2470: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
2480: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
2490: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41  if not found.  A
24a0: 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20  lso leave an.** 
24b0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
24c0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
24d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
24e0: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
24f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
2500: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2510: 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
2520: 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65  ** routine leave
2530: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
2540: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
2550: 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73  rrMsg where.** s
2560: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2570: 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54  ) does not..*/.T
2580: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63  able *sqlite3Loc
2590: 61 74 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73  ateTable(.  Pars
25a0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
25b0: 20 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e     /* context in
25c0: 20 77 68 69 63 68 20 74 6f 20 72 65 70 6f 72 74   which to report
25d0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
25e0: 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 20 20   isView,        
25f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c      /* True if l
2600: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 56 49 45  ooking for a VIE
2610: 57 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  W rather than a 
2620: 54 41 42 4c 45 20 2a 2f 0a 20 20 63 6f 6e 73 74  TABLE */.  const
2630: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
2640: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2650: 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 6c 6f   table we are lo
2660: 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 63  oking for */.  c
2670: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61 73  onst char *zDbas
2680: 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  e     /* Name of
2690: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
26a0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
26b0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
26c0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64  .  /* Read the d
26d0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
26e0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
26f0: 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
2700: 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20  or message.  ** 
2710: 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72  and code in pPar
2720: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  se and return NU
2730: 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  LL. */.  if( SQL
2740: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
2750: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
2760: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2770: 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71  0;.  }..  p = sq
2780: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70  lite3FindTable(p
2790: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
27a0: 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28  , zDbase);.  if(
27b0: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e   p==0 ){.    con
27c0: 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20  st char *zMsg = 
27d0: 69 73 56 69 65 77 20 3f 20 22 6e 6f 20 73 75 63  isView ? "no suc
27e0: 68 20 76 69 65 77 22 20 3a 20 22 6e 6f 20 73 75  h view" : "no su
27f0: 63 68 20 74 61 62 6c 65 22 3b 0a 20 20 20 20 69  ch table";.    i
2800: 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20 20 20  f( zDbase ){.   
2810: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2820: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20  sg(pParse, "%s: 
2830: 25 73 2e 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 44  %s.%s", zMsg, zD
2840: 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  base, zName);.  
2850: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2860: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2870: 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 22 2c  Parse, "%s: %s",
2880: 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20   zMsg, zName);. 
2890: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
28a0: 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
28b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
28c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
28d0: 65 20 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e  e the table iden
28e0: 74 69 66 69 65 64 20 62 79 20 2a 70 2e 0a 2a 2a  tified by *p..**
28f0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 77 72  .** This is a wr
2900: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
2910: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
2920: 29 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ). The differenc
2930: 65 20 62 65 74 77 65 65 6e 0a 2a 2a 20 73 71 6c  e between.** sql
2940: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
2950: 29 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  ) and this funct
2960: 69 6f 6e 20 69 73 20 74 68 61 74 20 74 68 69 73  ion is that this
2970: 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 74 72 69   function restri
2980: 63 74 73 0a 2a 2a 20 74 68 65 20 73 65 61 72 63  cts.** the searc
2990: 68 20 74 6f 20 73 63 68 65 6d 61 20 28 70 2d 3e  h to schema (p->
29a0: 70 53 63 68 65 6d 61 29 20 69 66 20 69 74 20 69  pSchema) if it i
29b0: 73 20 6e 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70  s not NULL. p->p
29c0: 53 63 68 65 6d 61 20 6d 61 79 20 62 65 0a 2a 2a  Schema may be.**
29d0: 20 6e 6f 6e 2d 4e 55 4c 4c 20 69 66 20 69 74 20   non-NULL if it 
29e0: 69 73 20 70 61 72 74 20 6f 66 20 61 20 76 69 65  is part of a vie
29f0: 77 20 6f 72 20 74 72 69 67 67 65 72 20 70 72 6f  w or trigger pro
2a00: 67 72 61 6d 20 64 65 66 69 6e 69 74 69 6f 6e 2e  gram definition.
2a10: 20 53 65 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46   See.** sqlite3F
2a20: 69 78 53 72 63 4c 69 73 74 28 29 20 66 6f 72 20  ixSrcList() for 
2a30: 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c  details..*/.Tabl
2a40: 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  e *sqlite3Locate
2a50: 54 61 62 6c 65 49 74 65 6d 28 0a 20 20 50 61 72  TableItem(.  Par
2a60: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 69  se *pParse, .  i
2a70: 6e 74 20 69 73 56 69 65 77 2c 20 0a 20 20 73 74  nt isView, .  st
2a80: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2a90: 6d 20 2a 70 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  m *p.){.  const 
2aa0: 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 61 73 73  char *zDb;.  ass
2ab0: 65 72 74 28 20 70 2d 3e 70 53 63 68 65 6d 61 3d  ert( p->pSchema=
2ac0: 3d 30 20 7c 7c 20 70 2d 3e 7a 44 61 74 61 62 61  =0 || p->zDataba
2ad0: 73 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  se==0 );.  if( p
2ae0: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
2af0: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
2b00: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
2b10: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70  pParse->db, p->p
2b20: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7a 44 62  Schema);.    zDb
2b30: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61   = pParse->db->a
2b40: 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
2b50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20   }else{.    zDb 
2b60: 3d 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a  = p->zDatabase;.
2b70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
2b80: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
2b90: 70 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20  pParse, isView, 
2ba0: 70 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a  p->zName, zDb);.
2bb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
2bc0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
2bd0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
2be0: 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72  cribes .** a par
2bf0: 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69  ticular index gi
2c00: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2c10: 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e  that index.** an
2c20: 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
2c30: 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
2c40: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64  contains the ind
2c50: 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55  ex..** Return NU
2c60: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
2c70: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
2c80: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
2c90: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
2ca0: 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ched for the.** 
2cb0: 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69  table and the fi
2cc0: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64  rst matching ind
2cd0: 65 78 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ex is returned. 
2ce0: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a   (No checking.**
2cf0: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69   for duplicate i
2d00: 6e 64 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f  ndex names is do
2d10: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
2d20: 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d   order is.** TEM
2d30: 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41  P first, then MA
2d40: 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78  IN, then any aux
2d50: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2d60: 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20   added.** using 
2d70: 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61  the ATTACH comma
2d80: 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  nd..*/.Index *sq
2d90: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73  lite3FindIndex(s
2da0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
2db0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
2dc0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
2dd0: 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b  .  Index *p = 0;
2de0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
2df0: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
2e00: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
2e10: 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 65 73    /* All mutexes
2e20: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 66 6f   are required fo
2e30: 72 20 73 63 68 65 6d 61 20 61 63 63 65 73 73 2e  r schema access.
2e40: 20 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68    Make sure we h
2e50: 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 20 61  old them. */.  a
2e60: 73 73 65 72 74 28 20 7a 44 62 21 3d 30 20 7c 7c  ssert( zDb!=0 ||
2e70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2e80: 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29  dsAllMutexes(db)
2e90: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54   );.  for(i=OMIT
2ea0: 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e  _TEMPDB; i<db->n
2eb0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  Db; i++){.    in
2ec0: 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e  t j = (i<2) ? i^
2ed0: 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 72 63  1 : i;  /* Searc
2ee0: 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41  h TEMP before MA
2ef0: 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65 6d 61  IN */.    Schema
2f00: 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e   *pSchema = db->
2f10: 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a  aDb[j].pSchema;.
2f20: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 63 68      assert( pSch
2f30: 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  ema );.    if( z
2f40: 44 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  Db && sqlite3Str
2f50: 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44  ICmp(zDb, db->aD
2f60: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
2f70: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
2f80: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
2f90: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a  aMutexHeld(db, j
2fa0: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  , 0) );.    p = 
2fb0: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2fc0: 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  &pSchema->idxHas
2fd0: 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  h, zName, nName)
2fe0: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72  ;.    if( p ) br
2ff0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
3000: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n p;.}../*.** Re
3010: 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79  claim the memory
3020: 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65   used by an inde
3030: 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  x.*/.static void
3040: 20 66 72 65 65 49 6e 64 65 78 28 73 71 6c 69 74   freeIndex(sqlit
3050: 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70  e3 *db, Index *p
3060: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
3070: 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20  E_OMIT_ANALYZE. 
3080: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e   sqlite3DeleteIn
3090: 64 65 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70  dexSamples(db, p
30a0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
30b0: 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42  db==0 || db->pnB
30c0: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
30d0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
30e0: 65 66 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b  ef(p->pKeyInfo);
30f0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
3100: 6c 65 74 65 28 64 62 2c 20 70 2d 3e 70 50 61 72  lete(db, p->pPar
3110: 74 49 64 78 57 68 65 72 65 29 3b 0a 20 20 73 71  tIdxWhere);.  sq
3120: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3130: 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 69  p->zColAff);.  i
3140: 66 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 20  f( p->isResized 
3150: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
3160: 64 62 2c 20 70 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a  db, p->azColl);.
3170: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3180: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
3190: 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63   For the index c
31a0: 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77  alled zIdxName w
31b0: 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e  hich is found in
31c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 44   the database iD
31d0: 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61  b,.** unlike tha
31e0: 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73  t index from its
31f0: 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f   Table then remo
3200: 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f  ve the index fro
3210: 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68  m.** the index h
3220: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72  ash table and fr
3230: 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74  ee all memory st
3240: 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61  ructures associa
3250: 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ted.** with the 
3260: 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73  index..*/.void s
3270: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
3280: 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74  eleteIndex(sqlit
3290: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
32a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
32b0: 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20  xName){.  Index 
32c0: 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c  *pIndex;.  int l
32d0: 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73  en;.  Hash *pHas
32e0: 68 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  h;..  assert( sq
32f0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
3300: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
3310: 20 29 3b 0a 20 20 70 48 61 73 68 20 3d 20 26 64   );.  pHash = &d
3320: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
3330: 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20  ema->idxHash;.  
3340: 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  len = sqlite3Str
3350: 6c 65 6e 33 30 28 7a 49 64 78 4e 61 6d 65 29 3b  len30(zIdxName);
3360: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
3370: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
3380: 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c  ash, zIdxName, l
3390: 65 6e 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c  en, 0);.  if( AL
33a0: 57 41 59 53 28 70 49 6e 64 65 78 29 20 29 7b 0a  WAYS(pIndex) ){.
33b0: 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e      if( pIndex->
33c0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d  pTable->pIndex==
33d0: 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20  pIndex ){.      
33e0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
33f0: 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d  pIndex = pIndex-
3400: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
3410: 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
3420: 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74  p;.      /* Just
3430: 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57  ification of ALW
3440: 41 59 53 28 29 3b 20 20 54 68 65 20 69 6e 64 65  AYS();  The inde
3450: 78 20 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65  x must be on the
3460: 20 6c 69 73 74 20 6f 66 0a 20 20 20 20 20 20 2a   list of.      *
3470: 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20  * indices. */.  
3480: 20 20 20 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e      p = pIndex->
3490: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a  pTable->pIndex;.
34a0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
34b0: 41 59 53 28 70 29 20 26 26 20 70 2d 3e 70 4e 65  AYS(p) && p->pNe
34c0: 78 74 21 3d 70 49 6e 64 65 78 20 29 7b 20 70 20  xt!=pIndex ){ p 
34d0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20  = p->pNext; }.  
34e0: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
34f0: 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49   && p->pNext==pI
3500: 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20  ndex) ){.       
3510: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64   p->pNext = pInd
3520: 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ex->pNext;.     
3530: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65   }.    }.    fre
3540: 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  eIndex(db, pInde
3550: 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c  x);.  }.  db->fl
3560: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
3570: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
3580: 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75  /*.** Look throu
3590: 67 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6f  gh the list of o
35a0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
35b0: 65 73 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20  es in db->aDb[] 
35c0: 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61  and if.** any ha
35d0: 76 65 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20  ve been closed, 
35e0: 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d  remove them from
35f0: 20 74 68 65 20 6c 69 73 74 2e 20 20 52 65 61 6c   the list.  Real
3600: 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a 20 64 62  locate the.** db
3610: 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63 74 75 72  ->aDb[] structur
3620: 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73  e to a smaller s
3630: 69 7a 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  ize, if possible
3640: 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20  ..**.** Entry 0 
3650: 28 74 68 65 20 22 6d 61 69 6e 22 20 64 61 74 61  (the "main" data
3660: 62 61 73 65 29 20 61 6e 64 20 65 6e 74 72 79 20  base) and entry 
3670: 31 20 28 74 68 65 20 22 74 65 6d 70 22 20 64 61  1 (the "temp" da
3680: 74 61 62 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e  tabase).** are n
3690: 65 76 65 72 20 63 61 6e 64 69 64 61 74 65 73 20  ever candidates 
36a0: 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70  for being collap
36b0: 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  sed..*/.void sql
36c0: 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61  ite3CollapseData
36d0: 62 61 73 65 41 72 72 61 79 28 73 71 6c 69 74 65  baseArray(sqlite
36e0: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c  3 *db){.  int i,
36f0: 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b   j;.  for(i=j=2;
3700: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
3710: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
3720: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
3730: 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  i];.    if( pDb-
3740: 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >pBt==0 ){.     
3750: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3760: 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  b, pDb->zName);.
3770: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
3780: 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 0;.      cont
3790: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
37a0: 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20  if( j<i ){.     
37b0: 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62   db->aDb[j] = db
37c0: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a  ->aDb[i];.    }.
37d0: 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d      j++;.  }.  m
37e0: 65 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a  emset(&db->aDb[j
37f0: 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a  ], 0, (db->nDb-j
3800: 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62  )*sizeof(db->aDb
3810: 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62  [j]));.  db->nDb
3820: 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e   = j;.  if( db->
3830: 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44  nDb<=2 && db->aD
3840: 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63  b!=db->aDbStatic
3850: 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64   ){.    memcpy(d
3860: 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62  b->aDbStatic, db
3870: 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28  ->aDb, 2*sizeof(
3880: 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20  db->aDb[0]));.  
3890: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
38a0: 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20  db, db->aDb);.  
38b0: 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e    db->aDb = db->
38c0: 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d  aDbStatic;.  }.}
38d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74 68  ../*.** Reset th
38e0: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
38f0: 20 64 61 74 61 62 61 73 65 20 61 74 20 69 6e 64   database at ind
3900: 65 78 20 69 44 62 2e 20 20 41 6c 73 6f 20 72 65  ex iDb.  Also re
3910: 73 65 74 20 74 68 65 0a 2a 2a 20 54 45 4d 50 20  set the.** TEMP 
3920: 73 63 68 65 6d 61 2e 0a 2a 2f 0a 76 6f 69 64 20  schema..*/.void 
3930: 73 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53  sqlite3ResetOneS
3940: 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64  chema(sqlite3 *d
3950: 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 44  b, int iDb){.  D
3960: 62 20 2a 70 44 62 3b 0a 20 20 61 73 73 65 72 74  b *pDb;.  assert
3970: 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  ( iDb<db->nDb );
3980: 0a 0a 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20  ..  /* Case 1:  
3990: 52 65 73 65 74 20 74 68 65 20 73 69 6e 67 6c 65  Reset the single
39a0: 20 73 63 68 65 6d 61 20 69 64 65 6e 74 69 66 69   schema identifi
39b0: 65 64 20 62 79 20 69 44 62 20 2a 2f 0a 20 20 70  ed by iDb */.  p
39c0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
39d0: 62 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  b];.  assert( sq
39e0: 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
39f0: 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
3a00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
3a10: 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30 20 29 3b  b->pSchema!=0 );
3a20: 0a 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  .  sqlite3Schema
3a30: 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65  Clear(pDb->pSche
3a40: 6d 61 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  ma);..  /* If an
3a50: 79 20 64 61 74 61 62 61 73 65 20 6f 74 68 65 72  y database other
3a60: 20 74 68 61 6e 20 54 45 4d 50 20 69 73 20 72 65   than TEMP is re
3a70: 73 65 74 2c 20 74 68 65 6e 20 61 6c 73 6f 20 72  set, then also r
3a80: 65 73 65 74 20 54 45 4d 50 0a 20 20 2a 2a 20 73  eset TEMP.  ** s
3a90: 69 6e 63 65 20 54 45 4d 50 20 6d 69 67 68 74 20  ince TEMP might 
3aa0: 62 65 20 68 6f 6c 64 69 6e 67 20 74 72 69 67 67  be holding trigg
3ab0: 65 72 73 20 74 68 61 74 20 72 65 66 65 72 65 6e  ers that referen
3ac0: 63 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ce tables in the
3ad0: 0a 20 20 2a 2a 20 6f 74 68 65 72 20 64 61 74 61  .  ** other data
3ae0: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  base..  */.  if(
3af0: 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 70   iDb!=1 ){.    p
3b00: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 31 5d  Db = &db->aDb[1]
3b10: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44  ;.    assert( pD
3b20: 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30 20 29 3b  b->pSchema!=0 );
3b30: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65  .    sqlite3Sche
3b40: 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63  maClear(pDb->pSc
3b50: 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 72 65 74  hema);.  }.  ret
3b60: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  urn;.}../*.** Er
3b70: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
3b80: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
3b90: 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
3ba0: 61 62 61 73 65 73 20 28 69 6e 63 6c 75 64 69 6e  abases (includin
3bb0: 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61 6e 64 20  g.** "main" and 
3bc0: 22 74 65 6d 70 22 29 20 66 6f 72 20 61 20 73 69  "temp") for a si
3bd0: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 63 6f  ngle database co
3be0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
3bf0: 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c  d sqlite3ResetAl
3c00: 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63  lSchemasOfConnec
3c10: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
3c20: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
3c30: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
3c40: 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d  ll(db);.  for(i=
3c50: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
3c60: 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20  +){.    Db *pDb 
3c70: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20  = &db->aDb[i];. 
3c80: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68     if( pDb->pSch
3c90: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ema ){.      sql
3ca0: 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28  ite3SchemaClear(
3cb0: 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pDb->pSchema);. 
3cc0: 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 66     }.  }.  db->f
3cd0: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
3ce0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20  InternChanges;. 
3cf0: 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
3d00: 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73 71  ckList(db);.  sq
3d10: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
3d20: 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  ll(db);.  sqlite
3d30: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
3d40: 65 41 72 72 61 79 28 64 62 29 3b 0a 7d 0a 0a 2f  eArray(db);.}../
3d50: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3d60: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
3d70: 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73   a commit occurs
3d80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3d90: 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  3CommitInternalC
3da0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
3db0: 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  db){.  db->flags
3dc0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
3dd0: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
3de0: 0a 2a 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f 72  .** Delete memor
3df0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  y allocated for 
3e00: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
3e10: 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 76   of a table or v
3e20: 69 65 77 20 28 74 68 65 0a 2a 2a 20 54 61 62 6c  iew (the.** Tabl
3e30: 65 2e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29 2e  e.aCol[] array).
3e40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3e50: 73 71 6c 69 74 65 44 65 6c 65 74 65 43 6f 6c 75  sqliteDeleteColu
3e60: 6d 6e 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20  mnNames(sqlite3 
3e70: 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  *db, Table *pTab
3e80: 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  le){.  int i;.  
3e90: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
3ea0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d  assert( pTable!=
3eb0: 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c  0 );.  if( (pCol
3ec0: 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29   = pTable->aCol)
3ed0: 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  !=0 ){.    for(i
3ee0: 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  =0; i<pTable->nC
3ef0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
3f00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
3f10: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  bFree(db, pCol->
3f20: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
3f30: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3f40: 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29  db, pCol->pDflt)
3f50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
3f60: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  bFree(db, pCol->
3f70: 7a 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71  zDflt);.      sq
3f80: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3f90: 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20  pCol->zType);.  
3fa0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
3fb0: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c  e(db, pCol->zCol
3fc0: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  l);.    }.    sq
3fd0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3fe0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20  pTable->aCol);. 
3ff0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f   }.}../*.** Remo
4000: 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61  ve the memory da
4010: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61 73  ta structures as
4020: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
4030: 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65  e given.** Table
4040: 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72  .  No changes ar
4050: 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62  e made to disk b
4060: 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  y this routine..
4070: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
4080: 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20  ne just deletes 
4090: 74 68 65 20 64 61 74 61 20 73 74 72 75 63 74 75  the data structu
40a0: 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74  re.  It does not
40b0: 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74   unlink.** the t
40c0: 61 62 6c 65 20 64 61 74 61 20 73 74 72 75 63 74  able data struct
40d0: 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73  ure from the has
40e0: 68 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74  h table.  But it
40f0: 20 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a   does destroy.**
4100: 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72   memory structur
4110: 65 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65  es of the indice
4120: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
4130: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
4140: 74 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  th .** the table
4150: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 62 20 70  ..**.** The db p
4160: 61 72 61 6d 65 74 65 72 20 69 73 20 6f 70 74 69  arameter is opti
4170: 6f 6e 61 6c 2e 20 20 49 74 20 69 73 20 6e 65 65  onal.  It is nee
4180: 64 65 64 20 69 66 20 74 68 65 20 54 61 62 6c 65  ded if the Table
4190: 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e 74   object .** cont
41a0: 61 69 6e 73 20 6c 6f 6f 6b 61 73 69 64 65 20 6d  ains lookaside m
41b0: 65 6d 6f 72 79 2e 20 20 28 54 61 62 6c 65 20 6f  emory.  (Table o
41c0: 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 63  bjects in the sc
41d0: 68 65 6d 61 20 64 6f 20 6e 6f 74 20 75 73 65 0a  hema do not use.
41e0: 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  ** lookaside mem
41f0: 6f 72 79 2c 20 62 75 74 20 73 6f 6d 65 20 65 70  ory, but some ep
4200: 68 65 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62  hemeral Table ob
4210: 6a 65 63 74 73 20 64 6f 2e 29 20 20 4f 72 20 74  jects do.)  Or t
4220: 68 65 0a 2a 2a 20 64 62 20 70 61 72 61 6d 65 74  he.** db paramet
4230: 65 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  er can be used w
4240: 69 74 68 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  ith db->pnBytesF
4250: 72 65 65 64 20 74 6f 20 6d 65 61 73 75 72 65 20  reed to measure 
4260: 74 68 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73  the memory.** us
4270: 65 64 20 62 79 20 74 68 65 20 54 61 62 6c 65 20  ed by the Table 
4280: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20  object..*/.void 
4290: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
42a0: 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  le(sqlite3 *db, 
42b0: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
42c0: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
42d0: 20 2a 70 4e 65 78 74 3b 0a 20 20 54 45 53 54 4f   *pNext;.  TESTO
42e0: 4e 4c 59 28 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73  NLY( int nLookas
42f0: 69 64 65 3b 20 29 20 2f 2a 20 55 73 65 64 20 74  ide; ) /* Used t
4300: 6f 20 76 65 72 69 66 79 20 6c 6f 6f 6b 61 73 69  o verify lookasi
4310: 64 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 20  de not used for 
4320: 73 63 68 65 6d 61 20 2a 2f 0a 0a 20 20 61 73 73  schema */..  ass
4330: 65 72 74 28 20 21 70 54 61 62 6c 65 20 7c 7c 20  ert( !pTable || 
4340: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20 29  pTable->nRef>0 )
4350: 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64  ;..  /* Do not d
4360: 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c 65 20  elete the table 
4370: 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65 72 65  until the refere
4380: 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65  nce count reache
4390: 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28  s zero. */.  if(
43a0: 20 21 70 54 61 62 6c 65 20 29 20 72 65 74 75 72   !pTable ) retur
43b0: 6e 3b 0a 20 20 69 66 28 20 28 28 21 64 62 20 7c  n;.  if( ((!db |
43c0: 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  | db->pnBytesFre
43d0: 65 64 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54 61  ed==0) && (--pTa
43e0: 62 6c 65 2d 3e 6e 52 65 66 29 3e 30 29 20 29 20  ble->nRef)>0) ) 
43f0: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 52 65  return;..  /* Re
4400: 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20  cord the number 
4410: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  of outstanding l
4420: 6f 6f 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61 74  ookaside allocat
4430: 69 6f 6e 73 20 69 6e 20 73 63 68 65 6d 61 20 54  ions in schema T
4440: 61 62 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72  ables.  ** prior
4450: 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66 72   to doing any fr
4460: 65 65 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 2e  ee() operations.
4470: 20 20 53 69 6e 63 65 20 73 63 68 65 6d 61 20 54    Since schema T
4480: 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73 65  ables do not use
4490: 0a 20 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c  .  ** lookaside,
44a0: 20 74 68 69 73 20 6e 75 6d 62 65 72 20 73 68 6f   this number sho
44b0: 75 6c 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20  uld not change. 
44c0: 2a 2f 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 6e  */.  TESTONLY( n
44d0: 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 28 64 62 20  Lookaside = (db 
44e0: 26 26 20 28 70 54 61 62 6c 65 2d 3e 74 61 62 46  && (pTable->tabF
44f0: 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
4500: 72 61 6c 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20  ral)==0) ?.     
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4520: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4530: 65 2e 6e 4f 75 74 20 3a 20 30 20 29 3b 0a 0a 20  e.nOut : 0 );.. 
4540: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69   /* Delete all i
4550: 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
4560: 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c  d with this tabl
4570: 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64  e. */.  for(pInd
4580: 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e  ex = pTable->pIn
4590: 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e  dex; pIndex; pIn
45a0: 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  dex=pNext){.    
45b0: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
45c0: 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72  pNext;.    asser
45d0: 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  t( pIndex->pSche
45e0: 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68  ma==pTable->pSch
45f0: 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 20 21  ema );.    if( !
4600: 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65  db || db->pnByte
4610: 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20  sFreed==0 ){.   
4620: 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d     char *zName =
4630: 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20   pIndex->zName; 
4640: 0a 20 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 20  .      TESTONLY 
4650: 28 20 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d 20  ( Index *pOld = 
4660: 29 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  ) sqlite3HashIns
4670: 65 72 74 28 0a 20 20 20 20 20 20 20 20 20 26 70  ert(.         &p
4680: 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e  Index->pSchema->
4690: 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  idxHash, zName, 
46a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
46b0: 7a 4e 61 6d 65 29 2c 20 30 0a 20 20 20 20 20 20  zName), 0.      
46c0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
46d0: 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65   db==0 || sqlite
46e0: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64  3SchemaMutexHeld
46f0: 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  (db, 0, pIndex->
4700: 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20  pSchema) );.    
4710: 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d    assert( pOld==
4720: 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64 3d 3d  pIndex || pOld==
4730: 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  0 );.    }.    f
4740: 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  reeIndex(db, pIn
4750: 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  dex);.  }..  /* 
4760: 44 65 6c 65 74 65 20 61 6e 79 20 66 6f 72 65 69  Delete any forei
4770: 67 6e 20 6b 65 79 73 20 61 74 74 61 63 68 65 64  gn keys attached
4780: 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 2e 20   to this table. 
4790: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 6b 44 65  */.  sqlite3FkDe
47a0: 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 29  lete(db, pTable)
47b0: 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 74  ;..  /* Delete t
47c0: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
47d0: 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a  re itself..  */.
47e0: 20 20 73 71 6c 69 74 65 44 65 6c 65 74 65 43 6f    sqliteDeleteCo
47f0: 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54  lumnNames(db, pT
4800: 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  able);.  sqlite3
4810: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
4820: 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  e->zName);.  sql
4830: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4840: 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b  Table->zColAff);
4850: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
4860: 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62 6c  Delete(db, pTabl
4870: 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 23 69 66  e->pSelect);.#if
4880: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4890: 5f 43 48 45 43 4b 0a 20 20 73 71 6c 69 74 65 33  _CHECK.  sqlite3
48a0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
48b0: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63  b, pTable->pChec
48c0: 6b 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64  k);.#endif.#ifnd
48d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
48e0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71  IRTUALTABLE.  sq
48f0: 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72 28 64  lite3VtabClear(d
4900: 62 2c 20 70 54 61 62 6c 65 29 3b 0a 23 65 6e 64  b, pTable);.#end
4910: 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  if.  sqlite3DbFr
4920: 65 65 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a  ee(db, pTable);.
4930: 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61  .  /* Verify tha
4940: 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64 65 20 6d  t no lookaside m
4950: 65 6d 6f 72 79 20 77 61 73 20 75 73 65 64 20 62  emory was used b
4960: 79 20 73 63 68 65 6d 61 20 74 61 62 6c 65 73 20  y schema tables 
4970: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f  */.  assert( nLo
4980: 6f 6b 61 73 69 64 65 3d 3d 30 20 7c 7c 20 6e 4c  okaside==0 || nL
4990: 6f 6f 6b 61 73 69 64 65 3d 3d 64 62 2d 3e 6c 6f  ookaside==db->lo
49a0: 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29 3b 0a  okaside.nOut );.
49b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
49c0: 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 20  the given table 
49d0: 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61  from the hash ta
49e0: 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65 6c  bles and the del
49f0: 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ete the.** table
4a00: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
4a10: 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73 20  all its indices 
4a20: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
4a30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4a40: 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65  3UnlinkAndDelete
4a50: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
4a60: 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73  b, int iDb, cons
4a70: 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65  t char *zTabName
4a80: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
4a90: 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73   Db *pDb;..  ass
4aa0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
4ab0: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
4ac0: 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
4ad0: 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e  .  assert( zTabN
4ae0: 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ame );.  assert(
4af0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
4b00: 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
4b10: 20 30 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73   0) );.  testcas
4b20: 65 28 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d  e( zTabName[0]==
4b30: 30 20 29 3b 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65  0 );  /* Zero-le
4b40: 6e 67 74 68 20 74 61 62 6c 65 20 6e 61 6d 65 73  ngth table names
4b50: 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a   are allowed */.
4b60: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
4b70: 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c  [iDb];.  p = sql
4b80: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
4b90: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
4ba0: 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c  lHash, zTabName,
4bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4bc0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
4bd0: 53 74 72 6c 65 6e 33 30 28 7a 54 61 62 4e 61 6d  Strlen30(zTabNam
4be0: 65 29 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  e),0);.  sqlite3
4bf0: 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20  DeleteTable(db, 
4c00: 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  p);.  db->flags 
4c10: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
4c20: 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  Changes;.}../*.*
4c30: 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c  * Given a token,
4c40: 20 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   return a string
4c50: 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f   that consists o
4c60: 66 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68  f the text of th
4c70: 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53 70  at.** token.  Sp
4c80: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
4c90: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
4ca0: 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ** is obtained f
4cb0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
4cc0: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
4cd0: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
4ce0: 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  ing.** function.
4cf0: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f 74 61  .**.** Any quota
4d00: 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65 78 3a 20  tion marks (ex: 
4d10: 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d 65 27 2c   "name", 'name',
4d20: 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d   [name], or `nam
4d30: 65 60 29 20 74 68 61 74 0a 2a 2a 20 73 75 72 72  e`) that.** surr
4d40: 6f 75 6e 64 20 74 68 65 20 62 6f 64 79 20 6f 66  ound the body of
4d50: 20 74 68 65 20 74 6f 6b 65 6e 20 61 72 65 20 72   the token are r
4d60: 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f  emoved..**.** To
4d70: 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a  kens are often j
4d80: 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74  ust pointers int
4d90: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  o the original S
4da0: 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a  QL text and so.*
4db0: 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74  * are not \000 t
4dc0: 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72  erminated and ar
4dd0: 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74  e not persistent
4de0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  .  The returned 
4df0: 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30  string.** is \00
4e00: 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64  0 terminated and
4e10: 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a   is persistent..
4e20: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
4e30: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71  NameFromToken(sq
4e40: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
4e50: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72   *pName){.  char
4e60: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70   *zName;.  if( p
4e70: 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d  Name ){.    zNam
4e80: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  e = sqlite3DbStr
4e90: 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
4ea0: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
4eb0: 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >n);.    sqlite3
4ec0: 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a  Dequote(zName);.
4ed0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61    }else{.    zNa
4ee0: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
4ef0: 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f  turn zName;.}../
4f00: 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71  *.** Open the sq
4f10: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
4f20: 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61  e stored in data
4f30: 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20  base number iDb 
4f40: 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20  for.** writing. 
4f50: 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65  The table is ope
4f60: 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72  ned using cursor
4f70: 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69   0..*/.void sqli
4f80: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
4f90: 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74  le(Parse *p, int
4fa0: 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
4fb0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
4fc0: 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54  e(p);.  sqlite3T
4fd0: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c  ableLock(p, iDb,
4fe0: 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c   MASTER_ROOT, 1,
4ff0: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
5000: 62 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  b));.  sqlite3Vd
5010: 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
5020: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20  P_OpenWrite, 0, 
5030: 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44 62  MASTER_ROOT, iDb
5040: 2c 20 35 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  , 5);.  if( p->n
5050: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  Tab==0 ){.    p-
5060: 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d  >nTab = 1;.  }.}
5070: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
5080: 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74  r zName points t
5090: 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  o a nul-terminat
50a0: 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  ed buffer contai
50b0: 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  ning the name.**
50c0: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28   of a database (
50d0: 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 6f  "main", "temp" o
50e0: 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  r the name of an
50f0: 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54   attached db). T
5100: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
5110: 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e 64 65  returns the inde
5120: 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64  x of the named d
5130: 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61  atabase in db->a
5140: 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69  Db[], or.** -1 i
5150: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 63  f the named db c
5160: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
5170: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  */.int sqlite3Fi
5180: 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74 65 33  ndDbName(sqlite3
5190: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
51a0: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
51b0: 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  i = -1;         
51c0: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
51d0: 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61 6d  er */.  if( zNam
51e0: 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  e ){.    Db *pDb
51f0: 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71  ;.    int n = sq
5200: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
5210: 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ame);.    for(i=
5220: 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62  (db->nDb-1), pDb
5230: 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e  =&db->aDb[i]; i>
5240: 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b  =0; i--, pDb--){
5250: 0a 20 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49  .      if( (!OMI
5260: 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31  T_TEMPDB || i!=1
5270: 20 29 20 26 26 20 6e 3d 3d 73 71 6c 69 74 65 33   ) && n==sqlite3
5280: 53 74 72 6c 65 6e 33 30 28 70 44 62 2d 3e 7a 4e  Strlen30(pDb->zN
5290: 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 20  ame) && .       
52a0: 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72     0==sqlite3Str
52b0: 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c  ICmp(pDb->zName,
52c0: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20   zName) ){.     
52d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
52e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
52f0: 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn i;.}../*.**
5300: 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d   The token *pNam
5310: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
5320: 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73  ame of a databas
5330: 65 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22  e (either "main"
5340: 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72   or.** "temp" or
5350: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
5360: 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68  attached db). Th
5370: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
5380: 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  ns the.** index 
5390: 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74  of the named dat
53a0: 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62  abase in db->aDb
53b0: 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65  [], or -1 if the
53c0: 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f   named db .** do
53d0: 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f  es not exist..*/
53e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
53f0: 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  Db(sqlite3 *db, 
5400: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
5410: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5430: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5440: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68  e number */.  ch
5450: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5470: 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72     /* Name we ar
5480: 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  e searching for 
5490: 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  */.  zName = sql
54a0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
54b0: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
54c0: 69 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  i = sqlite3FindD
54d0: 62 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bName(db, zName)
54e0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
54f0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
5500: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20  return i;.}../* 
5510: 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  The table or vie
5520: 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d  w or trigger nam
5530: 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
5540: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
5550: 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31  tokens.** pName1
5560: 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20   and pName2. If 
5570: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
5580: 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  as fully qualifi
5590: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a  ed, for example:
55a0: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
55b0: 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e  BLE xxx.yyy (...
55c0: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70  );.** .** Then p
55d0: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
55e0: 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32  "xxx" and pName2
55f0: 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f   "yyy". On the o
5600: 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20  ther hand if.** 
5610: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
5620: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
5630: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a  ified, i.e.:.**.
5640: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
5650: 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20  yyy(...);.**.** 
5660: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
5670: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
5680: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a  pName2 is ""..**
5690: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
56a0: 20 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71   sets the *ppUnq
56b0: 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  ual pointer to p
56c0: 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65  oint at the toke
56d0: 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20  n (pName1 or.** 
56e0: 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f  pName2) that sto
56f0: 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66  res the unqualif
5700: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
5710: 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   The index of th
5720: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78  e.** database "x
5730: 78 78 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e  xx" is returned.
5740: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
5750: 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61  woPartName(.  Pa
5760: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5770: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
5780: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
5790: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
57a0: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
57b0: 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69    /* The "xxx" i
57c0: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
57d0: 79 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f  yyy" or "xxx" */
57e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
57f0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79  ,      /* The "y
5800: 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  yy" in the name 
5810: 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54  "xxx.yyy" */.  T
5820: 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20  oken **pUnqual  
5830: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
5840: 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65  unqualified obje
5850: 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a  ct name here */.
5860: 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  ){.  int iDb;   
5870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5880: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
5890: 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20  ding the object 
58a0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
58b0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
58c0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4e 61    if( ALWAYS(pNa
58d0: 6d 65 32 21 3d 30 29 20 26 26 20 70 4e 61 6d 65  me2!=0) && pName
58e0: 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66  2->n>0 ){.    if
58f0: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
5900: 29 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ) {.      sqlite
5910: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5920: 2c 20 22 63 6f 72 72 75 70 74 20 64 61 74 61 62  , "corrupt datab
5930: 61 73 65 22 29 3b 0a 20 20 20 20 20 20 70 50 61  ase");.      pPa
5940: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
5950: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
5960: 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c    }.    *pUnqual
5970: 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69   = pName2;.    i
5980: 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
5990: 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  Db(db, pName1);.
59a0: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b      if( iDb<0 ){
59b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
59c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
59d0: 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
59e0: 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20   %T", pName1);. 
59f0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
5a00: 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r++;.      retur
5a10: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n -1;.    }.  }e
5a20: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
5a30: 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30   db->init.iDb==0
5a40: 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   || db->init.bus
5a50: 79 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64  y );.    iDb = d
5a60: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
5a70: 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d   *pUnqual = pNam
5a80: 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e1;.  }.  return
5a90: 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   iDb;.}../*.** T
5aa0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
5ab0: 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20  sed to check if 
5ac0: 74 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67  the UTF-8 string
5ad0: 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61   zName is a lega
5ae0: 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64  l.** unqualified
5af0: 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20   name for a new 
5b00: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74  schema object (t
5b10: 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65  able, index, vie
5b20: 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29  w or.** trigger)
5b30: 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20  . All names are 
5b40: 6c 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f  legal except tho
5b50: 73 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  se that begin wi
5b60: 74 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a  th the string.**
5b70: 20 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75   "sqlite_" (in u
5b80: 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d  pper, lower or m
5b90: 69 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73  ixed case). This
5ba0: 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
5bb0: 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20  namespace.** is 
5bc0: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
5bd0: 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e  ernal use..*/.in
5be0: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  t sqlite3CheckOb
5bf0: 6a 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a  jectName(Parse *
5c00: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
5c10: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66  ar *zName){.  if
5c20: 28 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69  ( !pParse->db->i
5c30: 6e 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72  nit.busy && pPar
5c40: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20  se->nested==0 . 
5c50: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61           && (pPa
5c60: 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
5c70: 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68   SQLITE_WriteSch
5c80: 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ema)==0.        
5c90: 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53    && 0==sqlite3S
5ca0: 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22  trNICmp(zName, "
5cb0: 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a  sqlite_", 7) ){.
5cc0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5cd0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a  Msg(pParse, "obj
5ce0: 65 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65  ect name reserve
5cf0: 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75  d for internal u
5d00: 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  se: %s", zName);
5d10: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5d20: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
5d30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5d40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5d50: 6e 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  n the PRIMARY KE
5d60: 59 20 69 6e 64 65 78 20 6f 66 20 61 20 74 61 62  Y index of a tab
5d70: 6c 65 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c  le.*/.Index *sql
5d80: 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
5d90: 64 65 78 28 54 61 62 6c 65 20 2a 70 54 61 62 29  dex(Table *pTab)
5da0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20  {.  Index *p;.  
5db0: 66 6f 72 28 70 3d 70 54 61 62 2d 3e 70 49 6e 64  for(p=pTab->pInd
5dc0: 65 78 3b 20 70 20 26 26 20 70 2d 3e 61 75 74 6f  ex; p && p->auto
5dd0: 49 6e 64 65 78 21 3d 32 3b 20 70 3d 70 2d 3e 70  Index!=2; p=p->p
5de0: 4e 65 78 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e  Next){}.  return
5df0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   p;.}../*.** Ret
5e00: 75 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f  urn the column o
5e10: 66 20 69 6e 64 65 78 20 70 49 64 78 20 74 68 61  f index pIdx tha
5e20: 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
5e30: 20 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e   table.** column
5e40: 20 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d   iCol.  Return -
5e50: 31 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  1 if not found..
5e60: 2a 2f 0a 69 31 36 20 73 71 6c 69 74 65 33 43 6f  */.i16 sqlite3Co
5e70: 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65  lumnOfIndex(Inde
5e80: 78 20 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f  x *pIdx, i16 iCo
5e90: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
5ea0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
5eb0: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
5ec0: 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64     if( iCol==pId
5ed0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29  x->aiColumn[i] )
5ee0: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
5ef0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
5f00: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
5f10: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
5f20: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
5f30: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
5f40: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
5f50: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
5f60: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
5f70: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
5f80: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
5f90: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
5fa0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
5fb0: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
5fc0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
5fd0: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
5fe0: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
5ff0: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
6000: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
6010: 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20  . The isTemp.** 
6020: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
6030: 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  the table should
6040: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
6050: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
6060: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73  base.** file ins
6070: 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d  tead of in the m
6080: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
6090: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
60a0: 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a  ally the case.**
60b0: 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22   when the "TEMP"
60c0: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
60d0: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
60e0: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
60f0: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
6100: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
6110: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
6120: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
6130: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
6140: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
6150: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
6160: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
6170: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
6180: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
6190: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
61a0: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
61b0: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
61c0: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
61d0: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
61e0: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
61f0: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
6200: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
6210: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
6220: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
6230: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
6240: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
6250: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
6260: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
6270: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
6280: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
6290: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
62a0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
62b0: 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72  ,   /* First par
62c0: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
62d0: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
62e0: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
62f0: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
6300: 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  nd part of the n
6310: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
6320: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e   or view */.  in
6330: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
6340: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
6350: 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a  s a TEMP table *
6360: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20  /.  int isView, 
6370: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
6380: 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a  this is a VIEW *
6390: 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61  /.  int isVirtua
63a0: 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  l,   /* True if 
63b0: 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41  this is a VIRTUA
63c0: 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  L table */.  int
63d0: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a   noErr        /*
63e0: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
63f0: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
6400: 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
6410: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61  e *pTable;.  cha
6420: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a  r *zName = 0; /*
6430: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
6440: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
6450: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
6460: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
6470: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20   *v;.  int iDb; 
6480: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
6490: 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72  ase number to cr
64a0: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  eate the table i
64b0: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
64c0: 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  ame;    /* Unqua
64d0: 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
64e0: 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61  he table to crea
64f0: 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  te */..  /* The 
6500: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e 61  table or view na
6510: 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69 73 20  me to create is 
6520: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
6530: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
6540: 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61 6e  s.  ** pName1 an
6550: 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65  d pName2. If the
6560: 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20   table name was 
6570: 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c  fully qualified,
6580: 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20   for example:.  
6590: 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54  **.  ** CREATE T
65a0: 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e  ABLE xxx.yyy (..
65b0: 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 54  .);.  ** .  ** T
65c0: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
65d0: 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70  t to "xxx" and p
65e0: 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20  Name2 "yyy". On 
65f0: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69  the other hand i
6600: 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65  f.  ** the table
6610: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c   name is not ful
6620: 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e  ly qualified, i.
6630: 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52  e.:.  **.  ** CR
6640: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
6650: 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ..);.  **.  ** T
6660: 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65  hen pName1 is se
6670: 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70  t to "yyy" and p
6680: 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20 2a  Name2 is ""..  *
6690: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20  *.  ** The call 
66a0: 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20 70  below sets the p
66b0: 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  Name pointer to 
66c0: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b  point at the tok
66d0: 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20 20  en (pName1 or.  
66e0: 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20  ** pName2) that 
66f0: 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61  stores the unqua
6700: 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d  lified table nam
6710: 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65 20  e. The variable 
6720: 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74 20  iDb is.  ** set 
6730: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
6740: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
6750: 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  t the table or v
6760: 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20 2a  iew is to be.  *
6770: 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20 20  * created in..  
6780: 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  */.  iDb = sqlit
6790: 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
67a0: 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
67b0: 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
67c0: 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74   if( iDb<0 ) ret
67d0: 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49 54  urn;.  if( !OMIT
67e0: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
67f0: 70 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30  p && pName2->n>0
6800: 20 26 26 20 69 44 62 21 3d 31 20 29 7b 0a 20 20   && iDb!=1 ){.  
6810: 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
6820: 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20 74   a temp table, t
6830: 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20  he name may not 
6840: 62 65 20 71 75 61 6c 69 66 69 65 64 2e 20 55 6e  be qualified. Un
6850: 6c 65 73 73 20 0a 20 20 20 20 2a 2a 20 74 68 65  less .    ** the
6860: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
6870: 73 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e  s "temp" anyway.
6880: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
6890: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
68a0: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
68b0: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
68c0: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
68d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
68e0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
68f0: 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62   && isTemp ) iDb
6900: 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d   = 1;..  pParse-
6910: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70  >sNameToken = *p
6920: 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  Name;.  zName = 
6930: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
6940: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
6950: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
6960: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6970: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
6980: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
6990: 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
69a0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
69b0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
69c0: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
69d0: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
69e0: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
69f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
6a00: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
6a10: 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29  rt( (isTemp & 1)
6a20: 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a  ==isTemp );.  {.
6a30: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
6a40: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
6a50: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
6a60: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
6a70: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
6a80: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
6a90: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
6aa0: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
6ab0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
6ac0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
6ad0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
6ae0: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
6af0: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
6b00: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
6b10: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
6b20: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
6b30: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
6b40: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
6b50: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
6b60: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
6b70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
6b80: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
6b90: 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  & isTemp ){.    
6ba0: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
6bb0: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
6bc0: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
6bd0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
6be0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6bf0: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
6c00: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
6c10: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
6c20: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
6c30: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
6c40: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
6c50: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6c60: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
6c70: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
6c80: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
6c90: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
6ca0: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
6cb0: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
6cc0: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
6cd0: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
6ce0: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
6cf0: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
6d00: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
6d10: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
6d20: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
6d30: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
6d40: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
6d50: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
6d60: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
6d70: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
6d80: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
6d90: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
6da0: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
6db0: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
6dc0: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
6dd0: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
6de0: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
6df0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
6e00: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
6e10: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  ){.    char *zDb
6e20: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
6e30: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53  zName;.    if( S
6e40: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
6e50: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
6e60: 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  se) ){.      got
6e70: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6e80: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ror;.    }.    p
6e90: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46  Table = sqlite3F
6ea0: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
6eb0: 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66  me, zDb);.    if
6ec0: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
6ed0: 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a    if( !noErr ){.
6ee0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6ef0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6f00: 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64  "table %T alread
6f10: 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65  y exists", pName
6f20: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
6f30: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6f40: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
6f50: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6f60: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
6f70: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
6f80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
6f90: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6fa0: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rror;.    }.    
6fb0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
6fc0: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
6fd0: 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  zDb)!=0 ){.     
6fe0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6ff0: 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
7000: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  is already an in
7010: 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  dex named %s", z
7020: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
7030: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7040: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ror;.    }.  }..
7050: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
7060: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
7070: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
7080: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
7090: 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  =0 ){.    db->ma
70a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
70b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
70c0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
70d0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
70e0: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69  +;.    goto begi
70f0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
7100: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61   }.  pTable->zNa
7110: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54  me = zName;.  pT
7120: 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  able->iPKey = -1
7130: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68  ;.  pTable->pSch
7140: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
7150: 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54  b].pSchema;.  pT
7160: 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  able->nRef = 1;.
7170: 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45 73    pTable->nRowEs
7180: 74 20 3d 20 31 30 34 38 35 37 36 3b 0a 20 20 61  t = 1048576;.  a
7190: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
71a0: 4e 65 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  NewTable==0 );. 
71b0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
71c0: 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20  le = pTable;..  
71d0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
71e0: 65 20 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73  e magic sqlite_s
71f0: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73  equence table us
7200: 65 64 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d  ed by autoincrem
7210: 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72  ent,.  ** then r
7220: 65 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20  ecord a pointer 
7230: 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e  to this table in
7240: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
7250: 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  se structure.  *
7260: 2a 20 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54  * so that INSERT
7270: 20 63 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61   can find the ta
7280: 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f  ble easily..  */
7290: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
72a0: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
72b0: 4e 54 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  NT.  if( !pParse
72c0: 2d 3e 6e 65 73 74 65 64 20 26 26 20 73 74 72 63  ->nested && strc
72d0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
72e0: 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20  e_sequence")==0 
72f0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
7300: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
7310: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
7320: 29 20 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d  ) );.    pTable-
7330: 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61  >pSchema->pSeqTa
7340: 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d 0a  b = pTable;.  }.
7350: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 67  #endif..  /* Beg
7360: 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68  in generating th
7370: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
7380: 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62 6c   insert the tabl
7390: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20 20  e record into.  
73a0: 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41  ** the SQLITE_MA
73b0: 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f 74  STER table.  Not
73c0: 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20  e in particular 
73d0: 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f 20  that we must go 
73e0: 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20 61  ahead.  ** and a
73f0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63 6f  llocate the reco
7400: 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  rd number for th
7410: 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e 6f  e table entry no
7420: 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a 20  w.  Before any. 
7430: 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
7440: 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f 72  or UNIQUE keywor
7450: 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20 20  ds are parsed.  
7460: 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20 77  Those keywords w
7470: 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20 69  ill cause.  ** i
7480: 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72 65  ndices to be cre
7490: 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61 62  ated and the tab
74a0: 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20 63  le record must c
74b0: 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20 0a  ome before the .
74c0: 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 48    ** indices.  H
74d0: 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72 64  ence, the record
74e0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
74f0: 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61 6c  table must be al
7500: 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f 77  located.  ** now
7510: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62  ..  */.  if( !db
7520: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 28  ->init.busy && (
7530: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
7540: 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20 29  be(pParse))!=0 )
7550: 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20  {.    int j1;.  
7560: 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74    int fileFormat
7570: 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20  ;.    int reg1, 
7580: 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20  reg2, reg3;.    
7590: 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
75a0: 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
75b0: 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 0, iDb);..#if
75c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
75d0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
75e0: 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20    if( isVirtual 
75f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
7600: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
7610: 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a  _VBegin);.    }.
7620: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
7630: 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61  f the file forma
7640: 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69  t and encoding i
7650: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
7660: 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74  ave not been set
7670: 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  , .    ** set th
7680: 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  em now..    */. 
7690: 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65     reg1 = pParse
76a0: 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70  ->regRowid = ++p
76b0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
76c0: 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e   reg2 = pParse->
76d0: 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72  regRoot = ++pPar
76e0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65  se->nMem;.    re
76f0: 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  g3 = ++pParse->n
7700: 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Mem;.    sqlite3
7710: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7720: 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62  _ReadCookie, iDb
7730: 2c 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49  , reg3, BTREE_FI
7740: 4c 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20  LE_FORMAT);.    
7750: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
7760: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
7770: 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
7780: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
7790: 66 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 66 69  f, reg3);.    fi
77a0: 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e  leFormat = (db->
77b0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c  flags & SQLITE_L
77c0: 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30  egacyFileFmt)!=0
77d0: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
77e0: 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f       1 : SQLITE_
77f0: 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b  MAX_FILE_FORMAT;
7800: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7810: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
7820: 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74  eger, fileFormat
7830: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
7840: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7850: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
7860: 69 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f  iDb, BTREE_FILE_
7870: 46 4f 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a 20  FORMAT, reg3);. 
7880: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7890: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
78a0: 65 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65 67  er, ENC(db), reg
78b0: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
78c0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
78d0: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
78e0: 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44  BTREE_TEXT_ENCOD
78f0: 49 4e 47 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  ING, reg3);.    
7900: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
7910: 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20  ere(v, j1);..   
7920: 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72   /* This just cr
7930: 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f  eates a place-ho
7940: 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74  lder record in t
7950: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
7960: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54   table..    ** T
7970: 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65  he record create
7980: 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  d does not conta
7990: 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e  in anything yet.
79a0: 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70    It will be rep
79b0: 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  laced.    ** by 
79c0: 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69  the real entry i
79d0: 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  n code generated
79e0: 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61   at sqlite3EndTa
79f0: 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ble()..    **.  
7a00: 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66    ** The rowid f
7a10: 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  or the new entry
7a20: 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69   is left in regi
7a30: 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67  ster pParse->reg
7a40: 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68  Rowid..    ** Th
7a50: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
7a60: 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  er of the new ta
7a70: 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72  ble is left in r
7a80: 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  eg pParse->regRo
7a90: 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  ot..    ** The r
7aa0: 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61  owid and root pa
7ab0: 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73  ge number values
7ac0: 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74   are needed by t
7ad0: 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20  he code that.   
7ae0: 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61   ** sqlite3EndTa
7af0: 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74  ble will generat
7b00: 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64  e..    */.#if !d
7b10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7b20: 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
7b30: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7b40: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20  _VIRTUALTABLE). 
7b50: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c     if( isView ||
7b60: 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20   isVirtual ){.  
7b70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7b80: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
7b90: 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20  ger, 0, reg2);. 
7ba0: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
7bb0: 20 20 20 20 7b 0a 20 20 20 20 20 20 70 50 61 72      {.      pPar
7bc0: 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 3d 20  se->addrCrTab = 
7bd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7be0: 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61  2(v, OP_CreateTa
7bf0: 62 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29 3b  ble, iDb, reg2);
7c00: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
7c10: 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c  e3OpenMasterTabl
7c20: 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
7c30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7c40: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52  ddOp2(v, OP_NewR
7c50: 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a  owid, 0, reg1);.
7c60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7c70: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
7c80: 2c 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  , 0, reg3);.    
7c90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7ca0: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20  3(v, OP_Insert, 
7cb0: 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a  0, reg3, reg1);.
7cc0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
7cd0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
7ce0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73  G_APPEND);.    s
7cf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
7d00: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20  (v, OP_Close);. 
7d10: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20   }..  /* Normal 
7d20: 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75  (non-error) retu
7d30: 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b  rn. */.  return;
7d40: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72  ..  /* If an err
7d50: 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75  or occurs, we ju
7d60: 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e  mp here */.begin
7d70: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20  _table_error:.  
7d80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
7d90: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  , zName);.  retu
7da0: 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rn;.}../*.** Thi
7db0: 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20  s macro is used 
7dc0: 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20 73  to compare two s
7dd0: 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73 65  trings in a case
7de0: 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61 6e  -insensitive man
7df0: 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73 6c  ner..** It is sl
7e00: 69 67 68 74 6c 79 20 66 61 73 74 65 72 20 74 68  ightly faster th
7e10: 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  an calling sqlit
7e20: 65 33 53 74 72 49 43 6d 70 28 29 20 64 69 72 65  e3StrICmp() dire
7e30: 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72 6f  ctly, but.** pro
7e40: 64 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f 64  duces larger cod
7e50: 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47  e..**.** WARNING
7e60: 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20  : This macro is 
7e70: 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20 77  not compatible w
7e80: 69 74 68 20 74 68 65 20 73 74 72 63 6d 70 28 29  ith the strcmp()
7e90: 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20 72   family. It.** r
7ea0: 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 74  eturns true if t
7eb0: 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 61  he two strings a
7ec0: 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72 77  re equal, otherw
7ed0: 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 64  ise false..*/.#d
7ee0: 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78 2c  efine STRICMP(x,
7ef0: 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55 70   y) (\.sqlite3Up
7f00: 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e 73  perToLower[*(uns
7f10: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78 29  igned char *)(x)
7f20: 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33 55  ]==   \.sqlite3U
7f30: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e  pperToLower[*(un
7f40: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 79  signed char *)(y
7f50: 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c 69  )]     \.&& sqli
7f60: 74 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b 31  te3StrICmp((x)+1
7f70: 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f 2a  ,(y)+1)==0 )../*
7f80: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f  .** Add a new co
7f90: 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c  lumn to the tabl
7fa0: 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  e currently bein
7fb0: 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a  g constructed..*
7fc0: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
7fd0: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
7fe0: 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ne once for each
7ff0: 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74   column declarat
8000: 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41  ion.** in a CREA
8010: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
8020: 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72  nt.  sqlite3Star
8030: 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63 61  tTable() gets ca
8040: 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f  lled.** first to
8050: 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e   get things goin
8060: 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f  g.  Then this ro
8070: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8080: 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75  for each.** colu
8090: 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  mn..*/.void sqli
80a0: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72  te3AddColumn(Par
80b0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
80c0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62  n *pName){.  Tab
80d0: 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  le *p;.  int i;.
80e0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c    char *z;.  Col
80f0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c  umn *pCol;.  sql
8100: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
8110: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20  e->db;.  if( (p 
8120: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
8130: 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ble)==0 ) return
8140: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
8150: 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d  _COLUMN.  if( p-
8160: 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d  >nCol+1>db->aLim
8170: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
8180: 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73  COLUMN] ){.    s
8190: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
81a0: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
81b0: 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c   columns on %s",
81c0: 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20   p->zName);.    
81d0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64  return;.  }.#end
81e0: 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  if.  z = sqlite3
81f0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
8200: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
8210: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
8220: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
8230: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
8240: 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70 2d  f( STRICMP(z, p-
8250: 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 20  >aCol[i].zName) 
8260: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8270: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8280: 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c 75   "duplicate colu
8290: 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 29  mn name: %s", z)
82a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
82b0: 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
82c0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
82d0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d 3e  }.  }.  if( (p->
82e0: 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20 29  nCol & 0x7)==0 )
82f0: 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61 4e  {.    Column *aN
8300: 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73  ew;.    aNew = s
8310: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
8320: 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e  db,p->aCol,(p->n
8330: 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d  Col+8)*sizeof(p-
8340: 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20  >aCol[0]));.    
8350: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
8360: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
8370: 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20  ee(db, z);.     
8380: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
8390: 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e 65     p->aCol = aNe
83a0: 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d 20  w;.  }.  pCol = 
83b0: 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  &p->aCol[p->nCol
83c0: 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 6c  ];.  memset(pCol
83d0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61  , 0, sizeof(p->a
83e0: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f 6c  Col[0]));.  pCol
83f0: 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a 20  ->zName = z;. . 
8400: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
8410: 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69 65  no type specifie
8420: 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65 20  d, columns have 
8430: 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66 69  the default affi
8440: 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45 27  nity.  ** 'NONE'
8450: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  . If there is a 
8460: 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c 20  type specified, 
8470: 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64 43  then sqlite3AddC
8480: 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c 6c  olumnType() will
8490: 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  .  ** be called 
84a0: 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f 6c  next to set pCol
84b0: 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72 65  ->affinity corre
84c0: 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f  ctly..  */.  pCo
84d0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  l->affinity = SQ
84e0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
84f0: 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d 20 31   pCol->szEst = 1
8500: 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d  ;.  p->nCol++;.}
8510: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8520: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
8530: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
8540: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
8550: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
8560: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
8570: 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54  atement.  A "NOT
8580: 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e   NULL" constrain
8590: 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65  t has.** been se
85a0: 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20  en on a column. 
85b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
85c0: 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66  ts the notNull f
85d0: 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f  lag on.** the co
85e0: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
85f0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
8600: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
8610: 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72  e3AddNotNull(Par
8620: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
8630: 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c  onError){.  Tabl
8640: 65 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50 61 72  e *p;.  p = pPar
8650: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
8660: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56   if( p==0 || NEV
8670: 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20  ER(p->nCol<1) ) 
8680: 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61 43 6f  return;.  p->aCo
8690: 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e 6f 74  l[p->nCol-1].not
86a0: 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72  Null = (u8)onErr
86b0: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 63 61  or;.}../*.** Sca
86c0: 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74 79 70  n the column typ
86d0: 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28 6c 65  e name zType (le
86e0: 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e 64 20  ngth nType) and 
86f0: 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 73  return the.** as
8700: 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e 69 74  sociated affinit
8710: 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  y type..**.** Th
8720: 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
8730: 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e 64 65  a case-independe
8740: 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a 54 79  nt search of zTy
8750: 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 73  pe for the .** s
8760: 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65  ubstrings in the
8770: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
8780: 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  . If one of the 
8790: 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a 2a 2a  substrings is.**
87a0: 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f 72 72   found, the corr
87b0: 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69 6e 69  esponding affini
87c0: 74 79 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ty is returned. 
87d0: 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61 69 6e  If zType contain
87e0: 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f  s.** more than o
87f0: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
8800: 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20 74 6f  ings, entries to
8810: 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f 66 20  ward the top of 
8820: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 61  .** the table ta
8830: 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46 6f 72  ke priority. For
8840: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a 54 79   example, if zTy
8850: 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54 27 2c  pe is 'BLOBINT',
8860: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f   .** SQLITE_AFF_
8870: 49 4e 54 45 47 45 52 20 69 73 20 72 65 74 75 72  INTEGER is retur
8880: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62 73 74  ned..**.** Subst
8890: 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66 69 6e  ring     | Affin
88a0: 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ity.** ---------
88b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
88c0: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e 54 27  -------.** 'INT'
88d0: 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
88e0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a 2a 2a  E_AFF_INTEGER.**
88f0: 20 27 43 48 41 52 27 20 20 20 20 20 20 20 20 7c   'CHAR'        |
8900: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
8910: 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20 20 20  .** 'CLOB'      
8920: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54    | SQLITE_AFF_T
8930: 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20 20 20  EXT.** 'TEXT'   
8940: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
8950: 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f 42 27  F_TEXT.** 'BLOB'
8960: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
8970: 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a 20 27 52 45  _AFF_NONE.** 'RE
8980: 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  AL'        | SQL
8990: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20  ITE_AFF_REAL.** 
89a0: 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20 7c 20  'FLOA'        | 
89b0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a  SQLITE_AFF_REAL.
89c0: 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20 20 20  ** 'DOUB'       
89d0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   | SQLITE_AFF_RE
89e0: 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 65  AL.**.** If none
89f0: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
8a00: 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20  gs in the above 
8a10: 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e 64 2c  table are found,
8a20: 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  .** SQLITE_AFF_N
8a30: 55 4d 45 52 49 43 20 69 73 20 72 65 74 75 72 6e  UMERIC is return
8a40: 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  ed..*/.char sqli
8a50: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
8a60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c  const char *zIn,
8a70: 20 75 38 20 2a 70 73 7a 45 73 74 29 7b 0a 20 20   u8 *pszEst){.  
8a80: 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61  u32 h = 0;.  cha
8a90: 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41  r aff = SQLITE_A
8aa0: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f  FF_NUMERIC;.  co
8ab0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 61 72 20  nst char *zChar 
8ac0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 7a 49 6e 3d  = 0;..  if( zIn=
8ad0: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 66 66 3b  =0 ) return aff;
8ae0: 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 5d  .  while( zIn[0]
8af0: 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c 3c   ){.    h = (h<<
8b00: 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70 65  8) + sqlite3Uppe
8b10: 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 26  rToLower[(*zIn)&
8b20: 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b  0xff];.    zIn++
8b30: 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27  ;.    if( h==(('
8b40: 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36  c'<<24)+('h'<<16
8b50: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20  )+('a'<<8)+'r') 
8b60: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){             /
8b70: 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20  * CHAR */.      
8b80: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
8b90: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7a 43 68  _TEXT;.      zCh
8ba0: 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d 65  ar = zIn;.    }e
8bb0: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27  lse if( h==(('c'
8bc0: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
8bd0: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b  ('o'<<8)+'b') ){
8be0: 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a         /* CLOB *
8bf0: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
8c00: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
8c10: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
8c20: 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('t'<<24)+('e'<
8c30: 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74  <16)+('x'<<8)+'t
8c40: 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54  ') ){       /* T
8c50: 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  EXT */.      aff
8c60: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
8c70: 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  XT;.    }else if
8c80: 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b  ( h==(('b'<<24)+
8c90: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
8ca0: 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20  8)+'b')         
8cb0: 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20   /* BLOB */.    
8cc0: 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c      && (aff==SQL
8cd0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
8ce0: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
8cf0: 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20  FF_REAL) ){.    
8d00: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
8d10: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 69  FF_NONE;.      i
8d20: 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20 29  f( zIn[0]=='(' )
8d30: 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23 69   zChar = zIn;.#i
8d40: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8d50: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
8d60: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
8d70: 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 65  ==(('r'<<24)+('e
8d80: 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b  '<<16)+('a'<<8)+
8d90: 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'l')          /*
8da0: 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 20   REAL */.       
8db0: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
8dc0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
8dd0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
8de0: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20  E_AFF_REAL;.    
8df0: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
8e00: 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  f'<<24)+('l'<<16
8e10: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 20  )+('o'<<8)+'a') 
8e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f 41           /* FLOA
8e30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
8e40: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
8e50: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
8e60: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
8e70: 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _REAL;.    }else
8e80: 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c 32   if( h==(('d'<<2
8e90: 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 75  4)+('o'<<16)+('u
8ea0: 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20  '<<8)+'b')      
8eb0: 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20      /* DOUB */. 
8ec0: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
8ed0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
8ee0: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
8ef0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
8f00: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
8f10: 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46 46  se if( (h&0x00FF
8f20: 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 36  FFFF)==(('i'<<16
8f30: 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 20  )+('n'<<8)+'t') 
8f40: 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a  ){    /* INT */.
8f50: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
8f60: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
8f70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8f80: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
8f90: 70 73 7a 45 73 74 20 69 73 20 6e 6f 74 20 4e 55  pszEst is not NU
8fa0: 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73 74  LL, store an est
8fb0: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69 65  imate of the fie
8fc0: 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20 20  ld size.  The.  
8fd0: 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20 73  ** estimate is s
8fe0: 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74 68  caled so that th
8ff0: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74  e size of an int
9000: 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20  eger is 1.  */. 
9010: 20 69 66 28 20 70 73 7a 45 73 74 20 29 7b 0a 20   if( pszEst ){. 
9020: 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 31 3b 20     *pszEst = 1; 
9030: 20 20 2f 2a 20 64 65 66 61 75 6c 74 20 73 69 7a    /* default siz
9040: 65 20 69 73 20 61 70 70 72 6f 78 20 34 20 62 79  e is approx 4 by
9050: 74 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 61  tes */.    if( a
9060: 66 66 3c 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff<=SQLITE_AFF_N
9070: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ONE ){.      if(
9080: 20 7a 43 68 61 72 20 29 7b 0a 20 20 20 20 20 20   zChar ){.      
9090: 20 20 77 68 69 6c 65 28 20 7a 43 68 61 72 5b 30    while( zChar[0
90a0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ] ){.          i
90b0: 66 28 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  f( sqlite3Isdigi
90c0: 74 28 7a 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20  t(zChar[0]) ){. 
90d0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76             int v
90e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
90f0: 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33    sqlite3GetInt3
9100: 32 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a 20 20  2(zChar, &v);.  
9110: 20 20 20 20 20 20 20 20 20 20 76 20 3d 20 76 2f            v = v/
9120: 34 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20  4 + 1;.         
9130: 20 20 20 69 66 28 20 76 3e 32 35 35 20 29 20 76     if( v>255 ) v
9140: 20 3d 20 32 35 35 3b 0a 20 20 20 20 20 20 20 20   = 255;.        
9150: 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 76 3b      *pszEst = v;
9160: 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c 20 56 41 52   /* BLOB(k), VAR
9170: 43 48 41 52 28 6b 29 2c 20 43 48 41 52 28 6b 29  CHAR(k), CHAR(k)
9180: 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31 29 20 2a 2f   -> r=(k/4+1) */
9190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
91a0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
91b0: 20 20 20 20 20 20 20 20 20 20 7a 43 68 61 72 2b            zChar+
91c0: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
91d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
91e0: 20 20 2a 70 73 7a 45 73 74 20 3d 20 35 3b 20 20    *pszEst = 5;  
91f0: 20 2f 2a 20 42 4c 4f 42 2c 20 54 45 58 54 2c 20   /* BLOB, TEXT, 
9200: 43 4c 4f 42 20 2d 3e 20 72 3d 35 20 20 28 61 70  CLOB -> r=5  (ap
9210: 70 72 6f 78 20 32 30 20 62 79 74 65 73 29 2a 2f  prox 20 bytes)*/
9220: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9230: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b   }.  return aff;
9240: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
9250: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
9260: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
9270: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
9280: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
9290: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
92a0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
92b0: 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20  pFirst token is 
92c0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b  the first.** tok
92d0: 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  en in the sequen
92e0: 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61  ce of tokens tha
92f0: 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74  t describe the t
9300: 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ype of the.** co
9310: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
9320: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
9330: 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74 68  n.   pLast is th
9340: 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20  e last token.** 
9350: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e  in the sequence.
9360: 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72    Use this infor
9370: 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72  mation to constr
9380: 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20  uct a string.** 
9390: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
93a0: 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68  e typename of th
93b0: 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f  e column and sto
93c0: 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a  re that string.*
93d0: 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a  * in zType..*/ .
93e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
93f0: 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20  olumnType(Parse 
9400: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
9410: 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20  pType){.  Table 
9420: 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43  *p;.  Column *pC
9430: 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70 50 61 72 73  ol;..  p = pPars
9440: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
9450: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45  if( p==0 || NEVE
9460: 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72  R(p->nCol<1) ) r
9470: 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20  eturn;.  pCol = 
9480: 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c  &p->aCol[p->nCol
9490: 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  -1];.  assert( p
94a0: 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 3b  Col->zType==0 );
94b0: 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d  .  pCol->zType =
94c0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
94d0: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
94e0: 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c  , pType);.  pCol
94f0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
9500: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
9510: 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 2c 20 26 70  (pCol->zType, &p
9520: 43 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 7d 0a 0a  Col->szEst);.}..
9530: 2f 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73  /*.** The expres
9540: 73 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61  sion is the defa
9550: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
9560: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
9570: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  added column.** 
9580: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  of the table cur
9590: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
95a0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  struction..**.**
95b0: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65   Default value e
95c0: 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20  xpressions must 
95d0: 62 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61  be constant.  Ra
95e0: 69 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e  ise an exception
95f0: 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e   if this.** is n
9600: 6f 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a  ot the case..**.
9610: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9620: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
9630: 20 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e   parser while in
9640: 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a   the middle of.*
9650: 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41  * parsing a CREA
9660: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
9670: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
9680: 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c  te3AddDefaultVal
9690: 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ue(Parse *pParse
96a0: 2c 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61  , ExprSpan *pSpa
96b0: 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  n){.  Table *p;.
96c0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
96d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
96e0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20  pParse->db;.  p 
96f0: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
9700: 62 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20  ble;.  if( p!=0 
9710: 29 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28  ){.    pCol = &(
9720: 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d  p->aCol[p->nCol-
9730: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71  1]);.    if( !sq
9740: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
9750: 61 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53  antOrFunction(pS
9760: 70 61 6e 2d 3e 70 45 78 70 72 29 20 29 7b 0a 20  pan->pExpr) ){. 
9770: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
9780: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65  rMsg(pParse, "de
9790: 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63  fault value of c
97a0: 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f  olumn [%s] is no
97b0: 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20  t constant",.   
97c0: 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61         pCol->zNa
97d0: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
97e0: 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20        /* A copy 
97f0: 6f 66 20 70 45 78 70 72 20 69 73 20 75 73 65 64  of pExpr is used
9800: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
9810: 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78  original, as pEx
9820: 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  pr contains.    
9830: 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74    ** tokens that
9840: 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69   point to volati
9850: 6c 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27  le memory. The '
9860: 73 70 61 6e 27 20 6f 66 20 74 68 65 20 65 78 70  span' of the exp
9870: 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  ression.      **
9880: 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20   is required by 
9890: 70 72 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66  pragma table_inf
98a0: 6f 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  o..      */.    
98b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
98c0: 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44  ete(db, pCol->pD
98d0: 66 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  flt);.      pCol
98e0: 2d 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65  ->pDflt = sqlite
98f0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 70  3ExprDup(db, pSp
9900: 61 6e 2d 3e 70 45 78 70 72 2c 20 45 58 50 52 44  an->pExpr, EXPRD
9910: 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20  UP_REDUCE);.    
9920: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
9930: 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29  db, pCol->zDflt)
9940: 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 44  ;.      pCol->zD
9950: 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 44 62 53  flt = sqlite3DbS
9960: 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72  trNDup(db, (char
9970: 2a 29 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c  *)pSpan->zStart,
9980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99a0: 20 20 20 20 20 20 28 69 6e 74 29 28 70 53 70 61        (int)(pSpa
99b0: 6e 2d 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d  n->zEnd - pSpan-
99c0: 3e 7a 53 74 61 72 74 29 29 3b 0a 20 20 20 20 7d  >zStart));.    }
99d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78  .  }.  sqlite3Ex
99e0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 53 70  prDelete(db, pSp
99f0: 61 6e 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  an->pExpr);.}../
9a00: 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74  *.** Designate t
9a10: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66  he PRIMARY KEY f
9a20: 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70  or the table.  p
9a30: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
9a40: 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63  f names .** of c
9a50: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d  olumns that form
9a60: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
9a70: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e  .  If pList is N
9a80: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ULL, then the.**
9a90: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
9aa0: 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  dded column of t
9ab0: 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  he table is the 
9ac0: 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a  primary key..**.
9ad0: 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68  ** A table can h
9ae0: 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
9af0: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
9b00: 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
9b10: 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d  dy has.** a prim
9b20: 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69  ary key (and thi
9b30: 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  s is the second 
9b40: 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65  primary key) the
9b50: 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65  n create an.** e
9b60: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
9b70: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
9b80: 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f  s on a single co
9b90: 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74  lumn whose datat
9ba0: 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a  ype is INTEGER,.
9bb0: 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  ** then we will 
9bc0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20  try to use that 
9bd0: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f  column as the ro
9be0: 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61  wid.  Set the Ta
9bf0: 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65  ble.iPKey.** fie
9c00: 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ld of the table 
9c10: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
9c20: 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64  on to be the ind
9c30: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54  ex of the.** INT
9c40: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
9c50: 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e   column.  Table.
9c60: 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20  iPKey is set to 
9c70: 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  -1 if there is.*
9c80: 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  * no INTEGER PRI
9c90: 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20  MARY KEY..**.** 
9ca0: 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f  If the key is no
9cb0: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
9cc0: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63  MARY KEY, then c
9cd0: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a  reate a unique.*
9ce0: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
9cf0: 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69  key.  No index i
9d00: 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e  s created for IN
9d10: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
9d20: 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Ys..*/.void sqli
9d30: 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
9d40: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9d50: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
9d60: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
9d70: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
9d80: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64  /* List of field
9d90: 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64   names to be ind
9da0: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
9db0: 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57  Error,      /* W
9dc0: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61  hat to do with a
9dd0: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66   uniqueness conf
9de0: 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75  lict */.  int au
9df0: 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54  toInc,      /* T
9e00: 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49  rue if the AUTOI
9e10: 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64  NCREMENT keyword
9e20: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
9e30: 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20   int sortOrder  
9e40: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f     /* SQLITE_SO_
9e50: 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f  ASC or SQLITE_SO
9e60: 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61  _DESC */.){.  Ta
9e70: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
9e80: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
9e90: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30   char *zType = 0
9ea0: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d  ;.  int iCol = -
9eb0: 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72  1, i;.  int nTer
9ec0: 6d 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30  m;.  if( pTab==0
9ed0: 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56   || IN_DECLARE_V
9ee0: 54 41 42 20 29 20 67 6f 74 6f 20 70 72 69 6d 61  TAB ) goto prima
9ef0: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69  ry_key_exit;.  i
9f00: 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  f( pTab->tabFlag
9f10: 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72  s & TF_HasPrimar
9f20: 79 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  yKey ){.    sqli
9f30: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
9f40: 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c  se, .      "tabl
9f50: 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72  e \"%s\" has mor
9f60: 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61  e than one prima
9f70: 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a  ry key", pTab->z
9f80: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
9f90: 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74  primary_key_exit
9fa0: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61  ;.  }.  pTab->ta
9fb0: 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73  bFlags |= TF_Has
9fc0: 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66  PrimaryKey;.  if
9fd0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
9fe0: 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e    iCol = pTab->n
9ff0: 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61  Col - 1;.    pTa
a000: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f  b->aCol[iCol].co
a010: 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41  lFlags |= COLFLA
a020: 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 7a  G_PRIMKEY;.    z
a030: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
a040: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
a050: 20 20 20 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20     nTerm = 1;.  
a060: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d  }else{.    nTerm
a070: 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
a080: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
a090: 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  nTerm; i++){.   
a0a0: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
a0b0: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
a0c0: 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
a0d0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
a0e0: 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
a0f0: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  zName, pTab->aCo
a100: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d  l[iCol].zName)==
a110: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
a120: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
a130: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46  colFlags |= COLF
a140: 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20  LAG_PRIMKEY;.   
a150: 20 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 70         zType = p
a160: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
a170: 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20  zType;.         
a180: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
a190: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
a1a0: 20 20 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d    }.  if( nTerm=
a1b0: 3d 31 0a 20 20 20 26 26 20 7a 54 79 70 65 20 26  =1.   && zType &
a1c0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
a1d0: 28 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52  (zType, "INTEGER
a1e0: 22 29 3d 3d 30 0a 20 20 20 26 26 20 73 6f 72 74  ")==0.   && sort
a1f0: 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f  Order==SQLITE_SO
a200: 5f 41 53 43 0a 20 20 29 7b 0a 20 20 20 20 70 54  _ASC.  ){.    pT
a210: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c  ab->iPKey = iCol
a220: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43  ;.    pTab->keyC
a230: 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f  onf = (u8)onErro
a240: 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61  r;.    assert( a
a250: 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74  utoInc==0 || aut
a260: 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70  oInc==1 );.    p
a270: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
a280: 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f   autoInc*TF_Auto
a290: 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 20 20 69  increment;.    i
a2a0: 66 28 20 70 4c 69 73 74 20 29 20 70 50 61 72 73  f( pList ) pPars
a2b0: 65 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 20  e->iPkSortOrder 
a2c0: 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f  = pList->a[0].so
a2d0: 72 74 4f 72 64 65 72 3b 0a 20 20 7d 65 6c 73 65  rtOrder;.  }else
a2e0: 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a   if( autoInc ){.
a2f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
a300: 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
a310: 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  T.    sqlite3Err
a320: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41  orMsg(pParse, "A
a330: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20  UTOINCREMENT is 
a340: 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20  only allowed on 
a350: 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54  an ".       "INT
a360: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
a370: 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  ");.#endif.  }el
a380: 73 65 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20  se{.    Vdbe *v 
a390: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
a3a0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20  .    Index *p;. 
a3b0: 20 20 20 69 66 28 20 76 20 29 20 70 50 61 72 73     if( v ) pPars
a3c0: 65 2d 3e 61 64 64 72 53 6b 69 70 50 4b 20 3d 20  e->addrSkipPK = 
a3d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a3e0: 30 28 76 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20  0(v, OP_Noop);. 
a3f0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 43 72     p = sqlite3Cr
a400: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
a410: 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74  , 0, 0, 0, pList
a420: 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 0a 20 20  , onError, 0,.  
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a440: 20 20 20 20 20 20 20 20 20 30 2c 20 73 6f 72 74           0, sort
a450: 4f 72 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 69  Order, 0);.    i
a460: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d  f( p ){.      p-
a470: 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 32 3b 0a  >autoIndex = 2;.
a480: 20 20 20 20 20 20 69 66 28 20 76 20 29 20 73 71        if( v ) sq
a490: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
a4a0: 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64  e(v, pParse->add
a4b0: 72 53 6b 69 70 50 4b 29 3b 0a 20 20 20 20 7d 0a  rSkipPK);.    }.
a4c0: 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
a4d0: 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f   }..primary_key_
a4e0: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45  exit:.  sqlite3E
a4f0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
a500: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29  arse->db, pList)
a510: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
a520: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43  *.** Add a new C
a530: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
a540: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
a550: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
a560: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
a570: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65  id sqlite3AddChe
a580: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ckConstraint(.  
a590: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
a5a0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
a5b0: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
a5c0: 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54  pCheckExpr  /* T
a5d0: 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  he check express
a5e0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ion */.){.#ifnde
a5f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
a600: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  ECK.  Table *pTa
a610: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
a620: 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 54 61  Table;.  if( pTa
a630: 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45  b && !IN_DECLARE
a640: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 70 54 61  _VTAB ){.    pTa
a650: 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69  b->pCheck = sqli
a660: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
a670: 64 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  d(pParse, pTab->
a680: 70 43 68 65 63 6b 2c 20 70 43 68 65 63 6b 45 78  pCheck, pCheckEx
a690: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  pr);.    if( pPa
a6a0: 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e  rse->constraintN
a6b0: 61 6d 65 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73  ame.n ){.      s
a6c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
a6d0: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 54  tName(pParse, pT
a6e0: 61 62 2d 3e 70 43 68 65 63 6b 2c 20 26 70 50 61  ab->pCheck, &pPa
a6f0: 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e  rse->constraintN
a700: 61 6d 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  ame, 1);.    }. 
a710: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
a720: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
a730: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
a740: 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  db, pCheckExpr);
a750: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
a760: 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  t the collation 
a770: 66 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  function of the 
a780: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
a790: 72 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d  rsed table colum
a7a0: 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c  n.** to the Coll
a7b0: 53 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  Seq given..*/.vo
a7c0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
a7d0: 6c 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a  lateType(Parse *
a7e0: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
a7f0: 54 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20  Token){.  Table 
a800: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  *p;.  int i;.  c
a810: 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20  har *zColl;     
a820: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75           /* Dequ
a830: 6f 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c  oted name of col
a840: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
a850: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
a860: 3b 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  ;..  if( (p = pP
a870: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
a880: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
a890: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
a8a0: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
a8b0: 3b 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69  ;.  zColl = sqli
a8c0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
a8d0: 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20  (db, pToken);.  
a8e0: 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
a8f0: 75 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  urn;..  if( sqli
a900: 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
a910: 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20  (pParse, zColl) 
a920: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
a930: 64 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  dx;.    sqlite3D
a940: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
a950: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20  l[i].zColl);.   
a960: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c   p->aCol[i].zCol
a970: 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20  l = zColl;.  .  
a980: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75    /* If the colu
a990: 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61  mn is declared a
a9a0: 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52  s "<name> PRIMAR
a9b0: 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74  Y KEY COLLATE <t
a9c0: 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68  ype>",.    ** th
a9d0: 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20  en an index may 
a9e0: 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65  have been create
a9f0: 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e  d on this column
aa00: 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20   before the.    
aa10: 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70  ** collation typ
aa20: 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72  e was added. Cor
aa30: 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20  rect this if it 
aa40: 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20  is the case..   
aa50: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78   */.    for(pIdx
aa60: 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  =p->pIndex; pIdx
aa70: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
aa80: 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  xt){.      asser
aa90: 74 28 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  t( pIdx->nKeyCol
aaa0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
aab0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
aac0: 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20  0]==i ){.       
aad0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d   pIdx->azColl[0]
aae0: 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43   = p->aCol[i].zC
aaf0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  oll;.      }.   
ab00: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
ab10: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
ab20: 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a  , zColl);.  }.}.
ab30: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
ab40: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
ab50: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
ab60: 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73 65  nce for database
ab70: 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a 20   native text.** 
ab80: 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69 66  encoding identif
ab90: 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69 6e  ied by the strin
aba0: 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  g zName, length 
abb0: 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nName..**.** If 
abc0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
abd0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
abe0: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
abf0: 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61  e, or not availa
ac00: 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61  ble.** in the da
ac10: 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65 6e  tabase native en
ac20: 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c  coding, the coll
ac30: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 73  ation factory is
ac40: 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72   invoked to.** r
ac50: 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74 68  equest it. If th
ac60: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74  e collation fact
ac70: 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ory does not sup
ac80: 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75 65  ply such a seque
ac90: 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20  nce,.** and the 
aca0: 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61 69  sequence is avai
acb0: 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72  lable in another
acc0: 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20   text encoding, 
acd0: 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20  then that is.** 
ace0: 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
acf0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65  ..**.** If no ve
ad00: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72 65  rsions of the re
ad10: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
ad20: 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65 20  ns sequence are 
ad30: 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a  available, or.**
ad40: 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 6f   another error o
ad50: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
ad60: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
ad70: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72 69  rror message wri
ad80: 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61  tten into.** pPa
ad90: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  rse..**.** This 
ada0: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72 61  routine is a wra
adb0: 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69  pper around sqli
adc0: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29  te3FindCollSeq()
add0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
ade0: 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63  ** invokes the c
adf0: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
ae00: 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63 6f   if the named co
ae10: 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  llation cannot b
ae20: 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67  e found.** and g
ae30: 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72 6f  enerates an erro
ae40: 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a  r message..**.**
ae50: 20 53 65 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74   See also: sqlit
ae60: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c  e3FindCollSeq(),
ae70: 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53   sqlite3GetCollS
ae80: 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  eq().*/.CollSeq 
ae90: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  *sqlite3LocateCo
aea0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
aeb0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
aec0: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74  *zName){.  sqlit
aed0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
aee0: 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20  >db;.  u8 enc = 
aef0: 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20 69 6e  ENC(db);.  u8 in
af00: 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69  itbusy = db->ini
af10: 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65  t.busy;.  CollSe
af20: 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f  q *pColl;..  pCo
af30: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
af40: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c  CollSeq(db, enc,
af50: 20 7a 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79   zName, initbusy
af60: 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75  );.  if( !initbu
af70: 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c  sy && (!pColl ||
af80: 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29   !pColl->xCmp) )
af90: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
afa0: 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28  lite3GetCollSeq(
afb0: 70 50 61 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f  pParse, enc, pCo
afc0: 6c 6c 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  ll, zName);.  }.
afd0: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
afe0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
aff0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
b000: 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  ll increment the
b010: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a   schema cookie..
b020: 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  **.** The schema
b030: 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20   cookie is used 
b040: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
b050: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  n the schema for
b060: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
b070: 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72   changes.  After
b080: 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68 61   each schema cha
b090: 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20  nge, the cookie 
b0a0: 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73  value.** changes
b0b0: 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73  .  When a proces
b0c0: 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74 68  s first reads th
b0d0: 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f  e schema it reco
b0e0: 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69  rds the.** cooki
b0f0: 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c 20  e.  Thereafter, 
b100: 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73  whenever it goes
b110: 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
b120: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63  atabase,.** it c
b130: 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65  hecks the cookie
b140: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
b150: 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74  e schema has not
b160: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63   changed.** sinc
b170: 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72 65  e it was last re
b180: 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70  ad..**.** This p
b190: 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c  lan is not compl
b1a0: 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f  etely bullet-pro
b1b0: 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69  of.  It is possi
b1c0: 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ble for.** the s
b1d0: 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20  chema to change 
b1e0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
b1f0: 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69  nd for the cooki
b200: 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62  e to be.** set b
b210: 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c  ack to prior val
b220: 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20  ue.  But schema 
b230: 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72  changes are infr
b240: 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68  equent.** and th
b250: 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  e probability of
b260: 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d   hitting the sam
b270: 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69  e cookie value i
b280: 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e  s only.** 1 chan
b290: 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20  ce in 2^32.  So 
b2a0: 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67  we're safe enoug
b2b0: 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  h..*/.void sqlit
b2c0: 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50  e3ChangeCookie(P
b2d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
b2e0: 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 72 31  t iDb){.  int r1
b2f0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
b300: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
b310: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
b320: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
b330: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
b340: 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  dbe;.  assert( s
b350: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
b360: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
b370: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ) );.  sqlite3Vd
b380: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
b390: 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b  nteger, db->aDb[
b3a0: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63  iDb].pSchema->sc
b3b0: 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72  hema_cookie+1, r
b3c0: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
b3d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
b3e0: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54  tCookie, iDb, BT
b3f0: 52 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49  REE_SCHEMA_VERSI
b400: 4f 4e 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74  ON, r1);.  sqlit
b410: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
b420: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
b430: 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74  ./*.** Measure t
b440: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
b450: 72 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74  racters needed t
b460: 6f 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76  o output the giv
b470: 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  en.** identifier
b480: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65  .  The number re
b490: 74 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20  turned includes 
b4a0: 61 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a  any quotes used.
b4b0: 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  ** but does not 
b4c0: 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c  include the null
b4d0: 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a   terminator..**.
b4e0: 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20  ** The estimate 
b4f0: 69 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e  is conservative.
b500: 20 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61    It might be la
b510: 72 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69  rger that what i
b520: 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64  s.** really need
b530: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
b540: 74 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f  t identLength(co
b550: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
b560: 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30  int n;.  for(n=0
b570: 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b  ; *z; n++, z++){
b580: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27  .    if( *z=='"'
b590: 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20   ){ n++; }.  }. 
b5a0: 20 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d   return n + 2;.}
b5b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
b5c0: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  t parameter is a
b5d0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
b5e0: 75 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68  utput buffer. Th
b5f0: 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72  e second .** par
b600: 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e  ameter is a poin
b610: 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ter to an intege
b620: 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  r that contains 
b630: 74 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a  the offset at.**
b640: 20 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20   which to write 
b650: 69 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  into the output 
b660: 62 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e  buffer. This fun
b670: 63 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65  ction copies the
b680: 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  .** nul-terminat
b690: 65 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65  ed string pointe
b6a0: 64 20 74 6f 20 62 79 20 74 68 65 20 74 68 69 72  d to by the thir
b6b0: 64 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69  d parameter, zSi
b6c0: 67 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f  gnedIdent,.** to
b6d0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f   the specified o
b6e0: 66 66 73 65 74 20 69 6e 20 74 68 65 20 62 75 66  ffset in the buf
b6f0: 66 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20  fer and updates 
b700: 2a 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a  *pIdx to refer.*
b710: 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  * to the first b
b720: 79 74 65 20 61 66 74 65 72 20 74 68 65 20 6c 61  yte after the la
b730: 73 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  st byte written 
b740: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
b750: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20  ..** .** If the 
b760: 73 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64  string zSignedId
b770: 65 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74  ent consists ent
b780: 69 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e  irely of alpha-n
b790: 75 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63  umeric.** charac
b7a0: 74 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62  ters, does not b
b7b0: 65 67 69 6e 20 77 69 74 68 20 61 20 64 69 67 69  egin with a digi
b7c0: 74 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20  t and is not an 
b7d0: 53 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20  SQL keyword,.** 
b7e0: 74 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65  then it is copie
b7f0: 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  d to the output 
b800: 62 75 66 66 65 72 20 65 78 61 63 74 6c 79 20 61  buffer exactly a
b810: 73 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69  s it is. Otherwi
b820: 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f  se,.** it is quo
b830: 74 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65  ted using double
b840: 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  -quotes..*/.stat
b850: 69 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74  ic void identPut
b860: 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70  (char *z, int *p
b870: 49 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e  Idx, char *zSign
b880: 65 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69  edIdent){.  unsi
b890: 67 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e  gned char *zIden
b8a0: 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  t = (unsigned ch
b8b0: 61 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74  ar*)zSignedIdent
b8c0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65  ;.  int i, j, ne
b8d0: 65 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a  edQuote;.  i = *
b8e0: 70 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30  pIdx;..  for(j=0
b8f0: 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b  ; zIdent[j]; j++
b900: 29 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  ){.    if( !sqli
b910: 74 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e  te3Isalnum(zIden
b920: 74 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b  t[j]) && zIdent[
b930: 6a 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b  j]!='_' ) break;
b940: 0a 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65  .  }.  needQuote
b950: 20 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67 69   = sqlite3Isdigi
b960: 74 28 7a 49 64 65 6e 74 5b 30 5d 29 20 7c 7c 20  t(zIdent[0]) || 
b970: 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f  sqlite3KeywordCo
b980: 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54  de(zIdent, j)!=T
b990: 4b 5f 49 44 3b 0a 20 20 69 66 28 20 21 6e 65 65  K_ID;.  if( !nee
b9a0: 64 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 6e 65  dQuote ){.    ne
b9b0: 65 64 51 75 6f 74 65 20 3d 20 7a 49 64 65 6e 74  edQuote = zIdent
b9c0: 5b 6a 5d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  [j];.  }..  if( 
b9d0: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
b9e0: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28  +] = '"';.  for(
b9f0: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
ba00: 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d  j++){.    z[i++]
ba10: 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20   = zIdent[j];.  
ba20: 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d    if( zIdent[j]=
ba30: 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  ='"' ) z[i++] = 
ba40: 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  '"';.  }.  if( n
ba50: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
ba60: 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20  ] = '"';.  z[i] 
ba70: 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69  = 0;.  *pIdx = i
ba80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
ba90: 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42  ate a CREATE TAB
baa0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70  LE statement app
bab0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
bac0: 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e   given.** table.
bad0: 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64    Memory to hold
bae0: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
baf0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62   statement is ob
bb00: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
bb10: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
bb20: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
bb30: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
bb40: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
bb50: 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54  ic char *createT
bb60: 61 62 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33  ableStmt(sqlite3
bb70: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b   *db, Table *p){
bb80: 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a  .  int i, k, n;.
bb90: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
bba0: 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53   char *zSep, *zS
bbb0: 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20 20 43 6f  ep2, *zEnd;.  Co
bbc0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20  lumn *pCol;.  n 
bbd0: 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20  = 0;.  for(pCol 
bbe0: 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20  = p->aCol, i=0; 
bbf0: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  i<p->nCol; i++, 
bc00: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b  pCol++){.    n +
bc10: 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43  = identLength(pC
bc20: 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20 35 3b 0a  ol->zName) + 5;.
bc30: 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74    }.  n += ident
bc40: 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29  Length(p->zName)
bc50: 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29 7b 20  ;.  if( n<50 ){ 
bc60: 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b 0a  .    zSep = "";.
bc70: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22 3b      zSep2 = ",";
bc80: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22 3b  .    zEnd = ")";
bc90: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 53  .  }else{.    zS
bca0: 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20 20  ep = "\n  ";.   
bcb0: 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20 22   zSep2 = ",\n  "
bcc0: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c 6e  ;.    zEnd = "\n
bcd0: 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 33  )";.  }.  n += 3
bce0: 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20  5 + 6*p->nCol;. 
bcf0: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
bd00: 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30 2c 20 6e  DbMallocRaw(0, n
bd10: 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d 74 3d 3d  );.  if( zStmt==
bd20: 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c  0 ){.    db->mal
bd30: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
bd40: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
bd50: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
bd60: 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c 20 22 43  ntf(n, zStmt, "C
bd70: 52 45 41 54 45 20 54 41 42 4c 45 20 22 29 3b 0a  REATE TABLE ");.
bd80: 20 20 6b 20 3d 20 73 71 6c 69 74 65 33 53 74 72    k = sqlite3Str
bd90: 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b 0a 20 20  len30(zStmt);.  
bda0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
bdb0: 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  &k, p->zName);. 
bdc0: 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28   zStmt[k++] = '(
bdd0: 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d  ';.  for(pCol=p-
bde0: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
bdf0: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
be00: 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  ++){.    static 
be10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 6f 6e  const char * con
be20: 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d 20 7b 0a  st azType[] = {.
be30: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54          /* SQLIT
be40: 45 5f 41 46 46 5f 54 45 58 54 20 20 20 20 2a 2f  E_AFF_TEXT    */
be50: 20 22 20 54 45 58 54 22 2c 0a 20 20 20 20 20 20   " TEXT",.      
be60: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    /* SQLITE_AFF_
be70: 4e 4f 4e 45 20 20 20 20 2a 2f 20 22 22 2c 0a 20  NONE    */ "",. 
be80: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45         /* SQLITE
be90: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 2a 2f 20  _AFF_NUMERIC */ 
bea0: 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20 20 20 20  " NUM",.        
beb0: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  /* SQLITE_AFF_IN
bec0: 54 45 47 45 52 20 2a 2f 20 22 20 49 4e 54 22 2c  TEGER */ " INT",
bed0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49  .        /* SQLI
bee0: 54 45 5f 41 46 46 5f 52 45 41 4c 20 20 20 20 2a  TE_AFF_REAL    *
bef0: 2f 20 22 20 52 45 41 4c 22 0a 20 20 20 20 7d 3b  / " REAL".    };
bf00: 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  .    int len;.  
bf10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
bf20: 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65  ype;..    sqlite
bf30: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20  3_snprintf(n-k, 
bf40: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29  &zStmt[k], zSep)
bf50: 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74  ;.    k += sqlit
bf60: 65 33 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d  e3Strlen30(&zStm
bf70: 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20  t[k]);.    zSep 
bf80: 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65  = zSep2;.    ide
bf90: 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c  ntPut(zStmt, &k,
bfa0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
bfb0: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
bfc0: 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c 49 54 45  >affinity-SQLITE
bfd0: 5f 41 46 46 5f 54 45 58 54 20 3e 3d 20 30 20 29  _AFF_TEXT >= 0 )
bfe0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
bff0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c  ol->affinity-SQL
c000: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3c 20 41  ITE_AFF_TEXT < A
c010: 72 72 61 79 53 69 7a 65 28 61 7a 54 79 70 65 29  rraySize(azType)
c020: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
c030: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
c040: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
c050: 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  T );.    testcas
c060: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  e( pCol->affinit
c070: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  y==SQLITE_AFF_NO
c080: 4e 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  NE );.    testca
c090: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
c0a0: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ty==SQLITE_AFF_N
c0b0: 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20 74 65  UMERIC );.    te
c0c0: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
c0d0: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
c0e0: 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a 20 20  FF_INTEGER );.  
c0f0: 20 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c    testcase( pCol
c100: 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49  ->affinity==SQLI
c110: 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b 0a 20  TE_AFF_REAL );. 
c120: 20 20 20 0a 20 20 20 20 7a 54 79 70 65 20 3d 20     .    zType = 
c130: 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61 66 66  azType[pCol->aff
c140: 69 6e 69 74 79 20 2d 20 53 51 4c 49 54 45 5f 41  inity - SQLITE_A
c150: 46 46 5f 54 45 58 54 5d 3b 0a 20 20 20 20 6c 65  FF_TEXT];.    le
c160: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
c170: 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20 20 20 20  n30(zType);.    
c180: 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66  assert( pCol->af
c190: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
c1a0: 46 46 5f 4e 4f 4e 45 20 0a 20 20 20 20 20 20 20  FF_NONE .       
c1b0: 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d 3e 61 66       || pCol->af
c1c0: 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65 33 41  finity==sqlite3A
c1d0: 66 66 69 6e 69 74 79 54 79 70 65 28 7a 54 79 70  ffinityType(zTyp
c1e0: 65 2c 20 30 29 20 29 3b 0a 20 20 20 20 6d 65 6d  e, 0) );.    mem
c1f0: 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a  cpy(&zStmt[k], z
c200: 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20 20  Type, len);.    
c210: 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61 73  k += len;.    as
c220: 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20 20  sert( k<=n );.  
c230: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  }.  sqlite3_snpr
c240: 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74  intf(n-k, &zStmt
c250: 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29  [k], "%s", zEnd)
c260: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d 74  ;.  return zStmt
c270: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a  ;.}../*.** Resiz
c280: 65 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63  e an Index objec
c290: 74 20 74 6f 20 68 6f 6c 64 20 4e 20 63 6f 6c 75  t to hold N colu
c2a0: 6d 6e 73 20 74 6f 74 61 6c 2e 20 20 52 65 74 75  mns total.  Retu
c2b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
c2c0: 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 53  on success and S
c2d0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 6e 20 61  QLITE_NOMEM on a
c2e0: 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a 2a 2f 0a  n OOM error..*/.
c2f0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 69 7a  static int resiz
c300: 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 73 71 6c  eIndexObject(sql
c310: 69 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20  ite3 *db, Index 
c320: 2a 70 49 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20  *pIdx, int N){. 
c330: 20 63 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 20   char *zExtra;. 
c340: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66   int nByte;.  if
c350: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
c360: 3d 4e 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =N ) return SQLI
c370: 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
c380: 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64   pIdx->isResized
c390: 3d 3d 30 20 29 3b 0a 20 20 6e 42 79 74 65 20 3d  ==0 );.  nByte =
c3a0: 20 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20   (sizeof(char*) 
c3b0: 2b 20 73 69 7a 65 6f 66 28 69 31 36 29 20 2b 20  + sizeof(i16) + 
c3c0: 31 29 2a 4e 3b 0a 20 20 7a 45 78 74 72 61 20 3d  1)*N;.  zExtra =
c3d0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
c3e0: 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b  Zero(db, nByte);
c3f0: 0a 20 20 69 66 28 20 7a 45 78 74 72 61 3d 3d 30  .  if( zExtra==0
c400: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
c410: 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 63 70 79  _NOMEM;.  memcpy
c420: 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61  (zExtra, pIdx->a
c430: 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66 28 63 68  zColl, sizeof(ch
c440: 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75  ar*)*pIdx->nColu
c450: 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43  mn);.  pIdx->azC
c460: 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 7a 45  oll = (char**)zE
c470: 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b  xtra;.  zExtra +
c480: 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a  = sizeof(char*)*
c490: 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 74  N;.  memcpy(zExt
c4a0: 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  ra, pIdx->aiColu
c4b0: 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36 29 2a  mn, sizeof(i16)*
c4c0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a  pIdx->nColumn);.
c4d0: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
c4e0: 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72 61 3b   = (i16*)zExtra;
c4f0: 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a  .  zExtra += siz
c500: 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20 6d 65  eof(i16)*N;.  me
c510: 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64  mcpy(zExtra, pId
c520: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 70  x->aSortOrder, p
c530: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Idx->nColumn);. 
c540: 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
c550: 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72 61 3b  r = (u8*)zExtra;
c560: 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  .  pIdx->nColumn
c570: 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e 69 73   = N;.  pIdx->is
c580: 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20 20 72  Resized = 1;.  r
c590: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c5a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61  .}../*.** Estima
c5b0: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72 6f 77  te the total row
c5c0: 20 77 69 64 74 68 20 66 6f 72 20 61 20 74 61 62   width for a tab
c5d0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
c5e0: 69 64 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65  id estimateTable
c5f0: 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70 54 61  Width(Table *pTa
c600: 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77  b){.  unsigned w
c610: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63 6f 6e  Table = 0;.  con
c620: 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43  st Column *pTabC
c630: 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  ol;.  int i;.  f
c640: 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c  or(i=pTab->nCol,
c650: 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61   pTabCol=pTab->a
c660: 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  Col; i>0; i--, p
c670: 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77  TabCol++){.    w
c680: 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43 6f 6c  Table += pTabCol
c690: 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 69  ->szEst;.  }.  i
c6a0: 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 3c 30  f( pTab->iPKey<0
c6b0: 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 20 70   ) wTable++;.  p
c6c0: 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 3d 20  Tab->szTabRow = 
c6d0: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77 54  sqlite3LogEst(wT
c6e0: 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  able*4);.}../*.*
c6f0: 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61  * Estimate the a
c700: 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 61  verage size of a
c710: 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e 64 65   row for an inde
c720: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
c730: 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57  d estimateIndexW
c740: 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49 64 78  idth(Index *pIdx
c750: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 77 49  ){.  unsigned wI
c760: 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ndex = 0;.  int 
c770: 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75 6d  i;.  const Colum
c780: 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  n *aCol = pIdx->
c790: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20  pTable->aCol;.  
c7a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d  for(i=0; i<pIdx-
c7b0: 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a  >nColumn; i++){.
c7c0: 20 20 20 20 69 31 36 20 78 20 3d 20 70 49 64 78      i16 x = pIdx
c7d0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
c7e0: 20 20 20 61 73 73 65 72 74 28 20 78 3c 70 49 64     assert( x<pId
c7f0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  x->pTable->nCol 
c800: 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20 2b 3d  );.    wIndex +=
c810: 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f 6c 5b   x<0 ? 1 : aCol[
c820: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
c830: 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 20  ]].szEst;.  }.  
c840: 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 20 3d  pIdx->szIdxRow =
c850: 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 77   sqlite3LogEst(w
c860: 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20  Index*4);.}../* 
c870: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 76  Return true if v
c880: 61 6c 75 65 20 78 20 69 73 20 66 6f 75 6e 64 20  alue x is found 
c890: 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72 73 74  any of the first
c8a0: 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 6f 66   nCol entries of
c8b0: 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74   aiCol[].*/.stat
c8c0: 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75 6d 6e  ic int hasColumn
c8d0: 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69 43 6f  (const i16 *aiCo
c8e0: 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74  l, int nCol, int
c8f0: 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 43   x){.  while( nC
c900: 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28 20 78  ol-- > 0 ) if( x
c910: 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 20 72  ==*(aiCol++) ) r
c920: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
c930: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
c940: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
c950: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 70 61  at the end of pa
c960: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
c970: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 74  ABLE statement t
c980: 68 61 74 0a 2a 2a 20 68 61 73 20 61 20 57 49 54  hat.** has a WIT
c990: 48 4f 55 54 20 52 4f 57 49 44 20 63 6c 61 75 73  HOUT ROWID claus
c9a0: 65 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  e.  The job of t
c9b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
c9c0: 6f 20 63 6f 6e 76 65 72 74 20 62 6f 74 68 0a 2a  o convert both.*
c9d0: 2a 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  * internal schem
c9e0: 61 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  a data structure
c9f0: 73 20 61 6e 64 20 74 68 65 20 67 65 6e 65 72 61  s and the genera
ca00: 74 65 64 20 56 44 42 45 20 63 6f 64 65 20 73 6f  ted VDBE code so
ca10: 20 74 68 61 74 20 74 68 65 79 0a 2a 2a 20 61 72   that they.** ar
ca20: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  e appropriate fo
ca30: 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  r a WITHOUT ROWI
ca40: 44 20 74 61 62 6c 65 20 69 6e 73 74 65 61 64 20  D table instead 
ca50: 6f 66 20 61 20 72 6f 77 69 64 20 74 61 62 6c 65  of a rowid table
ca60: 2e 0a 2a 2a 20 43 68 61 6e 67 65 73 20 69 6e 63  ..** Changes inc
ca70: 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lude:.**.**     
ca80: 28 31 29 20 20 43 6f 6e 76 65 72 74 20 74 68 65  (1)  Convert the
ca90: 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20   OP_CreateTable 
caa0: 69 6e 74 6f 20 61 6e 20 4f 50 5f 43 72 65 61 74  into an OP_Creat
cab0: 65 49 6e 64 65 78 2e 20 20 54 68 65 72 65 20 69  eIndex.  There i
cac0: 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 6e 6f  s.**          no
cad0: 20 72 6f 77 69 64 20 62 74 72 65 65 20 66 6f 72   rowid btree for
cae0: 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44   a WITHOUT ROWID
caf0: 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  .  Instead, the 
cb00: 63 61 6e 6f 6e 69 63 61 6c 0a 2a 2a 20 20 20 20  canonical.**    
cb10: 20 20 20 20 20 20 64 61 74 61 20 73 74 6f 72 61        data stora
cb20: 67 65 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67  ge is a covering
cb30: 20 69 6e 64 65 78 20 62 74 72 65 65 2e 0a 2a 2a   index btree..**
cb40: 20 20 20 20 20 28 32 29 20 20 42 79 70 61 73 73       (2)  Bypass
cb50: 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
cb60: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
cb70: 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79 0a 2a  er table entry.*
cb80: 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74  *          for t
cb90: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61  he PRIMARY KEY a
cba0: 73 20 74 68 65 20 74 68 65 20 70 72 69 6d 61 72  s the the primar
cbb0: 79 20 6b 65 79 20 69 6e 64 65 78 20 69 73 20 6e  y key index is n
cbc0: 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 69  ow.**          i
cbd0: 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65  dentified by the
cbe0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
cbf0: 61 62 6c 65 20 65 6e 74 72 79 20 6f 66 20 74 68  able entry of th
cc00: 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a  e table itself..
cc10: 2a 2a 20 20 20 20 20 28 33 29 20 20 53 65 74 20  **     (3)  Set 
cc20: 74 68 65 20 49 6e 64 65 78 2e 74 6e 75 6d 20 6f  the Index.tnum o
cc30: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
cc40: 59 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69  Y Index object i
cc50: 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  n the.**        
cc60: 20 20 73 63 68 65 6d 61 20 74 6f 20 74 68 65 20    schema to the 
cc70: 72 6f 6f 74 70 61 67 65 20 66 72 6f 6d 20 74 68  rootpage from th
cc80: 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a  e main table..**
cc90: 20 20 20 20 20 28 34 29 20 20 53 65 74 20 61 6c       (4)  Set al
cca0: 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  l columns of the
ccb0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 73 63 68   PRIMARY KEY sch
ccc0: 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f 20 62 65  ema object to be
ccd0: 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a 20 20 20   NOT NULL..**   
cce0: 20 20 28 35 29 20 20 41 64 64 20 61 6c 6c 20 74    (5)  Add all t
ccf0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  able columns to 
cd00: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
cd10: 49 6e 64 65 78 20 6f 62 6a 65 63 74 0a 2a 2a 20  Index object.** 
cd20: 20 20 20 20 20 20 20 20 20 73 6f 20 74 68 61 74           so that
cd30: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
cd40: 20 69 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69   is a covering i
cd50: 6e 64 65 78 2e 20 20 54 68 65 20 73 75 72 70 6c  ndex.  The surpl
cd60: 75 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 63  us.**          c
cd70: 6f 6c 75 6d 6e 73 20 61 72 65 20 70 61 72 74 20  olumns are part 
cd80: 6f 66 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65  of KeyInfo.nXFie
cd90: 6c 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 75  ld and are not u
cda0: 73 65 64 20 66 6f 72 0a 2a 2a 20 20 20 20 20 20  sed for.**      
cdb0: 20 20 20 20 73 6f 72 74 69 6e 67 20 6f 72 20 6c      sorting or l
cdc0: 6f 6f 6b 75 70 20 6f 72 20 75 6e 69 71 75 65 6e  ookup or uniquen
cdd0: 65 73 73 20 63 68 65 63 6b 73 2e 0a 2a 2a 20 20  ess checks..**  
cde0: 20 20 20 28 36 29 20 20 52 65 70 6c 61 63 65 20     (6)  Replace 
cdf0: 74 68 65 20 72 6f 77 69 64 20 74 61 69 6c 20 6f  the rowid tail o
ce00: 6e 20 61 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61  n all automatica
ce10: 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 20 55 4e  lly generated UN
ce20: 49 51 55 45 0a 2a 2a 20 20 20 20 20 20 20 20 20  IQUE.**         
ce30: 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 74 68   indices with th
ce40: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  e PRIMARY KEY co
ce50: 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lumns..*/.static
ce60: 20 76 6f 69 64 20 63 6f 6e 76 65 72 74 54 6f 57   void convertToW
ce70: 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65  ithoutRowidTable
ce80: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
ce90: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
cea0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 49  Index *pIdx;.  I
ceb0: 6e 64 65 78 20 2a 70 50 6b 3b 0a 20 20 69 6e 74  ndex *pPk;.  int
cec0: 20 6e 50 6b 3b 0a 20 20 69 6e 74 20 69 2c 20 6a   nPk;.  int i, j
ced0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
cee0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
cef0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
cf00: 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 2f 2a 20 43  ->pVdbe;..  /* C
cf10: 6f 6e 76 65 72 74 20 74 68 65 20 4f 50 5f 43 72  onvert the OP_Cr
cf20: 65 61 74 65 54 61 62 6c 65 20 6f 70 63 6f 64 65  eateTable opcode
cf30: 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 6f 72 6d   that would norm
cf40: 61 6c 6c 79 20 63 72 65 61 74 65 20 74 68 65 0a  ally create the.
cf50: 20 20 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 66    ** root-page f
cf60: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 6e 74  or the table int
cf70: 6f 20 61 20 4f 50 5f 43 72 65 61 74 65 49 6e 64  o a OP_CreateInd
cf80: 65 78 20 6f 70 63 6f 64 65 2e 20 20 54 68 65 20  ex opcode.  The 
cf90: 69 6e 64 65 78 0a 20 20 2a 2a 20 63 72 65 61 74  index.  ** creat
cfa0: 65 64 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ed will become t
cfb0: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
cfc0: 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ndex..  */.  if(
cfd0: 20 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54   pParse->addrCrT
cfe0: 61 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ab ){.    assert
cff0: 28 20 76 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ( v );.    sqlit
d000: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70  e3VdbeGetOp(v, p
d010: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
d020: 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43  )->opcode = OP_C
d030: 72 65 61 74 65 49 6e 64 65 78 3b 0a 20 20 7d 0a  reateIndex;.  }.
d040: 0a 20 20 2f 2a 20 42 79 70 61 73 73 20 74 68 65  .  /* Bypass the
d050: 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
d060: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 62 74 72   PRIMARY KEY btr
d070: 65 65 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  ee and the sqlit
d080: 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74 61  e_master.  ** ta
d090: 62 6c 65 20 65 6e 74 72 79 2e 0a 20 20 2a 2f 0a  ble entry..  */.
d0a0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64    if( pParse->ad
d0b0: 64 72 53 6b 69 70 50 4b 20 29 7b 0a 20 20 20 20  drSkipPK ){.    
d0c0: 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 20  assert( v );.   
d0d0: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
d0e0: 70 28 76 2c 20 70 50 61 72 73 65 2d 3e 61 64 64  p(v, pParse->add
d0f0: 72 53 6b 69 70 50 4b 29 2d 3e 6f 70 63 6f 64 65  rSkipPK)->opcode
d100: 20 3d 20 4f 50 5f 47 6f 74 6f 3b 0a 20 20 7d 0a   = OP_Goto;.  }.
d110: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
d120: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64   PRIMARY KEY ind
d130: 65 78 2e 20 20 4f 72 2c 20 69 66 20 74 68 69 73  ex.  Or, if this
d140: 20 74 61 62 6c 65 20 77 61 73 20 6f 72 69 67 69   table was origi
d150: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61 6e 20 49 4e  nally.  ** an IN
d160: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
d170: 59 20 74 61 62 6c 65 2c 20 63 72 65 61 74 65 20  Y table, create 
d180: 61 20 6e 65 77 20 50 52 49 4d 41 52 59 20 4b 45  a new PRIMARY KE
d190: 59 20 69 6e 64 65 78 2e 20 0a 20 20 2a 2f 0a 20  Y index. .  */. 
d1a0: 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79   if( pTab->iPKey
d1b0: 3e 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  >=0 ){.    ExprL
d1c0: 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 20 20  ist *pList;.    
d1d0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
d1e0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
d1f0: 61 72 73 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  arse, 0, 0);.   
d200: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
d210: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 69 73  return;.    pLis
d220: 74 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[0].zName = 
d230: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
d240: 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20  pParse->db,.    
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70      pTab->aCol[p
d280: 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d  Tab->iPKey].zNam
d290: 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61  e);.    pList->a
d2a0: 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
d2b0: 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f  pParse->iPkSortO
d2c0: 72 64 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74  rder;.    assert
d2d0: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ( pParse->pNewTa
d2e0: 62 6c 65 3d 3d 70 54 61 62 20 29 3b 0a 20 20 20  ble==pTab );.   
d2f0: 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 43 72   pPk = sqlite3Cr
d300: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
d310: 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74  , 0, 0, 0, pList
d320: 2c 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 2c  , pTab->keyConf,
d330: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
d340: 20 20 69 66 28 20 70 50 6b 3d 3d 30 20 29 20 72    if( pPk==0 ) r
d350: 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b 2d 3e  eturn;.    pPk->
d360: 61 75 74 6f 49 6e 64 65 78 20 3d 20 32 3b 0a 20  autoIndex = 2;. 
d370: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d     pTab->iPKey =
d380: 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   -1;.  }else{.  
d390: 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50    pPk = sqlite3P
d3a0: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70  rimaryKeyIndex(p
d3b0: 54 61 62 29 3b 0a 20 20 7d 0a 20 20 70 50 6b 2d  Tab);.  }.  pPk-
d3c0: 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 31 3b  >isCovering = 1;
d3d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d  .  assert( pPk!=
d3e0: 30 20 29 3b 0a 20 20 6e 50 6b 20 3d 20 70 50 6b  0 );.  nPk = pPk
d3f0: 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a  ->nKeyCol;..  /*
d400: 20 4d 61 6b 65 20 73 75 72 65 20 65 76 65 72 79   Make sure every
d410: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 50   column of the P
d420: 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 4e 4f  RIMARY KEY is NO
d430: 54 20 4e 55 4c 4c 20 2a 2f 0a 20 20 66 6f 72 28  T NULL */.  for(
d440: 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29  i=0; i<nPk; i++)
d450: 7b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c  {.    pTab->aCol
d460: 5b 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  [pPk->aiColumn[i
d470: 5d 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a  ]].notNull = 1;.
d480: 20 20 7d 0a 20 20 70 50 6b 2d 3e 75 6e 69 71 4e    }.  pPk->uniqN
d490: 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 0a 20 20 2f  otNull = 1;..  /
d4a0: 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
d4b0: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
d4c0: 45 59 20 69 73 20 74 68 65 20 74 61 62 6c 65 20  EY is the table 
d4d0: 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 70  root page */.  p
d4e0: 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62 2d  Pk->tnum = pTab-
d4f0: 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64  >tnum;..  /* Upd
d500: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
d510: 79 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  y representation
d520: 20 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 20 69   of all UNIQUE i
d530: 6e 64 69 63 65 73 20 62 79 20 63 6f 6e 76 65 72  ndices by conver
d540: 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 69  ting.  ** the fi
d550: 6e 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e  nal rowid column
d560: 20 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72   into one or mor
d570: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
d580: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20   PRIMARY KEY..  
d590: 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54  */.  for(pIdx=pT
d5a0: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
d5b0: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
d5c0: 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  xt){.    int n;.
d5d0: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 75      if( pIdx->au
d5e0: 74 6f 49 6e 64 65 78 3d 3d 32 20 29 20 63 6f 6e  toIndex==2 ) con
d5f0: 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 69  tinue;.    for(i
d600: 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b  =n=0; i<nPk; i++
d610: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61  ){.      if( !ha
d620: 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69  sColumn(pIdx->ai
d630: 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b  Column, pIdx->nK
d640: 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f  eyCol, pPk->aiCo
d650: 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a  lumn[i]) ) n++;.
d660: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3d      }.    if( n=
d670: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
d680: 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 20 73  his index is a s
d690: 75 70 65 72 73 65 74 20 6f 66 20 74 68 65 20 70  uperset of the p
d6a0: 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
d6b0: 20 20 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d      pIdx->nColum
d6c0: 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  n = pIdx->nKeyCo
d6d0: 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  l;.      continu
d6e0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
d6f0: 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65   resizeIndexObje
d700: 63 74 28 64 62 2c 20 70 49 64 78 2c 20 70 49 64  ct(db, pIdx, pId
d710: 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 29 20 29 20  x->nKeyCol+n) ) 
d720: 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28  return;.    for(
d730: 69 3d 30 2c 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65  i=0, j=pIdx->nKe
d740: 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b  yCol; i<nPk; i++
d750: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68 61  ){.      if( !ha
d760: 73 43 6f 6c 75 6d 6e 28 70 49 64 78 2d 3e 61 69  sColumn(pIdx->ai
d770: 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b  Column, pIdx->nK
d780: 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f  eyCol, pPk->aiCo
d790: 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a 20 20 20 20  lumn[i]) ){.    
d7a0: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
d7b0: 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 69 43  mn[j] = pPk->aiC
d7c0: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
d7d0: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a    pIdx->azColl[j
d7e0: 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b  ] = pPk->azColl[
d7f0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b  i];.        j++;
d800: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d810: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
d820: 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e  >nColumn>=pIdx->
d830: 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20  nKeyCol+n );.   
d840: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e   assert( pIdx->n
d850: 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d  Column>=j );.  }
d860: 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 74  ..  /* Add all t
d870: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  able columns to 
d880: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
d890: 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 20 69 66 28  index.  */.  if(
d8a0: 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20   nPk<pTab->nCol 
d8b0: 29 7b 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a  ){.    if( resiz
d8c0: 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c  eIndexObject(db,
d8d0: 20 70 50 6b 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c   pPk, pTab->nCol
d8e0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  ) ) return;.    
d8f0: 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20  for(i=0, j=nPk; 
d900: 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b  i<pTab->nCol; i+
d910: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 68  +){.      if( !h
d920: 61 73 43 6f 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69  asColumn(pPk->ai
d930: 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b  Column, j, i) ){
d940: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d950: 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20   j<pPk->nColumn 
d960: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e  );.        pPk->
d970: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b  aiColumn[j] = i;
d980: 0a 20 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 7a  .        pPk->az
d990: 43 6f 6c 6c 5b 6a 5d 20 3d 20 22 42 49 4e 41 52  Coll[j] = "BINAR
d9a0: 59 22 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b 3b  Y";.        j++;
d9b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d9c0: 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d 3e     assert( pPk->
d9d0: 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20  nColumn==j );.  
d9e0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
d9f0: 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c  nCol==j );.  }el
da00: 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43 6f  se{.    pPk->nCo
da10: 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  lumn = pTab->nCo
da20: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
da30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
da40: 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74  called to report
da50: 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74   the final ")" t
da60: 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a  hat terminates.*
da70: 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  * a CREATE TABLE
da80: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
da90: 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75  * The table stru
daa0: 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72  cture that other
dab0: 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73   action routines
dac0: 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64   have been build
dad0: 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  ing.** is added 
dae0: 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  to the internal 
daf0: 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73  hash tables, ass
db00: 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20  uming no errors 
db10: 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64  have.** occurred
db20: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79  ..**.** An entry
db30: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69   for the table i
db40: 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61  s made in the ma
db50: 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69  ster table on di
db60: 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68  sk, unless.** th
db70: 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  is is a temporar
db80: 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69  y table or db->i
db90: 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68  nit.busy==1.  Wh
dba0: 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  en db->init.busy
dbb0: 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20  ==1.** it means 
dbc0: 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
dbd0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
dbe0: 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77   table because w
dbf0: 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63  e just.** connec
dc00: 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ted to the datab
dc10: 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74  ase or because t
dc20: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
dc30: 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65   table has.** re
dc40: 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20  cently changed, 
dc50: 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  so the entry for
dc60: 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65   this table alre
dc70: 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a  ady exists in.**
dc80: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
dc90: 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f  er table.  We do
dca0: 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65   not want to cre
dcb0: 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a  ate it again..**
dcc0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65  .** If the pSele
dcd0: 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ct argument is n
dce0: 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e  ot NULL, it mean
dcf0: 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74  s that this rout
dd00: 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65  ine.** was calle
dd10: 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61  d to create a ta
dd20: 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72  ble generated fr
dd30: 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45  om a .** "CREATE
dd40: 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45   TABLE ... AS SE
dd50: 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d  LECT ..." statem
dd60: 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e  ent.  The column
dd70: 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65   names of.** the
dd80: 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20   new table will 
dd90: 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74  match the result
dda0: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
ddb0: 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  CT..*/.void sqli
ddc0: 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50  te3EndTable(.  P
ddd0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
dde0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
ddf0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
de00: 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20  en *pCons,      
de10: 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20       /* The ',' 
de20: 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20  token after the 
de30: 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e  last column defn
de40: 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45  . */.  Token *pE
de50: 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  nd,            /
de60: 2a 20 54 68 65 20 27 29 27 20 62 65 66 6f 72 65  * The ')' before
de70: 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20   options in the 
de80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a  CREATE TABLE */.
de90: 20 20 75 38 20 74 61 62 4f 70 74 73 2c 20 20 20    u8 tabOpts,   
dea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
deb0: 72 61 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73  ra table options
dec0: 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a  . Usually 0. */.
ded0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
dee0: 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c  t         /* Sel
def0: 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41  ect from a "CREA
df00: 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  TE ... AS SELECT
df10: 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  " */.){.  Table 
df20: 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
df30: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74      /* The new t
df40: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
df50: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
df60: 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62  db; /* The datab
df70: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
df80: 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
df90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dfa0: 20 44 61 74 61 62 61 73 65 20 69 6e 20 77 68 69   Database in whi
dfb0: 63 68 20 74 68 65 20 74 61 62 6c 65 20 6c 69 76  ch the table liv
dfc0: 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  es */.  Index *p
dfd0: 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Idx;            
dfe0: 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20    /* An implied 
dff0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62  index of the tab
e000: 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 28 70 45  le */..  if( (pE
e010: 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
e020: 3d 3d 30 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  ==0) || db->mall
e030: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
e040: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 20  return;.  }.  p 
e050: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
e060: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
e070: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
e080: 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62  ert( !db->init.b
e090: 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74 20  usy || !pSelect 
e0a0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
e0b0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
e0c0: 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61   1 it means we a
e0d0: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53  re reading the S
e0e0: 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20  QL off the.  ** 
e0f0: 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20  "sqlite_master" 
e100: 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  or "sqlite_temp_
e110: 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
e120: 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20   the disk..  ** 
e130: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
e140: 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69  to the disk agai
e150: 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
e160: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
e170: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  .  ** for the ta
e180: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ble from the db-
e190: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69  >init.newTnum fi
e1a0: 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20  eld.  (The page 
e1b0: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75  number.  ** shou
e1c0: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74  ld have been put
e1d0: 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71   there by the sq
e1e0: 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69  liteOpenCb routi
e1f0: 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ne.).  */.  if( 
e200: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
e210: 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64  .    p->tnum = d
e220: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
e230: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 69  .  }..  /* Speci
e240: 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  al processing fo
e250: 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
e260: 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 20  Tables */.  if( 
e270: 74 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69 74  tabOpts & TF_Wit
e280: 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20 20  houtRowid ){.   
e290: 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67   if( (p->tabFlag
e2a0: 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65  s & TF_Autoincre
e2b0: 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 73  ment) ){.      s
e2c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
e2d0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
e2e0: 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20   "AUTOINCREMENT 
e2f0: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 57  not allowed on W
e300: 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
e310: 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74  les");.      ret
e320: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  urn;.    }.    i
e330: 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20  f( (p->tabFlags 
e340: 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b  & TF_HasPrimaryK
e350: 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ey)==0 ){.      
e360: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e370: 70 50 61 72 73 65 2c 20 22 50 52 49 4d 41 52 59  pParse, "PRIMARY
e380: 20 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e 20   KEY missing on 
e390: 74 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a 4e  table %s", p->zN
e3a0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
e3b0: 0a 20 20 20 20 20 20 70 2d 3e 74 61 62 46 6c 61  .      p->tabFla
e3c0: 67 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75 74  gs |= TF_Without
e3d0: 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e  Rowid;.      con
e3e0: 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77  vertToWithoutRow
e3f0: 69 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  idTable(pParse, 
e400: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  p);.    }.  }.. 
e410: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
e420: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
e430: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  p->pSchema);..#i
e440: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e450: 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73  T_CHECK.  /* Res
e460: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c  olve names in al
e470: 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  l CHECK constrai
e480: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  nt expressions..
e490: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43    */.  if( p->pC
e4a0: 68 65 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  heck ){.    sqli
e4b0: 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65  te3ResolveSelfRe
e4c0: 66 65 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20  ference(pParse, 
e4d0: 70 2c 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 30  p, NC_IsCheck, 0
e4e0: 2c 20 70 2d 3e 70 43 68 65 63 6b 29 3b 0a 20 20  , p->pCheck);.  
e4f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
e500: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
e510: 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a  _CHECK) */..  /*
e520: 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 61 76   Estimate the av
e530: 65 72 61 67 65 20 72 6f 77 20 73 69 7a 65 20 66  erage row size f
e540: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  or the table and
e550: 20 66 6f 72 20 61 6c 6c 20 69 6d 70 6c 69 65 64   for all implied
e560: 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 65 73   indices */.  es
e570: 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68  timateTableWidth
e580: 28 70 29 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d  (p);.  for(pIdx=
e590: 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
e5a0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
e5b0: 74 29 7b 0a 20 20 20 20 65 73 74 69 6d 61 74 65  t){.    estimate
e5c0: 49 6e 64 65 78 57 69 64 74 68 28 70 49 64 78 29  IndexWidth(pIdx)
e5d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e  ;.  }..  /* If n
e5e0: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c  ot initializing,
e5f0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72   then create a r
e600: 65 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65  ecord for the ne
e610: 77 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20  w table.  ** in 
e620: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
e630: 52 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64  R table of the d
e640: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  atabase..  **.  
e650: 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  ** If this is a 
e660: 54 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c  TEMPORARY table,
e670: 20 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79   write the entry
e680: 20 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69   into the auxili
e690: 61 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e  ary.  ** file in
e6a0: 73 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68  stead of into th
e6b0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
e6c0: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
e6d0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
e6e0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  ){.    int n;.  
e6f0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
e700: 68 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f  har *zType;    /
e710: 2a 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62  * "view" or "tab
e720: 6c 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  le" */.    char 
e730: 2a 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56  *zType2;   /* "V
e740: 49 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20  IEW" or "TABLE" 
e750: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  */.    char *zSt
e760: 6d 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f  mt;    /* Text o
e770: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
e780: 4c 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45  LE or CREATE VIE
e790: 57 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a  W statement */..
e7a0: 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47      v = sqlite3G
e7b0: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
e7c0: 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 76 3d      if( NEVER(v=
e7d0: 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  =0) ) return;.. 
e7e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e7f0: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
e800: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20  , 0);..    /* . 
e810: 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65     ** Initialize
e820: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e   zType for the n
e830: 65 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65  ew view or table
e840: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
e850: 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
e860: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
e870: 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
e880: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62      zType = "tab
e890: 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  le";.      zType
e8a0: 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66  2 = "TABLE";.#if
e8b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e8c0: 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b  _VIEW.    }else{
e8d0: 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
e8e0: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
e8f0: 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20  = "view";.      
e900: 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b  zType2 = "VIEW";
e910: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
e920: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
e930: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
e940: 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
e950: 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
e960: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
e970: 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
e980: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
e990: 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
e9a0: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
e9b0: 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
e9c0: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  s in register pP
e9d0: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20  arse->regRoot.. 
e9e0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63     **.    ** Onc
e9f0: 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  e the SELECT has
ea00: 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73   been coded by s
ea10: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20  qlite3Select(), 
ea20: 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a  it is in a.    *
ea30: 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65  * suitable state
ea40: 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68   to query for th
ea50: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
ea60: 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75  nd types to be u
ea70: 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  sed.    ** by th
ea80: 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20  e new table..   
ea90: 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61   **.    ** A sha
eaa0: 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d  red-cache write-
eab0: 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
eac0: 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ired to write to
ead0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a   the new table,.
eae0: 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65      ** as a sche
eaf0: 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76  ma-lock must hav
eb00: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  e already been o
eb10: 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74  btained to creat
eb20: 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20  e it. Since.    
eb30: 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  ** a schema-lock
eb40: 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74   excludes all ot
eb50: 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65  her database use
eb60: 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  rs, the write-lo
eb70: 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20  ck would.    ** 
eb80: 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20  be redundant..  
eb90: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
eba0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65  lect ){.      Se
ebb0: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
ebc0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c       Table *pSel
ebd0: 54 61 62 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  Tab;..      asse
ebe0: 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d  rt(pParse->nTab=
ebf0: 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  =1);.      sqlit
ec00: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
ec10: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
ec20: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
ec30: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
ec40: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
ec50: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 49 53  5(v, OPFLAG_P2IS
ec60: 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50 61 72  REG);.      pPar
ec70: 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a 20 20  se->nTab = 2;.  
ec80: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
ec90: 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74 2c  tDestInit(&dest,
eca0: 20 53 52 54 5f 54 61 62 6c 65 2c 20 31 29 3b 0a   SRT_Table, 1);.
ecb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
ecc0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
ecd0: 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20  ect, &dest);.   
ece0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ecf0: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
ed00: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
ed10: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
ed20: 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  ){.        pSelT
ed30: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
ed40: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
ed50: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a  arse, pSelect);.
ed60: 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 6c          if( pSel
ed70: 54 61 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Tab==0 ) return;
ed80: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ed90: 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20   p->aCol==0 );. 
eda0: 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f 6c 20 3d         p->nCol =
edb0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
edc0: 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 20          p->aCol 
edd0: 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b  = pSelTab->aCol;
ede0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
edf0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
ee00: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
ee10: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  l = 0;.        s
ee20: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
ee30: 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a  e(db, pSelTab);.
ee40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
ee50: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
ee60: 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
ee70: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74  of the CREATE st
ee80: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69  atement */.    i
ee90: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
eea0: 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61      zStmt = crea
eeb0: 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20  teTableStmt(db, 
eec0: 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
eed0: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64       Token *pEnd
eee0: 32 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26 70  2 = tabOpts ? &p
eef0: 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
ef00: 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20 20  n : pEnd;.      
ef10: 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32 2d  n = (int)(pEnd2-
ef20: 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61  >z - pParse->sNa
ef30: 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20  meToken.z);.    
ef40: 20 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b 30    if( pEnd2->z[0
ef50: 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70 45  ]!=';' ) n += pE
ef60: 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 53  nd2->n;.      zS
ef70: 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
ef80: 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20  intf(db, .      
ef90: 20 20 20 20 22 43 52 45 41 54 45 20 25 73 20 25      "CREATE %s %
efa0: 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c  .*s", zType2, n,
efb0: 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
efc0: 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20  ken.z.      );. 
efd0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73     }..    /* A s
efe0: 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f  lot for the reco
eff0: 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  rd has already b
f000: 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  een allocated in
f010: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c   the .    ** SQL
f020: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
f030: 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20  .  We just need 
f040: 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73  to update that s
f050: 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20  lot with all.   
f060: 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   ** the informat
f070: 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63  ion we've collec
f080: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
f090: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
f0a0: 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
f0b0: 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22   "UPDATE %Q.%s "
f0c0: 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74  .         "SET t
f0d0: 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25  ype='%s', name=%
f0e0: 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20  Q, tbl_name=%Q, 
f0f0: 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71  rootpage=#%d, sq
f100: 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57  l=%Q ".       "W
f110: 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c  HERE rowid=#%d",
f120: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
f130: 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
f140: 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
f150: 20 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20      zType,.     
f160: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
f170: 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20   p->zName,.     
f180: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
f190: 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20  ,.      zStmt,. 
f1a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67       pParse->reg
f1b0: 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20  Rowid.    );.   
f1c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f1d0: 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73  b, zStmt);.    s
f1e0: 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b  qlite3ChangeCook
f1f0: 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ie(pParse, iDb);
f200: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f210: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
f220: 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  ENT.    /* Check
f230: 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65   to see if we ne
f240: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
f250: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
f260: 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a  table for.    **
f270: 20 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f   keeping track o
f280: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  f autoincrement 
f290: 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  keys..    */.   
f2a0: 20 69 66 28 20 70 2d 3e 74 61 62 46 6c 61 67 73   if( p->tabFlags
f2b0: 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
f2c0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 44 62 20  ent ){.      Db 
f2d0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
f2e0: 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  iDb];.      asse
f2f0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
f300: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
f310: 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20  Db, 0) );.      
f320: 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61  if( pDb->pSchema
f330: 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a  ->pSeqTab==0 ){.
f340: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e          sqlite3N
f350: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
f360: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  e,.          "CR
f370: 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71  EATE TABLE %Q.sq
f380: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61  lite_sequence(na
f390: 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20  me,seq)",.      
f3a0: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20      pDb->zName. 
f3b0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
f3c0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
f3d0: 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65      /* Reparse e
f3e0: 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64  verything to upd
f3f0: 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
f400: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
f410: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56   */.    sqlite3V
f420: 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
f430: 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20  aOp(v, iDb,.    
f440: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
f450: 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e  rintf(db, "tbl_n
f460: 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70  ame='%q' AND typ
f470: 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20 70  e!='trigger'", p
f480: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a  ->zName));.  }..
f490: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61  .  /* Add the ta
f4a0: 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65  ble to the in-me
f4b0: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
f4c0: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
f4d0: 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
f4e0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
f4f0: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64  .    Table *pOld
f500: 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  ;.    Schema *pS
f510: 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65  chema = p->pSche
f520: 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ma;.    assert( 
f530: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
f540: 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
f550: 30 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  0) );.    pOld =
f560: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
f570: 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  rt(&pSchema->tbl
f580: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a  Hash, p->zName,.
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
f5b0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
f5c0: 7a 4e 61 6d 65 29 2c 70 29 3b 0a 20 20 20 20 69  zName),p);.    i
f5d0: 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20  f( pOld ){.     
f5e0: 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64   assert( p==pOld
f5f0: 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
f600: 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
f610: 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72  inside HashInser
f620: 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d  t() */.      db-
f630: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
f640: 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  1;.      return;
f650: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
f660: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
f670: 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  ;.    db->flags 
f680: 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
f690: 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65  Changes;..#ifnde
f6a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
f6b0: 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28  TERTABLE.    if(
f6c0: 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a   !p->pSelect ){.
f6d0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
f6e0: 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
f6f0: 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e   char *)pParse->
f700: 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20  sNameToken.z;.  
f710: 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20      int nName;. 
f720: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53       assert( !pS
f730: 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26  elect && pCons &
f740: 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  & pEnd );.      
f750: 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20  if( pCons->z==0 
f760: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73  ){.        pCons
f770: 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d   = pEnd;.      }
f780: 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28  .      nName = (
f790: 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72  int)((const char
f7a0: 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e   *)pCons->z - zN
f7b0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  ame);.      p->a
f7c0: 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33  ddColOffset = 13
f7d0: 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68   + sqlite3Utf8Ch
f7e0: 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61  arLen(zName, nNa
f7f0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  me);.    }.#endi
f800: 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  f.  }.}..#ifndef
f810: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
f820: 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73  W./*.** The pars
f830: 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  er calls this ro
f840: 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74  utine in order t
f850: 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56  o create a new V
f860: 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  IEW.*/.void sqli
f870: 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20  te3CreateView(. 
f880: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
f890: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
f8a0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
f8b0: 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20  Token *pBegin,  
f8c0: 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45     /* The CREATE
f8d0: 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69   token that begi
f8e0: 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ns the statement
f8f0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61   */.  Token *pNa
f900: 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  me1,     /* The 
f910: 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73  token that holds
f920: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
f930: 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e   view */.  Token
f940: 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
f950: 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
f960: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
f970: 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
f980: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
f990: 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73     /* A SELECT s
f9a0: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
f9b0: 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
f9c0: 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20  w view */.  int 
f9d0: 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  isTemp,        /
f9e0: 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d  * TRUE for a TEM
f9f0: 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20  PORARY view */. 
fa00: 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20   int noErr      
fa10: 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20      /* Suppress 
fa20: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69  error messages i
fa30: 66 20 56 49 45 57 20 61 6c 72 65 61 64 79 20 65  f VIEW already e
fa40: 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  xists */.){.  Ta
fa50: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b  ble *p;.  int n;
fa60: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
fa70: 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a  ;.  Token sEnd;.
fa80: 20 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a    DbFixer sFix;.
fa90: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
faa0: 20 30 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20   0;.  int iDb;. 
fab0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
fac0: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66  Parse->db;..  if
fad0: 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30  ( pParse->nVar>0
fae0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
faf0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
fb00: 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20  "parameters are 
fb10: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76  not allowed in v
fb20: 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c 69  iews");.    sqli
fb30: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
fb40: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
fb50: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
fb60: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
fb70: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
fb80: 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70  , pName2, isTemp
fb90: 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a  , 1, 0, noErr);.
fba0: 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e    p = pParse->pN
fbb0: 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70  ewTable;.  if( p
fbc0: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e  ==0 || pParse->n
fbd0: 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
fbe0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
fbf0: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b, pSelect);.   
fc00: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
fc10: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
fc20: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
fc30: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
fc40: 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  );.  iDb = sqlit
fc50: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
fc60: 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b  db, p->pSchema);
fc70: 0a 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  .  sqlite3FixIni
fc80: 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
fc90: 20 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e   iDb, "view", pN
fca0: 61 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ame);.  if( sqli
fcb0: 74 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46  te3FixSelect(&sF
fcc0: 69 78 2c 20 70 53 65 6c 65 63 74 29 20 29 7b 0a  ix, pSelect) ){.
fcd0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
fce0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
fcf0: 65 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ect);.    return
fd00: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
fd10: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
fd20: 6e 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61  ntire SELECT sta
fd30: 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
fd40: 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
fd50: 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72  ** This will for
fd60: 63 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e  ce all the Expr.
fd70: 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74  token.z values t
fd80: 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
fd90: 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
fda0: 72 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e  rather than poin
fdb0: 74 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73  t to the input s
fdc0: 74 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65  tring - which me
fdd0: 61 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68  ans that.  ** th
fde0: 65 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20  ey will persist 
fdf0: 61 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e  after the curren
fe00: 74 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29  t sqlite3_exec()
fe10: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20   call returns.. 
fe20: 20 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74   */.  p->pSelect
fe30: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
fe40: 44 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c  Dup(db, pSelect,
fe50: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29   EXPRDUP_REDUCE)
fe60: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
fe70: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
fe80: 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ect);.  if( db->
fe90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
fea0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
feb0: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
fec0: 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  busy ){.    sqli
fed0: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
fee0: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
fef0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
ff00: 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
ff10: 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
ff20: 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
ff30: 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
ff40: 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
ff50: 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
ff60: 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69  >sLastToken;.  i
ff70: 66 28 20 41 4c 57 41 59 53 28 73 45 6e 64 2e 7a  f( ALWAYS(sEnd.z
ff80: 5b 30 5d 21 3d 30 29 20 26 26 20 73 45 6e 64 2e  [0]!=0) && sEnd.
ff90: 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
ffa0: 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
ffb0: 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
ffc0: 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  = 0;.  n = (int)
ffd0: 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e  (sEnd.z - pBegin
ffe0: 2d 3e 7a 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67  ->z);.  z = pBeg
fff0: 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
10000 41 4c 57 41 59 53 28 6e 3e 30 29 20 26 26 20 73  ALWAYS(n>0) && s
10010 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
10020 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  n-1]) ){ n--; }.
10030 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d    sEnd.z = &z[n-
10040 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31  1];.  sEnd.n = 1
10050 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69  ;..  /* Use sqli
10060 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f  te3EndTable() to
10070 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f   add the view to
10080 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
10090 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ER table */.  sq
100a0 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50  lite3EndTable(pP
100b0 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20  arse, 0, &sEnd, 
100c0 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b  0, 0);.  return;
100d0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
100e0 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f  ITE_OMIT_VIEW */
100f0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
10100 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
10110 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
10120 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
10130 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65  TABLE)./*.** The
10140 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
10150 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c 6c   pTable is reall
10160 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c 20  y a VIEW.  Fill 
10170 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a  in the names of.
10180 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f  ** the columns o
10190 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74 68  f the view in th
101a0 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74 75  e pTable structu
101b0 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  re.  Return the 
101c0 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72  number.** of err
101d0 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  ors.  If an erro
101e0 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65 20  r is seen leave 
101f0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
10200 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
10210 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Msg..*/.int sqli
10220 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
10230 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50 61  Names(Parse *pPa
10240 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
10250 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53  le){.  Table *pS
10260 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66 61  elTab;   /* A fa
10270 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77 68  ke table from wh
10280 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20 72  ich we get the r
10290 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53  esult set */.  S
102a0 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20 20  elect *pSel;    
102b0 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65 20   /* Copy of the 
102c0 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70 6c  SELECT that impl
102d0 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77 20  ements the view 
102e0 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  */.  int nErr = 
102f0 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  0;     /* Number
10300 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f 75   of errors encou
10310 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ntered */.  int 
10320 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
10330 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c   Temporarily hol
10340 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ds the number of
10350 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e 65   cursors assigne
10360 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
10370 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10380 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
10390 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c  nnection for mal
103a0 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  loc errors */.  
103b0 69 6e 74 20 28 2a 78 41 75 74 68 29 28 76 6f 69  int (*xAuth)(voi
103c0 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61  d*,int,const cha
103d0 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  r*,const char*,c
103e0 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
103f0 20 63 68 61 72 2a 29 3b 0a 0a 20 20 61 73 73 65   char*);..  asse
10400 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23  rt( pTable );..#
10410 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10420 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
10430 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 74 61    if( sqlite3Vta
10440 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61  bCallConnect(pPa
10450 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a  rse, pTable) ){.
10460 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10470 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
10480 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
10490 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ble) ) return 0;
104a0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
104b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
104c0 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69 76  W.  /* A positiv
104d0 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65  e nCol means the
104e0 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66   columns names f
104f0 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72 65  or this view are
10500 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e  .  ** already kn
10510 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  own..  */.  if( 
10520 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29  pTable->nCol>0 )
10530 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
10540 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   A negative nCol
10550 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d 61   is a special ma
10560 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68 61  rker meaning tha
10570 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e 74  t we are current
10580 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  ly.  ** trying t
10590 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  o compute the co
105a0 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20  lumn names.  If 
105b0 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72 6f  we enter this ro
105c0 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20  utine with.  ** 
105d0 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c  a negative nCol,
105e0 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72   it means two or
105f0 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72 6d   more views form
10600 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68   a loop, like th
10610 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  is:.  **.  **   
10620 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f 6e    CREATE VIEW on
10630 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  e AS SELECT * FR
10640 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20  OM two;.  **    
10650 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77 6f   CREATE VIEW two
10660 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   AS SELECT * FRO
10670 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  M one;.  **.  **
10680 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 65   Actually, the e
10690 72 72 6f 72 20 61 62 6f 76 65 20 69 73 20 6e 6f  rror above is no
106a0 77 20 63 61 75 67 68 74 20 70 72 69 6f 72 20 74  w caught prior t
106b0 6f 20 72 65 61 63 68 69 6e 67 20 74 68 69 73 20  o reaching this 
106c0 70 6f 69 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20  point..  ** But 
106d0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65  the following te
106e0 73 74 20 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f  st is still impo
106f0 72 74 61 6e 74 20 61 73 20 69 74 20 64 6f 65 73  rtant as it does
10700 20 63 6f 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e   come up.  ** in
10710 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
10720 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43    ** .  **     C
10730 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e  REATE TABLE main
10740 2e 65 78 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20  .ex1(a);.  **   
10750 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 56 49    CREATE TEMP VI
10760 45 57 20 65 78 31 20 41 53 20 53 45 4c 45 43 54  EW ex1 AS SELECT
10770 20 61 20 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a   a FROM ex1;.  *
10780 2a 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  *     SELECT * F
10790 52 4f 4d 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20  ROM temp.ex1;.  
107a0 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
107b0 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73  >nCol<0 ){.    s
107c0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
107d0 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73 20  Parse, "view %s 
107e0 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64 65  is circularly de
107f0 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e  fined", pTable->
10800 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
10810 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65  rn 1;.  }.  asse
10820 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  rt( pTable->nCol
10830 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  >=0 );..  /* If 
10840 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
10850 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65 65   it means we nee
10860 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65  d to compute the
10870 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20   table names..  
10880 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
10890 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
108a0 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
108b0 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64 20  t() will expand 
108c0 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65  any.  ** "*" ele
108d0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65 73  ments in the res
108e0 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65 20  ults set of the 
108f0 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61 73  view and will as
10900 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a  sign cursors.  *
10910 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74  * to the element
10920 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  s of the FROM cl
10930 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64 6f  ause.  But we do
10940 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65 20   not want these 
10950 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20  changes.  ** to 
10960 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53  be permanent.  S
10970 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f  o the computatio
10980 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63  n is done on a c
10990 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
109a0 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  T.  ** statement
109b0 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
109c0 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61  e view..  */.  a
109d0 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 70  ssert( pTable->p
109e0 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65 6c  Select );.  pSel
109f0 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
10a00 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  Dup(db, pTable->
10a10 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69  pSelect, 0);.  i
10a20 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 75  f( pSel ){.    u
10a30 38 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64  8 enableLookasid
10a40 65 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  e = db->lookasid
10a50 65 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20  e.bEnabled;.    
10a60 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  n = pParse->nTab
10a70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72 63  ;.    sqlite3Src
10a80 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
10a90 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  s(pParse, pSel->
10aa0 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62 6c  pSrc);.    pTabl
10ab0 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  e->nCol = -1;.  
10ac0 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
10ad0 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 23 69  bEnabled = 0;.#i
10ae0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10af0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
10b00 20 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d 3e      xAuth = db->
10b10 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78  xAuth;.    db->x
10b20 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70 53  Auth = 0;.    pS
10b30 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
10b40 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
10b50 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a  (pParse, pSel);.
10b60 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20      db->xAuth = 
10b70 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20  xAuth;.#else.   
10b80 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
10b90 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
10ba0 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
10bb0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 62  );.#endif.    db
10bc0 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
10bd0 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65 4c 6f 6f  bled = enableLoo
10be0 6b 61 73 69 64 65 3b 0a 20 20 20 20 70 50 61 72  kaside;.    pPar
10bf0 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20  se->nTab = n;.  
10c00 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29 7b    if( pSelTab ){
10c10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10c20 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29  Table->aCol==0 )
10c30 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e  ;.      pTable->
10c40 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  nCol = pSelTab->
10c50 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61 62  nCol;.      pTab
10c60 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54  le->aCol = pSelT
10c70 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
10c80 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
10c90 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  0;.      pSelTab
10ca0 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
10cb0 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
10cc0 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62  able(db, pSelTab
10cd0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10ce0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
10cf0 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
10d00 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20  Table->pSchema) 
10d10 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  );.      pTable-
10d20 3e 70 53 63 68 65 6d 61 2d 3e 66 6c 61 67 73 20  >pSchema->flags 
10d30 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  |= DB_UnresetVie
10d40 77 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ws;.    }else{. 
10d50 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f       pTable->nCo
10d60 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72  l = 0;.      nEr
10d70 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  r++;.    }.    s
10d80 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
10d90 74 65 28 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20  te(db, pSel);.  
10da0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72  } else {.    nEr
10db0 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  r++;.  }.#endif 
10dc0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
10dd0 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  IEW */.  return 
10de0 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66  nErr;  .}.#endif
10df0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
10e00 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c  ITE_OMIT_VIEW) |
10e10 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
10e20 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
10e30 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  BLE) */..#ifndef
10e40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
10e50 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  W./*.** Clear th
10e60 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  e column names f
10e70 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20 69  rom every VIEW i
10e80 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a  n database idx..
10e90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
10ea0 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
10eb0 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  l(sqlite3 *db, i
10ec0 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45  nt idx){.  HashE
10ed0 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74  lem *i;.  assert
10ee0 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
10ef0 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78  utexHeld(db, idx
10f00 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44  , 0) );.  if( !D
10f10 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c  bHasProperty(db,
10f20 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
10f30 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b  Views) ) return;
10f40 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48  .  for(i=sqliteH
10f50 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44  ashFirst(&db->aD
10f60 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e  b[idx].pSchema->
10f70 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71  tblHash); i;i=sq
10f80 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
10f90 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
10fa0 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
10fb0 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
10fc0 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
10fd0 20 20 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65        sqliteDele
10fe0 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
10ff0 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70  , pTab);.      p
11000 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
11010 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20       pTab->nCol 
11020 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
11030 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79   DbClearProperty
11040 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72  (db, idx, DB_Unr
11050 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65  esetViews);.}.#e
11060 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c  lse.# define sql
11070 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
11080 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  A,B).#endif /* S
11090 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20  QLITE_OMIT_VIEW 
110a0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
110b0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
110c0 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f  d by the VDBE to
110d0 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65   adjust the inte
110e0 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75  rnal schema.** u
110f0 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68  sed by SQLite wh
11100 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  en the btree lay
11110 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65  er moves a table
11120 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a   root page. The.
11130 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20  ** root-page of 
11140 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
11150 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
11160 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f   has changed fro
11170 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54  m iFrom.** to iT
11180 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20  o..**.** Ticket 
11190 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62  #1728:  The symb
111a0 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73  ol table might s
111b0 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66  till contain inf
111c0 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74  ormation.** on t
111d0 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64  ables and/or ind
111e0 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68  ices that are th
111f0 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  e process of bei
11200 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49  ng deleted..** I
11210 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b  f you are unluck
11220 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  y, one of those 
11230 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20  deleted indices 
11240 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a  or tables might.
11250 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ** have the same
11260 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72   rootpage number
11270 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62   as the real tab
11280 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74  le or index that
11290 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76   is.** being mov
112a0 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f  ed.  So we canno
112b0 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67  t stop searching
112c0 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74   after the first
112d0 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75   match .** becau
112e0 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  se the first mat
112f0 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20  ch might be for 
11300 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74  one of the delet
11310 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72  ed indices.** or
11320 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20   tables and not 
11330 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20  the table/index 
11340 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79  that is actually
11350 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a   being moved..**
11360 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75   We must continu
11370 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  e looping until 
11380 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69  all tables and i
11390 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72  ndices with.** r
113a0 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68  ootpage==iFrom h
113b0 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74  ave been convert
113c0 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f  ed to have a roo
113d0 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20  tpage of iTo.** 
113e0 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
113f0 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67  ertain that we g
11400 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65  ot the right one
11410 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
11420 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
11430 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  UUM.void sqlite3
11440 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71  RootPageMoved(sq
11450 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
11460 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  Db, int iFrom, i
11470 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45  nt iTo){.  HashE
11480 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61  lem *pElem;.  Ha
11490 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20  sh *pHash;.  Db 
114a0 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pDb;..  assert(
114b0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
114c0 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c  texHeld(db, iDb,
114d0 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26   0) );.  pDb = &
114e0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
114f0 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53  pHash = &pDb->pS
11500 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a  chema->tblHash;.
11510 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
11520 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73  teHashFirst(pHas
11530 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
11540 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
11550 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62  pElem)){.    Tab
11560 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
11570 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
11580 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e  ;.    if( pTab->
11590 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
115a0 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20       pTab->tnum 
115b0 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  = iTo;.    }.  }
115c0 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d  .  pHash = &pDb-
115d0 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
115e0 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73  h;.  for(pElem=s
115f0 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70  qliteHashFirst(p
11600 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45  Hash); pElem; pE
11610 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  lem=sqliteHashNe
11620 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20  xt(pElem)){.    
11630 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71  Index *pIdx = sq
11640 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c  liteHashData(pEl
11650 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  em);.    if( pId
11660 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29  x->tnum==iFrom )
11670 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e  {.      pIdx->tn
11680 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a  um = iTo;.    }.
11690 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
116a0 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74  .** Write code t
116b0 6f 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c  o erase the tabl
116c0 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
116d0 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74   iTable from dat
116e0 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c  abase iDb..** Al
116f0 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f  so write code to
11700 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69   modify the sqli
11710 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
11720 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  and internal sch
11730 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74  ema.** if a root
11740 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72  -page of another
11750 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20   table is moved 
11760 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79  by the btree-lay
11770 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61  er whilst.** era
11780 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69  sing iTable (thi
11790 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74  s can happen wit
117a0 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  h an auto-vacuum
117b0 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a   database)..*/ .
117c0 73 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74  static void dest
117d0 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73  royRootPage(Pars
117e0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
117f0 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b  Table, int iDb){
11800 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
11810 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
11820 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20  se);.  int r1 = 
11830 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
11840 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
11850 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11860 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54  , OP_Destroy, iT
11870 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a  able, r1, iDb);.
11880 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
11890 74 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64  t(pParse);.#ifnd
118a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
118b0 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f  UTOVACUUM.  /* O
118c0 50 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73  P_Destroy stores
118d0 20 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72   an in integer r
118e0 31 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67  1. If this integ
118f0 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  er.  ** is non-z
11900 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ero, then it is 
11910 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
11920 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20  mber of a table 
11930 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f  moved to.  ** lo
11940 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54  cation iTable. T
11950 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64  he following cod
11960 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73  e modifies the s
11970 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
11980 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65  le to.  ** refle
11990 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20  ct this..  **.  
119a0 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e  ** The "#NNN" in
119b0 20 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70   the SQL is a sp
119c0 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74  ecial constant t
119d0 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76  hat means whatev
119e0 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73  er value.  ** is
119f0 20 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e   in register NNN
11a00 2e 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72  .  See grammar r
11a10 75 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ules associated 
11a20 77 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49  with the TK_REGI
11a30 53 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20  STER.  ** token 
11a40 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
11a50 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f  nformation..  */
11a60 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
11a70 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
11a80 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
11a90 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25  s SET rootpage=%
11aa0 64 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20  d WHERE #%d AND 
11ab0 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20  rootpage=#%d",. 
11ac0 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
11ad0 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
11ae0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
11af0 29 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72  ), iTable, r1, r
11b00 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  1);.#endif.  sql
11b10 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
11b20 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
11b30 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56  }../*.** Write V
11b40 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73  DBE code to eras
11b50 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  e table pTab and
11b60 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
11b70 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e  indices on disk.
11b80 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61  .** Code to upda
11b90 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  te the sqlite_ma
11ba0 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20  ster tables and 
11bb0 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
11bc0 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69  definitions.** i
11bd0 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61  n case a root-pa
11be0 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
11bf0 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
11c00 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
11c10 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20  ree layer.** is 
11c20 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73  also added (this
11c30 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
11c40 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
11c50 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74  database)..*/.st
11c60 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
11c70 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  yTable(Parse *pP
11c80 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
11c90 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
11ca0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
11cb0 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  M.  Index *pIdx;
11cc0 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
11cd0 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
11ce0 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
11cf0 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
11d00 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
11d10 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e  pParse, pTab->tn
11d20 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28  um, iDb);.  for(
11d30 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
11d40 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
11d50 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
11d60 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
11d70 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e  pParse, pIdx->tn
11d80 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65  um, iDb);.  }.#e
11d90 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  lse.  /* If the 
11da0 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20  database may be 
11db0 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
11dc0 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f  ble (if SQLITE_O
11dd0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
11de0 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e   ** is not defin
11df0 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ed), then it is 
11e00 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c  important to cal
11e10 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20  l OP_Destroy on 
11e20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61  the.  ** table a
11e30 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61  nd index root-pa
11e40 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74  ges in order, st
11e50 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
11e60 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a  numerically .  *
11e70 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  * largest root-p
11e80 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  age number. This
11e90 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
11ea0 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f   none of the roo
11eb0 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20  t-pages.  ** to 
11ec0 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20  be destroyed is 
11ed0 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20  relocated by an 
11ee0 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72  earlier OP_Destr
11ef0 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a  oy. i.e. if the.
11f00 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
11f10 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a  ere coded:.  **.
11f20 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
11f30 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a  4 0.  ** ....  *
11f40 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30  * OP_Destroy 5 0
11f50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72  .  **.  ** and r
11f60 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65  oot page 5 happe
11f70 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  ned to be the la
11f80 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
11f90 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20  number in the.  
11fa0 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
11fb0 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f  n root page 5 wo
11fc0 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20  uld be moved to 
11fd0 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20  page 4 by the . 
11fe0 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20   ** "OP_Destroy 
11ff0 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65  4 0" opcode. The
12000 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f   subsequent "OP_
12010 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75  Destroy 5 0" wou
12020 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72  ld hit.  ** a fr
12030 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20  ee-list page..  
12040 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
12050 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e  pTab->tnum;.  in
12060 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30  t iDestroyed = 0
12070 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
12080 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
12090 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65  ;.    int iLarge
120a0 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  st = 0;..    if(
120b0 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c   iDestroyed==0 |
120c0 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65  | iTab<iDestroye
120d0 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67  d ){.      iLarg
120e0 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  est = iTab;.    
120f0 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  }.    for(pIdx=p
12100 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
12110 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
12120 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
12130 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75  iIdx = pIdx->tnu
12140 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
12150 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
12160 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
12170 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73  .      if( (iDes
12180 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49  troyed==0 || (iI
12190 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20  dx<iDestroyed)) 
121a0 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74  && iIdx>iLargest
121b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72   ){.        iLar
121c0 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20  gest = iIdx;.   
121d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
121e0 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29  f( iLargest==0 )
121f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
12200 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12210 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
12220 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
12230 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
12240 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
12250 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
12260 20 26 26 20 69 44 62 3c 70 50 61 72 73 65 2d 3e   && iDb<pParse->
12270 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 20  db->nDb );.     
12280 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
12290 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73  (pParse, iLarges
122a0 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69  t, iDb);.      i
122b0 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72  Destroyed = iLar
122c0 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  gest;.    }.  }.
122d0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
122e0 52 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66  Remove entries f
122f0 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 5f 73  rom the sqlite_s
12300 74 61 74 4e 20 74 61 62 6c 65 73 20 28 66 6f 72  tatN tables (for
12310 20 4e 20 69 6e 20 28 31 2c 32 2c 33 29 29 0a 2a   N in (1,2,3)).*
12320 2a 20 61 66 74 65 72 20 61 20 44 52 4f 50 20 49  * after a DROP I
12330 4e 44 45 58 20 6f 72 20 44 52 4f 50 20 54 41 42  NDEX or DROP TAB
12340 4c 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  LE command..*/.s
12350 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
12360 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65  e3ClearStatTable
12370 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
12380 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
12390 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
123a0 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c  xt */.  int iDb,
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
123c0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6e  * The database n
123d0 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  umber */.  const
123e0 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20   char *zType,   
123f0 20 20 2f 2a 20 22 69 64 78 22 20 6f 72 20 22 74    /* "idx" or "t
12400 62 6c 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  bl" */.  const c
12410 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20  har *zName      
12420 2f 2a 20 4e 61 6d 65 20 6f 66 20 69 6e 64 65 78  /* Name of index
12430 20 6f 72 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a   or table */.){.
12440 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74    int i;.  const
12450 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d   char *zDbName =
12460 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
12470 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 66  [iDb].zName;.  f
12480 6f 72 28 69 3d 31 3b 20 69 3c 3d 34 3b 20 69 2b  or(i=1; i<=4; i+
12490 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 54 61  +){.    char zTa
124a0 62 5b 32 34 5d 3b 0a 20 20 20 20 73 71 6c 69 74  b[24];.    sqlit
124b0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
124c0 6f 66 28 7a 54 61 62 29 2c 7a 54 61 62 2c 22 73  of(zTab),zTab,"s
124d0 71 6c 69 74 65 5f 73 74 61 74 25 64 22 2c 69 29  qlite_stat%d",i)
124e0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
124f0 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
12500 65 2d 3e 64 62 2c 20 7a 54 61 62 2c 20 7a 44 62  e->db, zTab, zDb
12510 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
12520 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
12530 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
12540 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
12550 51 2e 25 73 20 57 48 45 52 45 20 25 73 3d 25 51  Q.%s WHERE %s=%Q
12560 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62 4e 61  ",.        zDbNa
12570 6d 65 2c 20 7a 54 61 62 2c 20 7a 54 79 70 65 2c  me, zTab, zType,
12580 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a   zName.      );.
12590 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
125a0 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
125b0 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65   to drop a table
125c0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
125d0 33 43 6f 64 65 44 72 6f 70 54 61 62 6c 65 28 50  3CodeDropTable(P
125e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
125f0 62 6c 65 20 2a 70 54 61 62 2c 20 69 6e 74 20 69  ble *pTab, int i
12600 44 62 2c 20 69 6e 74 20 69 73 56 69 65 77 29 7b  Db, int isView){
12610 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
12620 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
12630 73 65 2d 3e 64 62 3b 0a 20 20 54 72 69 67 67 65  se->db;.  Trigge
12640 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 44  r *pTrigger;.  D
12650 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  b *pDb = &db->aD
12660 62 5b 69 44 62 5d 3b 0a 0a 20 20 76 20 3d 20 73  b[iDb];..  v = s
12670 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
12680 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
12690 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74   v!=0 );.  sqlit
126a0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
126b0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
126c0 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
126d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
126e0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
126f0 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
12700 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
12710 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42  eAddOp0(v, OP_VB
12720 65 67 69 6e 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  egin);.  }.#endi
12730 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  f..  /* Drop all
12740 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
12750 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
12760 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
12770 64 2e 20 43 6f 64 65 0a 20 20 2a 2a 20 69 73 20  d. Code.  ** is 
12780 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d  generated to rem
12790 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
127a0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61   sqlite_master a
127b0 6e 64 2f 6f 72 0a 20 20 2a 2a 20 73 71 6c 69 74  nd/or.  ** sqlit
127c0 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66  e_temp_master if
127d0 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2f 0a   required..  */.
127e0 20 20 70 54 72 69 67 67 65 72 20 3d 20 73 71 6c    pTrigger = sql
127f0 69 74 65 33 54 72 69 67 67 65 72 4c 69 73 74 28  ite3TriggerList(
12800 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20  pParse, pTab);. 
12810 20 77 68 69 6c 65 28 20 70 54 72 69 67 67 65 72   while( pTrigger
12820 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12830 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
12840 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
12850 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 70 54 72   || .        pTr
12860 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
12870 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
12880 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ma );.    sqlite
12890 33 44 72 6f 70 54 72 69 67 67 65 72 50 74 72 28  3DropTriggerPtr(
128a0 70 50 61 72 73 65 2c 20 70 54 72 69 67 67 65 72  pParse, pTrigger
128b0 29 3b 0a 20 20 20 20 70 54 72 69 67 67 65 72 20  );.    pTrigger 
128c0 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
128d0 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  t;.  }..#ifndef 
128e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
128f0 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20 52  INCREMENT.  /* R
12900 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72 69 65  emove any entrie
12910 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  s of the sqlite_
12920 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 61  sequence table a
12930 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20  ssociated with. 
12940 20 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65   ** the table be
12950 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 54 68 69  ing dropped. Thi
12960 73 20 69 73 20 64 6f 6e 65 20 62 65 66 6f 72 65  s is done before
12970 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 64 72   the table is dr
12980 6f 70 70 65 64 0a 20 20 2a 2a 20 61 74 20 74 68  opped.  ** at th
12990 65 20 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69  e btree level, i
129a0 6e 20 63 61 73 65 20 74 68 65 20 73 71 6c 69 74  n case the sqlit
129b0 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
129c0 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 6d   needs to.  ** m
129d0 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  ove as a result 
129e0 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e  of the drop (can
129f0 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
12a00 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20  vacuum mode)..  
12a10 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 74  */.  if( pTab->t
12a20 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
12a30 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20  oincrement ){.  
12a40 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
12a50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
12a60 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
12a70 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %Q.sqlite_sequen
12a80 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ce WHERE name=%Q
12a90 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  ",.      pDb->zN
12aa0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
12ab0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  .    );.  }.#end
12ac0 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6c  if..  /* Drop al
12ad0 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
12ae0 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
12af0 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
12b00 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 74  er to the.  ** t
12b10 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61  able. The progra
12b20 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72  m name loops thr
12b30 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20  ough the master 
12b40 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65  table and delete
12b50 73 0a 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77  s.  ** every row
12b60 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
12b70 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73  a table of the s
12b80 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
12b90 6f 6e 65 20 62 65 69 6e 67 0a 20 20 2a 2a 20 64  one being.  ** d
12ba0 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
12bb0 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
12bc0 61 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  arately because 
12bd0 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
12be0 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e  .  ** created in
12bf0 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
12c00 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74  se that refers t
12c10 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f  o a table in ano
12c20 74 68 65 72 0a 20 20 2a 2a 20 64 61 74 61 62 61  ther.  ** databa
12c30 73 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  se..  */.  sqlit
12c40 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
12c50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 44 45  arse, .      "DE
12c60 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
12c70 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
12c80 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
12c90 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 70 44  gger'",.      pD
12ca0 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b->zName, SCHEMA
12cb0 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61  _TABLE(iDb), pTa
12cc0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b->zName);.  if(
12cd0 20 21 69 73 56 69 65 77 20 26 26 20 21 49 73 56   !isView && !IsV
12ce0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
12cf0 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65      destroyTable
12d00 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
12d10 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65    }..  /* Remove
12d20 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
12d30 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69   from SQLite's i
12d40 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61  nternal schema a
12d50 6e 64 20 6d 6f 64 69 66 79 0a 20 20 2a 2a 20 74  nd modify.  ** t
12d60 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
12d70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73 56  ..  */.  if( IsV
12d80 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
12d90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12da0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 44 65 73  ddOp4(v, OP_VDes
12db0 74 72 6f 79 2c 20 69 44 62 2c 20 30 2c 20 30 2c  troy, iDb, 0, 0,
12dc0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pTab->zName, 0)
12dd0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
12de0 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
12df0 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20  DropTable, iDb, 
12e00 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
12e10 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  e, 0);.  sqlite3
12e20 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
12e30 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c  rse, iDb);.  sql
12e40 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
12e50 64 62 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  db, iDb);.}../*.
12e60 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12e70 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20  is called to do 
12e80 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52  the work of a DR
12e90 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  OP TABLE stateme
12ea0 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20  nt..** pName is 
12eb0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
12ec0 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70  table to be drop
12ed0 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ped..*/.void sql
12ee0 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61  ite3DropTable(Pa
12ef0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
12f00 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
12f10 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45   isView, int noE
12f20 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  rr){.  Table *pT
12f30 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20  ab;.  Vdbe *v;. 
12f40 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
12f50 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
12f60 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d   iDb;..  if( db-
12f70 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
12f80 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
12f90 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  rop_table;.  }. 
12fa0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
12fb0 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 61 73  >nErr==0 );.  as
12fc0 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
12fd0 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 6e 6f  c==1 );.  if( no
12fe0 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
12ff0 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54 61 62 20  ssErr++;.  pTab 
13000 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
13010 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
13020 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d   isView, &pName-
13030 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f  >a[0]);.  if( no
13040 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
13050 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20  ssErr--;..  if( 
13060 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69  pTab==0 ){.    i
13070 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74  f( noErr ) sqlit
13080 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
13090 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  dSchema(pParse, 
130a0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
130b0 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f  abase);.    goto
130c0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
130d0 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
130e0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
130f0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
13100 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
13110 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
13120 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20  b->nDb );..  /* 
13130 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72  If pTab is a vir
13140 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c  tual table, call
13150 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61   ViewGetColumnNa
13160 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a  mes() to ensure.
13170 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69    ** it is initi
13180 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  alized..  */.  i
13190 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
131a0 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65  b) && sqlite3Vie
131b0 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
131c0 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
131d0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
131e0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23  rop_table;.  }.#
131f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13200 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
13210 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
13220 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
13230 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
13240 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
13250 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
13260 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
13270 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
13280 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30   char *zArg2 = 0
13290 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
132a0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
132b0 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
132c0 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29  , zTab, 0, zDb))
132d0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
132e0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
132f0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
13300 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
13310 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
13320 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
13330 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
13340 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  DROP_TEMP_VIEW;.
13350 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13360 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
13370 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20  TE_DROP_VIEW;.  
13380 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
13390 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
133a0 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
133b0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
133c0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  Tab) ){.      co
133d0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
133e0 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a  _VTABLE;.      z
133f0 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65  Arg2 = sqlite3Ge
13400 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
13410 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a  )->pMod->zName;.
13420 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
13430 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
13440 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
13450 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
13460 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
13470 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
13480 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13490 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
134a0 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  DROP_TABLE;.    
134b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
134c0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
134d0 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
134e0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41   pTab->zName, zA
134f0 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  rg2, zDb) ){.   
13500 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
13510 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
13520 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
13530 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
13540 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70  SQLITE_DELETE, p
13550 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
13560 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
13570 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
13580 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  e;.    }.  }.#en
13590 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65  dif.  if( sqlite
135a0 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
135b0 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
135c0 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20  , 7)==0 .    && 
135d0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
135e0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
135f0 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21  lite_stat", 11)!
13600 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
13610 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13620 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
13630 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
13640 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
13650 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
13660 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69  p_table;.  }..#i
13670 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13680 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75  T_VIEW.  /* Ensu
13690 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73  re DROP TABLE is
136a0 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76   not used on a v
136b0 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49  iew, and DROP VI
136c0 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20  EW is not used. 
136d0 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a   ** on a table..
136e0 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65    */.  if( isVie
136f0 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
13700 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
13710 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
13720 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54  rse, "use DROP T
13730 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
13740 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e  able %s", pTab->
13750 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
13760 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
13770 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56  ;.  }.  if( !isV
13780 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
13790 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
137a0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
137b0 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49  se, "use DROP VI
137c0 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65  EW to delete vie
137d0 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  w %s", pTab->zNa
137e0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
137f0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
13800 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
13810 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
13820 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
13830 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
13840 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
13850 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
13860 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
13870 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
13880 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
13890 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
138a0 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
138b0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  b);.    sqlite3C
138c0 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
138d0 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62 6c  Parse, iDb, "tbl
138e0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
138f0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72  .    sqlite3FkDr
13900 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
13910 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20  pName, pTab);.  
13920 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f    sqlite3CodeDro
13930 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  pTable(pParse, p
13940 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77  Tab, iDb, isView
13950 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
13960 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
13970 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
13980 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
13990 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
139a0 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
139b0 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
139c0 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
139d0 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
139e0 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
139f0 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
13a00 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
13a10 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
13a20 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
13a30 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
13a40 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
13a50 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
13a60 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
13a70 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
13a80 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
13a90 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
13aa0 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
13ab0 20 72 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e   referred to (a.
13ac0 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74 22  k.a the "parent"
13ad0 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c   table).  pToCol
13ae0 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66   is a list.** of
13af0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
13b00 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e  arent pTo table.
13b10 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
13b20 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
13b30 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
13b40 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
13b50 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
13b60 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
13b70 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
13b80 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
13b90 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
13ba0 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
13bb0 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
13bc0 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
13bd0 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
13be0 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
13bf0 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
13c00 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
13c10 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  field..**.** The
13c20 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
13c30 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
13c40 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
13c50 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
13c60 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
13c70 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
13c80 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
13c90 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
13ca0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
13cb0 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
13cc0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
13cd0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
13ce0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
13cf0 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
13d00 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
13d10 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
13d20 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
13d30 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
13d40 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
13d50 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
13d60 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
13d70 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
13d80 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
13d90 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
13da0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
13db0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
13dc0 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
13dd0 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
13de0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
13df0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
13e00 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
13e10 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
13e20 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
13e30 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e   = 0;.  FKey *pN
13e40 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a  extTo;.  Table *
13e50 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
13e60 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
13e70 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
13e80 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
13e90 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
13ea0 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
13eb0 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
13ec0 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b  E_VTAB ) goto fk
13ed0 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
13ee0 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
13ef0 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
13f00 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  l-1;.    if( NEV
13f10 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74  ER(iCol<0) ) got
13f20 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
13f30 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
13f40 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
13f50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
13f60 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
13f70 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
13f80 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
13f90 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
13fa0 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
13fb0 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
13fc0 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
13fd0 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
13fe0 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
13ff0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
14000 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
14010 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
14020 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
14030 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
14040 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14050 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
14060 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
14070 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
14080 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
14090 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
140a0 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
140b0 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
140c0 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
140d0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
140e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
140f0 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
14100 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
14110 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
14120 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  y) + (nCol-1)*si
14130 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
14140 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
14150 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
14160 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
14170 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
14180 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
14190 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
141a0 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
141b0 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
141c0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
141d0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
141e0 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
141f0 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
14200 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  =0 ){.    goto f
14210 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b  k_end;.  }.  pFK
14220 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
14230 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
14240 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
14250 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
14260 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20  y->aCol[nCol];. 
14270 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
14280 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
14290 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
142a0 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
142b0 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
142c0 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e  z);.  z += pTo->
142d0 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  n+1;.  pFKey->nC
142e0 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
142f0 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
14300 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
14310 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
14320 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
14330 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
14340 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
14350 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
14360 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
14370 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
14380 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
14390 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
143a0 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
143b0 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
143c0 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
143d0 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
143e0 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
143f0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
14400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14410 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
14420 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
14430 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
14440 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
14450 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
14460 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
14470 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
14480 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
14490 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
144a0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
144b0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
144c0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
144d0 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
144e0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
144f0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
14500 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
14510 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
14520 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
14530 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
14540 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
14550 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
14560 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
14570 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
14580 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
14590 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
145a0 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
145b0 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30  pFKey->aAction[0
145c0 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26  ] = (u8)(flags &
145d0 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20   0xff);         
145e0 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20     /* ON DELETE 
145f0 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65  action */.  pFKe
14600 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20  y->aAction[1] = 
14610 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38  (u8)((flags >> 8
14620 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f   ) & 0xff);    /
14630 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69  * ON UPDATE acti
14640 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  on */..  assert(
14650 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
14660 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
14670 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
14680 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20  pNextTo = (FKey 
14690 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  *)sqlite3HashIns
146a0 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d  ert(&p->pSchema-
146b0 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20  >fkeyHash, .    
146c0 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 71    pFKey->zTo, sq
146d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 46  lite3Strlen30(pF
146e0 4b 65 79 2d 3e 7a 54 6f 29 2c 20 28 76 6f 69 64  Key->zTo), (void
146f0 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20   *)pFKey.  );.  
14700 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b  if( pNextTo==pFK
14710 65 79 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  ey ){.    db->ma
14720 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
14730 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
14740 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 78 74  .  }.  if( pNext
14750 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  To ){.    assert
14760 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76  ( pNextTo->pPrev
14770 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b  To==0 );.    pFK
14780 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e  ey->pNextTo = pN
14790 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74  extTo;.    pNext
147a0 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70 46  To->pPrevTo = pF
147b0 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  Key;.  }..  /* L
147c0 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20  ink the foreign 
147d0 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65  key to the table
147e0 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65   as the last ste
147f0 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b  p..  */.  p->pFK
14800 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46  ey = pFKey;.  pF
14810 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64  Key = 0;..fk_end
14820 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
14830 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65  e(db, pFKey);.#e
14840 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
14850 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52  (SQLITE_OMIT_FOR
14860 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73  EIGN_KEY) */.  s
14870 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
14880 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f  lete(db, pFromCo
14890 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
148a0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
148b0 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pToCol);.}../*.*
148c0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
148d0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
148e0 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
148f0 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c  IATE or INITIALL
14900 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c  Y DEFERRED.** cl
14910 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20  ause is seen as 
14920 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67  part of a foreig
14930 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
14940 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65  .  The isDeferre
14950 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
14960 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  s 1 for INITIALL
14970 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30  Y DEFERRED and 0
14980 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49   for INITIALLY I
14990 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65  MMEDIATE..** The
149a0 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
149b0 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
149c0 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b  reated foreign k
149d0 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ey is adjusted.*
149e0 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  * accordingly..*
149f0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
14a00 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61  ferForeignKey(Pa
14a10 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
14a20 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69   isDeferred){.#i
14a30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14a40 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
14a50 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46  Table *pTab;.  F
14a60 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66  Key *pFKey;.  if
14a70 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65  ( (pTab = pParse
14a80 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
14a90 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62  || (pFKey = pTab
14aa0 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65  ->pFKey)==0 ) re
14ab0 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
14ac0 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c  isDeferred==0 ||
14ad0 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29   isDeferred==1 )
14ae0 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32 33  ; /* EV: R-30323
14af0 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65  -21917 */.  pFKe
14b00 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
14b10 28 75 38 29 69 73 44 65 66 65 72 72 65 64 3b 0a  (u8)isDeferred;.
14b20 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
14b30 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
14b40 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e  at will erase an
14b50 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a  d refill index *
14b60 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a  pIdx.  This is.*
14b70 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61  * used to initia
14b80 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65  lize a newly cre
14b90 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f  ated index or to
14ba0 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a   recompute the.*
14bb0 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  * content of an 
14bc0 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73  index in respons
14bd0 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63  e to a REINDEX c
14be0 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66  ommand..**.** if
14bf0 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
14c00 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74  not negative, it
14c10 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
14c20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a  index is newly.*
14c30 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  * created.  The 
14c40 72 65 67 69 73 74 65 72 20 73 70 65 63 69 66 69  register specifi
14c50 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67  ed by memRootPag
14c60 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a  e contains the.*
14c70 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  * root page numb
14c80 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  er of the index.
14c90 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65    If memRootPage
14ca0 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
14cb0 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  en.** the index 
14cc0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
14cd0 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72  nd must be clear
14ce0 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
14cf0 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20  refilled and.** 
14d00 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
14d10 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
14d20 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  x is taken from 
14d30 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f  pIndex->tnum..*/
14d40 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
14d50 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
14d60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
14d70 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e  ndex *pIndex, in
14d80 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a  t memRootPage){.
14d90 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
14da0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20  pIndex->pTable; 
14db0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68   /* The table th
14dc0 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f  at is indexed */
14dd0 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
14de0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
14df0 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
14e00 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20  r used for pTab 
14e10 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  */.  int iIdx = 
14e20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
14e30 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
14e40 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e  sor used for pIn
14e50 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f  dex */.  int iSo
14e60 72 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  rter;           
14e70 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
14e80 72 20 6f 70 65 6e 65 64 20 62 79 20 4f 70 65 6e  r opened by Open
14e90 53 6f 72 74 65 72 20 28 69 66 20 69 6e 20 75 73  Sorter (if in us
14ea0 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  e) */.  int addr
14eb0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
14ec0 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
14ed0 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70  s of top of loop
14ee0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 32 3b   */.  int addr2;
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f00 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
14f10 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e  to jump to for n
14f20 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ext iteration */
14f30 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20  .  int tnum;    
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f50 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
14f60 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
14f70 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 3b 20   iPartIdxLabel; 
14f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
14f90 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61 62 65  ump to this labe
14fa0 6c 20 74 6f 20 73 6b 69 70 20 61 20 72 6f 77 20  l to skip a row 
14fb0 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fd0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
14fe0 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76  code into this v
14ff0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a  irtual machine *
15000 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
15010 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
15020 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f     /* KeyInfo fo
15030 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  r index */.  int
15040 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20   regRecord;     
15050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
15060 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
15070 61 73 73 65 6d 62 6c 69 65 64 20 69 6e 64 65 78  assemblied index
15080 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c   record */.  sql
15090 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
150a0 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54  e->db;      /* T
150b0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
150c0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
150d0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
150e0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
150f0 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
15100 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
15110 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
15120 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ION.  if( sqlite
15130 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
15140 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  e, SQLITE_REINDE
15150 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  X, pIndex->zName
15160 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61  , 0,.      db->a
15170 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20  Db[iDb].zName ) 
15180 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
15190 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
151a0 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Require a write-
151b0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
151c0 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69  e to perform thi
151d0 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  s operation */. 
151e0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
151f0 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
15200 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54  Tab->tnum, 1, pT
15210 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76  ab->zName);..  v
15220 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
15230 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
15240 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
15250 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
15260 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d  e>=0 ){.    tnum
15270 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a   = memRootPage;.
15280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75    }else{.    tnu
15290 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  m = pIndex->tnum
152a0 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73  ;.  }.  pKey = s
152b0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49  qlite3KeyInfoOfI
152c0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
152d0 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e  dex);..  /* Open
152e0 20 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73   the sorter curs
152f0 6f 72 20 69 66 20 77 65 20 61 72 65 20 74 6f 20  or if we are to 
15300 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53  use one. */.  iS
15310 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  orter = pParse->
15320 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  nTab++;.  sqlite
15330 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
15340 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53  P_SorterOpen, iS
15350 6f 72 74 65 72 2c 20 30 2c 20 30 2c 20 28 63 68  orter, 0, 0, (ch
15360 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20  ar*).           
15370 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15380 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 29  KeyInfoRef(pKey)
15390 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a  , P4_KEYINFO);..
153a0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74 61    /* Open the ta
153b0 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ble. Loop throug
153c0 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68  h all rows of th
153d0 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72 74 69  e table, inserti
153e0 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65  ng index.  ** re
153f0 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20 73  cords into the s
15400 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69  orter. */.  sqli
15410 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
15420 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
15430 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
15440 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  d);.  addr1 = sq
15450 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15460 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
15470 61 62 2c 20 30 29 3b 0a 20 20 72 65 67 52 65 63  ab, 0);.  regRec
15480 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
15490 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
154a0 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72  ..  sqlite3Gener
154b0 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72  ateIndexKey(pPar
154c0 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 54 61 62  se, pIndex, iTab
154d0 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30 2c 20  , regRecord, 0, 
154e0 26 69 50 61 72 74 49 64 78 4c 61 62 65 6c 29 3b  &iPartIdxLabel);
154f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
15500 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
15510 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72  rInsert, iSorter
15520 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
15530 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
15540 76 65 4c 61 62 65 6c 28 76 2c 20 69 50 61 72 74  veLabel(v, iPart
15550 49 64 78 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c  IdxLabel);.  sql
15560 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
15570 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
15580 20 61 64 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c   addr1+1);.  sql
15590 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
155a0 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 69 66  (v, addr1);.  if
155b0 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3c 30 20  ( memRootPage<0 
155c0 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  ) sqlite3VdbeAdd
155d0 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61 72 2c  Op2(v, OP_Clear,
155e0 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 73   tnum, iDb);.  s
155f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
15600 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
15610 2c 20 69 49 64 78 2c 20 74 6e 75 6d 2c 20 69 44  , iIdx, tnum, iD
15620 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  b, .            
15630 20 20 20 20 20 20 20 20 28 63 68 61 72 20 2a 29          (char *)
15640 70 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f  pKey, P4_KEYINFO
15650 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
15660 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
15670 41 47 5f 42 55 4c 4b 43 53 52 7c 28 28 6d 65 6d  AG_BULKCSR|((mem
15680 52 6f 6f 74 50 61 67 65 3e 3d 30 29 3f 4f 50 46  RootPage>=0)?OPF
15690 4c 41 47 5f 50 32 49 53 52 45 47 3a 30 29 29 3b  LAG_P2ISREG:0));
156a0 0a 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69  ..  addr1 = sqli
156b0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
156c0 20 4f 50 5f 53 6f 72 74 65 72 53 6f 72 74 2c 20   OP_SorterSort, 
156d0 69 53 6f 72 74 65 72 2c 20 30 29 3b 0a 20 20 61  iSorter, 0);.  a
156e0 73 73 65 72 74 28 20 70 4b 65 79 21 3d 30 20 7c  ssert( pKey!=0 |
156f0 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
15700 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  ed || pParse->nE
15710 72 72 20 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  rr );.  if( pInd
15720 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  ex->onError!=OE_
15730 4e 6f 6e 65 20 26 26 20 70 4b 65 79 21 3d 30 20  None && pKey!=0 
15740 29 7b 0a 20 20 20 20 69 6e 74 20 6a 32 20 3d 20  ){.    int j2 = 
15750 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
15760 6e 74 41 64 64 72 28 76 29 20 2b 20 33 3b 0a 20  ntAddr(v) + 3;. 
15770 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15780 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
15790 20 30 2c 20 6a 32 29 3b 0a 20 20 20 20 61 64 64   0, j2);.    add
157a0 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r2 = sqlite3Vdbe
157b0 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
157c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
157d0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53  ddOp4Int(v, OP_S
157e0 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53  orterCompare, iS
157f0 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65  orter, j2, regRe
15800 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  cord,.          
15810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15820 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 2d 20 70 49  Key->nField - pI
15830 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a  ndex->nKeyCol);.
15840 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69 71 75      sqlite3Uniqu
15850 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  eConstraint(pPar
15860 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 70 49  se, OE_Abort, pI
15870 6e 64 65 78 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ndex);.  }else{.
15880 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69      addr2 = sqli
15890 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
158a0 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  dr(v);.  }.  sql
158b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
158c0 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 61 2c  , OP_SorterData,
158d0 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 65 63   iSorter, regRec
158e0 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ord);.  sqlite3V
158f0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
15900 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c  IdxInsert, iIdx,
15910 20 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a   regRecord, 1);.
15920 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
15930 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
15940 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
15950 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
15960 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
15970 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
15980 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15990 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74  v, OP_SorterNext
159a0 2c 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72 32  , iSorter, addr2
159b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
159c0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
159d0 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64  1);..  sqlite3Vd
159e0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
159f0 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73  lose, iTab);.  s
15a00 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
15a10 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
15a20 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx);.  sqlite3Vd
15a30 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
15a40 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a  lose, iSorter);.
15a50 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
15a60 65 20 68 65 61 70 20 73 70 61 63 65 20 74 6f 20  e heap space to 
15a70 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f 62  hold an Index ob
15a80 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c 20 63  ject with nCol c
15a90 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  olumns..**.** In
15aa0 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63  crease the alloc
15ab0 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72  ation size to pr
15ac0 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61 20 6e  ovide an extra n
15ad0 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f  Extra bytes.** o
15ae0 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  f 8-byte aligned
15af0 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65   space after the
15b00 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 61 6e   Index object an
15b10 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f  d return a.** po
15b20 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 65 78  inter to this ex
15b30 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a 70 70  tra space in *pp
15b40 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20  Extra..*/.Index 
15b50 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65  *sqlite3Allocate
15b60 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20 20 73  IndexObject(.  s
15b70 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
15b80 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
15b90 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
15ba0 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20  i16 nCol,       
15bb0 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
15bc0 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
15bd0 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  in the index */.
15be0 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
15bf0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
15c00 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65 78 74   of bytes of ext
15c10 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  ra space to allo
15c20 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70  c */.  char **pp
15c30 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a 20 50  Extra       /* P
15c40 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 65  ointer to the "e
15c50 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f 0a 29  xtra" space */.)
15c60 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20 20 20  {.  Index *p;   
15c70 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
15c80 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62 6a 65  cated index obje
15c90 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ct */.  int nByt
15ca0 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
15cb0 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  Bytes of space f
15cc0 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  or Index object 
15cd0 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e  + arrays */..  n
15ce0 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
15cf0 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b 20 20  zeof(Index)) +  
15d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
15d10 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20  ndex structure  
15d20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55  */.          ROU
15d30 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  ND8(sizeof(char*
15d40 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20 20  )*nCol) +       
15d50 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c    /* Index.azCol
15d60 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  l     */.       
15d70 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
15d80 28 74 52 6f 77 63 6e 74 29 2a 28 6e 43 6f 6c 2b  (tRowcnt)*(nCol+
15d90 31 29 20 2b 20 20 20 20 2f 2a 20 49 6e 64 65 78  1) +    /* Index
15da0 2e 61 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20  .aiRowEst   */. 
15db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dc0 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c  sizeof(i16)*nCol
15dd0 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   +            /*
15de0 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20   Index.aiColumn 
15df0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
15e00 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29        sizeof(u8)
15e10 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20  *nCol);         
15e20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f      /* Index.aSo
15e30 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d  rtOrder */.  p =
15e40 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
15e50 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b  Zero(db, nByte +
15e60 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
15e70 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70  p ){.    char *p
15e80 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29  Extra = ((char*)
15e90 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)+ROUND8(sizeof
15ea0 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d  (Index));.    p-
15eb0 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a  >azColl = (char*
15ec0 2a 29 70 45 78 74 72 61 3b 20 20 20 20 20 20 70  *)pExtra;      p
15ed0 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38 28  Extra += ROUND8(
15ee0 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e 43  sizeof(char*)*nC
15ef0 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52 6f  ol);.    p->aiRo
15f00 77 45 73 74 20 3d 20 28 74 52 6f 77 63 6e 74 2a  wEst = (tRowcnt*
15f10 29 70 45 78 74 72 61 3b 20 20 70 45 78 74 72 61  )pExtra;  pExtra
15f20 20 2b 3d 20 73 69 7a 65 6f 66 28 74 52 6f 77 63   += sizeof(tRowc
15f30 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20 20  nt)*(nCol+1);.  
15f40 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20    p->aiColumn = 
15f50 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20 20  (i16*)pExtra;   
15f60 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73 69 7a     pExtra += siz
15f70 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b 0a 20  eof(i16)*nCol;. 
15f80 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72     p->aSortOrder
15f90 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61 3b 0a   = (u8*)pExtra;.
15fa0 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d      p->nColumn =
15fb0 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e 6e 4b   nCol;.    p->nK
15fc0 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d 20 31  eyCol = nCol - 1
15fd0 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61 20 3d  ;.    *ppExtra =
15fe0 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20 6e 42   ((char*)p) + nB
15ff0 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  yte;.  }.  retur
16000 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  n p;.}../*.** Cr
16010 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
16020 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
16030 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65  e.  pName1.pName
16040 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  2 is the name of
16050 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
16060 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74  nd pTblList is t
16070 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
16080 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
16090 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74  be indexed.  Bot
160a0 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55  h will .** be NU
160b0 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79  LL for a primary
160c0 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78   key or an index
160d0 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
160e0 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a   to satisfy a.**
160f0 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
16100 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61  nt.  If pTable a
16110 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55  nd pIndex are NU
16120 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e  LL, use pParse->
16130 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20  pNewTable.** as 
16140 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
16150 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65  indexed.  pParse
16160 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61  ->pNewTable is a
16170 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a   table that is.*
16180 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
16190 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
161a0 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
161b0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
161c0 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
161d0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
161e0 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73  e indexed.  pLis
161f0 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  t will be NULL i
16200 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70  f this.** is a p
16210 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e  rimary key or un
16220 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20  ique-constraint 
16230 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
16240 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a  nt column added.
16250 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ** to the table 
16260 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
16270 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a  construction.  .
16280 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 64  **.** If the ind
16290 65 78 20 69 73 20 63 72 65 61 74 65 64 20 73 75  ex is created su
162a0 63 63 65 73 73 66 75 6c 6c 79 2c 20 72 65 74 75  ccessfully, retu
162b0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
162c0 74 68 65 20 6e 65 77 20 49 6e 64 65 78 0a 2a 2a  the new Index.**
162d0 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 69 73   structure. This
162e0 20 69 73 20 75 73 65 64 20 62 79 20 73 71 6c 69   is used by sqli
162f0 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
16300 28 29 20 74 6f 20 6d 61 72 6b 20 74 68 65 20 69  () to mark the i
16310 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68 65 20 74  ndex.** as the t
16320 61 62 6c 65 73 20 70 72 69 6d 61 72 79 20 6b 65  ables primary ke
16330 79 20 28 49 6e 64 65 78 2e 61 75 74 6f 49 6e 64  y (Index.autoInd
16340 65 78 3d 3d 32 29 2e 0a 2a 2f 0a 49 6e 64 65 78  ex==2)..*/.Index
16350 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74 65 49   *sqlite3CreateI
16360 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
16370 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c  Parse,     /* Al
16380 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
16390 6f 75 74 20 74 68 69 73 20 70 61 72 73 65 20 2a  out this parse *
163a0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
163b0 31 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  1,     /* First 
163c0 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
163d0 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
163e0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
163f0 65 32 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e  e2,     /* Secon
16400 64 20 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20  d part of index 
16410 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c  name. May be NUL
16420 4c 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  L */.  SrcList *
16430 70 54 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62  pTblName, /* Tab
16440 6c 65 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65  le to index. Use
16450 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
16460 6c 65 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70  le if 0 */.  Exp
16470 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
16480 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c  /* A list of col
16490 75 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78  umns to be index
164a0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
164b0 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45  ror,       /* OE
164c0 5f 41 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72  _Abort, OE_Ignor
164d0 65 2c 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f  e, OE_Replace, o
164e0 72 20 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54  r OE_None */.  T
164f0 6f 6b 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20  oken *pStart,   
16500 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20    /* The CREATE 
16510 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e  token that begin
16520 73 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  s this statement
16530 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 49 57   */.  Expr *pPIW
16540 68 65 72 65 2c 20 20 20 20 2f 2a 20 57 48 45 52  here,    /* WHER
16550 45 20 63 6c 61 75 73 65 20 66 6f 72 20 70 61 72  E clause for par
16560 74 69 61 6c 20 69 6e 64 69 63 65 73 20 2a 2f 0a  tial indices */.
16570 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 2c    int sortOrder,
16580 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 6f 72 64       /* Sort ord
16590 65 72 20 6f 66 20 70 72 69 6d 61 72 79 20 6b 65  er of primary ke
165a0 79 20 77 68 65 6e 20 70 4c 69 73 74 3d 3d 4e 55  y when pList==NU
165b0 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69 66 4e 6f  LL */.  int ifNo
165c0 74 45 78 69 73 74 20 20 20 20 20 2f 2a 20 4f 6d  tExist     /* Om
165d0 69 74 20 65 72 72 6f 72 20 69 66 20 69 6e 64 65  it error if inde
165e0 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  x already exists
165f0 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
16600 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 2f 2a  pRet = 0;     /*
16610 20 50 6f 69 6e 74 65 72 20 74 6f 20 72 65 74 75   Pointer to retu
16620 72 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  rn */.  Table *p
16630 54 61 62 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Tab = 0;     /* 
16640 54 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  Table to be inde
16650 78 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  xed */.  Index *
16660 70 49 6e 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a  pIndex = 0;   /*
16670 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 62 65   The index to be
16680 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 63 68   created */.  ch
16690 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20  ar *zName = 0;  
166a0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
166b0 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  e index */.  int
166c0 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   nName;         
166d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
166e0 68 61 72 61 63 74 65 72 73 20 69 6e 20 7a 4e 61  haracters in zNa
166f0 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  me */.  int i, j
16700 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69 78  ;.  DbFixer sFix
16710 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ;        /* For 
16720 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62 61  assigning databa
16730 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61 62  se names to pTab
16740 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  le */.  int sort
16750 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a 20  OrderMask;   /* 
16760 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43 20  1 to honor DESC 
16770 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f 20  in index.  0 to 
16780 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71 6c  ignore. */.  sql
16790 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
167a0 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44 62  e->db;.  Db *pDb
167b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
167c0 20 54 68 65 20 73 70 65 63 69 66 69 63 20 74 61   The specific ta
167d0 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
167e0 68 65 20 69 6e 64 65 78 65 64 20 64 61 74 61 62  he indexed datab
167f0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62  ase */.  int iDb
16800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
16810 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61   Index of the da
16820 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20 62  tabase that is b
16830 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f 0a  eing written */.
16840 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d    Token *pName =
16850 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c   0;    /* Unqual
16860 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
16870 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61 74  e index to creat
16880 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78  e */.  struct Ex
16890 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 69  prList_item *pLi
168a0 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20 6c  stItem; /* For l
168b0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69 73  ooping over pLis
168c0 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  t */.  const Col
168d0 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 20 20 20  umn *pTabCol;   
168e0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c          /* A col
168f0 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
16900 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
16910 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
16920 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
16930 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 7a 45  allocated for zE
16940 78 74 72 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  xtra[] */.  int 
16950 6e 45 78 74 72 61 43 6f 6c 3b 20 20 20 20 20 20  nExtraCol;      
16960 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16970 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
16980 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 2a  columns needed *
16990 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61  /.  char *zExtra
169a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
169b0 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73 70       /* Extra sp
169c0 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e  ace after the In
169d0 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
169e0 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 30 3b 20  Index *pPk = 0; 
169f0 20 20 20 20 20 2f 2a 20 50 52 49 4d 41 52 59 20       /* PRIMARY 
16a00 4b 45 59 20 69 6e 64 65 78 20 66 6f 72 20 57 49  KEY index for WI
16a10 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
16a20 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
16a30 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
16a40 20 29 3b 20 20 20 20 20 20 2f 2a 20 4e 65 76 65   );      /* Neve
16a50 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72  r called with pr
16a60 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ior errors */.  
16a70 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
16a80 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  iled || IN_DECLA
16a90 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 67  RE_VTAB ){.    g
16aa0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
16ab0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
16ac0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
16ad0 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
16ae0 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
16af0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
16b00 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  dex;.  }..  /*. 
16b10 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   ** Find the tab
16b20 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
16b30 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72   indexed.  Retur
16b40 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66  n early if not f
16b50 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ound..  */.  if(
16b60 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
16b70 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
16b80 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e  two-part index n
16b90 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
16ba0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
16bb0 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20     ** to search 
16bc0 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27  for the table. '
16bd0 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e  Fix' the table n
16be0 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20  ame to this db. 
16bf0 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f     ** before loo
16c00 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c  king up the tabl
16c10 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
16c20 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20  sert( pName1 && 
16c30 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44  pName2 );.    iD
16c40 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
16c50 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
16c60 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
16c70 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
16c80 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69  iDb<0 ) goto exi
16c90 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
16ca0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
16cb0 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b  e && pName->z );
16cc0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16cd0 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20  _OMIT_TEMPDB.   
16ce0 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
16cf0 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
16d00 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20  ified, check if 
16d10 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
16d20 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65   is a temp table
16d30 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65  . If so, set the
16d40 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20   database to 1. 
16d50 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20  Do not do this. 
16d60 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c     ** if initial
16d70 69 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ising a database
16d80 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a   schema..    */.
16d90 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
16da0 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20  t.busy ){.      
16db0 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72  pTab = sqlite3Sr
16dc0 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72  cListLookup(pPar
16dd0 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20  se, pTblName);. 
16de0 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d       if( pName2-
16df0 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26  >n==0 && pTab &&
16e00 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d   pTab->pSchema==
16e10 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
16e20 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44  ma ){.        iD
16e30 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  b = 1;.      }. 
16e40 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
16e50 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
16e60 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69  &sFix, pParse, i
16e70 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61  Db, "index", pNa
16e80 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  me);.    if( sql
16e90 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28 26  ite3FixSrcList(&
16ea0 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 20  sFix, pTblName) 
16eb0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61  ){.      /* Beca
16ec0 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63  use the parser c
16ed0 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61  onstructs pTblNa
16ee0 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  me from a single
16ef0 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20   identifier,.   
16f00 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78     ** sqlite3Fix
16f10 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65  SrcList can neve
16f20 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20  r fail. */.     
16f30 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20   assert(0);.    
16f40 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  }.    pTab = sql
16f50 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49  ite3LocateTableI
16f60 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 26  tem(pParse, 0, &
16f70 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b  pTblName->a[0]);
16f80 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
16f90 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30  >mallocFailed==0
16fa0 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20   || pTab==0 );. 
16fb0 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
16fc0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
16fd0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  e_index;.    if(
16fe0 20 69 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e 61   iDb==1 && db->a
16ff0 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 21  Db[iDb].pSchema!
17000 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29  =pTab->pSchema )
17010 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
17020 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
17030 0a 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e  .           "can
17040 6e 6f 74 20 63 72 65 61 74 65 20 61 20 54 45 4d  not create a TEM
17050 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54  P index on non-T
17060 45 4d 50 20 74 61 62 6c 65 20 5c 22 25 73 5c 22  EMP table \"%s\"
17070 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 54  ",.           pT
17080 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
17090 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
170a0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
170b0 20 20 20 20 69 66 28 20 21 48 61 73 52 6f 77 69      if( !HasRowi
170c0 64 28 70 54 61 62 29 20 29 20 70 50 6b 20 3d 20  d(pTab) ) pPk = 
170d0 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65  sqlite3PrimaryKe
170e0 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20  yIndex(pTab);.  
170f0 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
17100 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20  t( pName==0 );. 
17110 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72     assert( pStar
17120 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62  t==0 );.    pTab
17130 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
17140 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70  able;.    if( !p
17150 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Tab ) goto exit_
17160 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
17170 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
17180 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
17190 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
171a0 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62  .  }.  pDb = &db
171b0 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61  ->aDb[iDb];..  a
171c0 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
171d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
171e0 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20  se->nErr==0 );. 
171f0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
17200 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65  ICmp(pTab->zName
17210 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d  , "sqlite_", 7)=
17220 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 73 71  =0 .       && sq
17230 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 26 70  lite3StrNICmp(&p
17240 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61  Tab->zName[7],"a
17250 6c 74 65 72 74 61 62 5f 22 2c 39 29 21 3d 30 20  ltertab_",9)!=0 
17260 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
17270 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
17280 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
17290 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54   be indexed", pT
172a0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
172b0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
172c0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e  _index;.  }.#ifn
172d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
172e0 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d  VIEW.  if( pTab-
172f0 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
17300 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
17310 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d  pParse, "views m
17320 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
17330 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d");.    goto ex
17340 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
17350 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
17360 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17370 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
17380 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
17390 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
173a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
173b0 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65  , "virtual table
173c0 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
173d0 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
173e0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
173f0 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ex;.  }.#endif..
17400 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
17410 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
17420 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65  ndex.  Make sure
17430 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c   there is not al
17440 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20  ready another.  
17450 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  ** index or tabl
17460 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
17470 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a  name.  .  **.  *
17480 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66  * Exception:  If
17490 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
174a0 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72  the names of per
174b0 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66  manent indices f
174c0 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c  rom the.  ** sql
174d0 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
174e0 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f   (because some o
174f0 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61  ther process cha
17500 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29  nged the schema)
17510 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66   and.  ** one of
17520 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73   the index names
17530 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74   collides with t
17540 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d  he name of a tem
17550 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a  porary table or.
17560 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e    ** index, then
17570 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
17580 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69  e to process thi
17590 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  s index..  **.  
175a0 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69  ** If pName==0 i
175b0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
175c0 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67  are.  ** dealing
175d0 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20   with a primary 
175e0 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f  key or UNIQUE co
175f0 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61  nstraint.  We ha
17600 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72  ve to invent our
17610 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a  .  ** own name..
17620 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65    */.  if( pName
17630 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
17640 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
17650 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
17660 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  .    if( zName==
17670 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
17680 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
17690 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 7a  assert( pName->z
176a0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 53  !=0 );.    if( S
176b0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
176c0 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
176d0 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
176e0 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
176f0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
17700 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
17710 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
17720 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
17730 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
17740 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a  zName, 0)!=0 ){.
17750 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17760 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
17770 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
17780 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  y a table named 
17790 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
177a0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
177b0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
177c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
177d0 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
177e0 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70  dex(db, zName, p
177f0 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  Db->zName)!=0 ){
17800 0a 20 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f  .      if( !ifNo
17810 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20  tExist ){.      
17820 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
17830 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
17840 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73   %s already exis
17850 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ts", zName);.   
17860 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17870 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 69    assert( !db->i
17880 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
17890 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
178a0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
178b0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
178c0 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  }.      goto exi
178d0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
178e0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
178f0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 49 6e     int n;.    In
17900 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20  dex *pLoop;.    
17910 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62 2d 3e  for(pLoop=pTab->
17920 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70 4c 6f  pIndex, n=1; pLo
17930 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d  op; pLoop=pLoop-
17940 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d 0a 20  >pNext, n++){}. 
17950 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
17960 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 73  e3MPrintf(db, "s
17970 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 5f  qlite_autoindex_
17980 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  %s_%d", pTab->zN
17990 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69 66 28  ame, n);.    if(
179a0 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
179b0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
179c0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
179d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
179e0 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61 74 69   for authorizati
179f0 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  on to create an 
17a00 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69 66 6e  index..  */.#ifn
17a10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17a20 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
17a30 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
17a40 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 4e 61   *zDb = pDb->zNa
17a50 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
17a60 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
17a70 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
17a80 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
17a90 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29 20 29  (iDb), 0, zDb) )
17aa0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
17ab0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
17ac0 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 53 51      }.    i = SQ
17ad0 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
17ae0 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54  X;.    if( !OMIT
17af0 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
17b00 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45 5f 43  1 ) i = SQLITE_C
17b10 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
17b20 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
17b30 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
17b40 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70 54 61  e, i, zName, pTa
17b50 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29  b->zName, zDb) )
17b60 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
17b70 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
17b80 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
17b90 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73 74 3d  ..  /* If pList=
17ba0 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 69  =0, it means thi
17bb0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
17bc0 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 70  lled to make a p
17bd0 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65 79 20  rimary.  ** key 
17be0 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73 74 20  out of the last 
17bf0 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74 6f 20  column added to 
17c00 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20  the table under 
17c10 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 20 20  construction..  
17c20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61 20 66  ** So create a f
17c30 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69 6d 75  ake list to simu
17c40 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a 2f 0a  late this..  */.
17c50 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
17c60 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
17c70 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
17c80 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30  end(pParse, 0, 0
17c90 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
17ca0 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
17cb0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
17cc0 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 7a 4e    pList->a[0].zN
17cd0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
17ce0 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  trDup(pParse->db
17cf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d10 20 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e            pTab->
17d20 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d  aCol[pTab->nCol-
17d30 31 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  1].zName);.    p
17d40 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f  List->a[0].sortO
17d50 72 64 65 72 20 3d 20 28 75 38 29 73 6f 72 74 4f  rder = (u8)sortO
17d60 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rder;.  }..  /* 
17d70 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
17d80 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70 61  any bytes of spa
17d90 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20  ce are required 
17da0 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69  to store explici
17db0 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69  tly.  ** specifi
17dc0 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
17dd0 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a  uence names..  *
17de0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
17df0 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
17e00 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
17e10 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  pr = pList->a[i]
17e20 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
17e30 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 61  pExpr ){.      a
17e40 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
17e50 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a  ==TK_COLLATE );.
17e60 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20        nExtra += 
17e70 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c  (1 + sqlite3Strl
17e80 65 6e 33 30 28 70 45 78 70 72 2d 3e 75 2e 7a 54  en30(pExpr->u.zT
17e90 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d 0a 20 20  oken));.    }.  
17ea0 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c  }..  /* .  ** Al
17eb0 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
17ec0 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a   structure. .  *
17ed0 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  nName = sqli
17ee0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
17ef0 65 29 3b 0a 20 20 6e 45 78 74 72 61 43 6f 6c 20  e);.  nExtraCol 
17f00 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e 6e 4b 65  = pPk ? pPk->nKe
17f10 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70 49 6e 64  yCol : 1;.  pInd
17f20 65 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f  ex = sqlite3Allo
17f30 63 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  cateIndexObject(
17f40 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  db, pList->nExpr
17f50 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c 0a 20 20   + nExtraCol,.  
17f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f80 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e 45 78 74      nName + nExt
17f90 72 61 20 2b 20 31 2c 20 26 7a 45 78 74 72 61 29  ra + 1, &zExtra)
17fa0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
17fb0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
17fc0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
17fd0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
17fe0 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
17ff0 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65  _ALIGNMENT(pInde
18000 78 2d 3e 61 69 52 6f 77 45 73 74 29 20 29 3b 0a  x->aiRowEst) );.
18010 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
18020 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
18030 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 29 20 29  Index->azColl) )
18040 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  ;.  pIndex->zNam
18050 65 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 7a 45  e = zExtra;.  zE
18060 78 74 72 61 20 2b 3d 20 6e 4e 61 6d 65 20 2b 20  xtra += nName + 
18070 31 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e 64  1;.  memcpy(pInd
18080 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  ex->zName, zName
18090 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49  , nName+1);.  pI
180a0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70  ndex->pTable = p
180b0 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f  Tab;.  pIndex->o
180c0 6e 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45  nError = (u8)onE
180d0 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  rror;.  pIndex->
180e0 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 6f 6e  uniqNotNull = on
180f0 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a  Error!=OE_None;.
18100 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e    pIndex->autoIn
18110 64 65 78 20 3d 20 28 75 38 29 28 70 4e 61 6d 65  dex = (u8)(pName
18120 3d 3d 30 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ==0);.  pIndex->
18130 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
18140 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a  b[iDb].pSchema;.
18150 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f    pIndex->nKeyCo
18160 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  l = pList->nExpr
18170 3b 0a 20 20 69 66 28 20 70 50 49 57 68 65 72 65  ;.  if( pPIWhere
18180 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52   ){.    sqlite3R
18190 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65  esolveSelfRefere
181a0 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  nce(pParse, pTab
181b0 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c 20 70 50  , NC_PartIdx, pP
181c0 49 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20  IWhere, 0);.    
181d0 70 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78  pIndex->pPartIdx
181e0 57 68 65 72 65 20 3d 20 70 50 49 57 68 65 72 65  Where = pPIWhere
181f0 3b 0a 20 20 20 20 70 50 49 57 68 65 72 65 20 3d  ;.    pPIWhere =
18200 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
18210 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
18220 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
18230 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  , 0) );..  /* Ch
18240 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
18250 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45   should honor DE
18260 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69  SC requests on i
18270 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a  ndex columns.  *
18280 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63  /.  if( pDb->pSc
18290 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  hema->file_forma
182a0 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74  t>=4 ){.    sort
182b0 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20  OrderMask = -1; 
182c0 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20    /* Honor DESC 
182d0 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
182e0 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20  sortOrderMask = 
182f0 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20  0;    /* Ignore 
18300 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  DESC */.  }..  /
18310 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73  * Scan the names
18320 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
18330 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
18340 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20  be indexed and. 
18350 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c   ** load the col
18360 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f  umn indices into
18370 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63   the Index struc
18380 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e  ture.  Report an
18390 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61   error.  ** if a
183a0 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74  ny column is not
183b0 20 66 6f 75 6e 64 2e 0a 20 20 2a 2a 0a 20 20 2a   found..  **.  *
183c0 2a 20 54 4f 44 4f 3a 20 20 41 64 64 20 61 20 74  * TODO:  Add a t
183d0 65 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  est to make sure
183e0 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63   that the same c
183f0 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d  olumn is not nam
18400 65 64 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61  ed.  ** more tha
18410 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e 20 74 68  n once within th
18420 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20 20 4f  e same index.  O
18430 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 69 6e  nly the first in
18440 73 74 61 6e 63 65 20 6f 66 0a 20 20 2a 2a 20 74  stance of.  ** t
18450 68 65 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65  he column will e
18460 76 65 72 20 62 65 20 75 73 65 64 20 62 79 20 74  ver be used by t
18470 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e  he optimizer.  N
18480 6f 74 65 20 74 68 61 74 20 75 73 69 6e 67 20 74  ote that using t
18490 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c  he.  ** same col
184a0 75 6d 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  umn more than on
184b0 63 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20  ce cannot be an 
184c0 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 74 68  error because th
184d0 61 74 20 77 6f 75 6c 64 20 0a 20 20 2a 2a 20 62  at would .  ** b
184e0 72 65 61 6b 20 62 61 63 6b 77 61 72 64 73 20 63  reak backwards c
184f0 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 20 69  ompatibility - i
18500 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 20  t needs to be a 
18510 77 61 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20  warning..  */.  
18520 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74  for(i=0, pListIt
18530 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
18540 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
18550 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a  , pListItem++){.
18560 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
18570 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74  zColName = pList
18580 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Item->zName;.   
18590 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f   int requestedSo
185a0 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 63 68 61  rtOrder;.    cha
185b0 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20  r *zColl;       
185c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
185d0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
185e0 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66  e name */..    f
185f0 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d  or(j=0, pTabCol=
18600 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54  pTab->aCol; j<pT
18610 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
18620 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  TabCol++){.     
18630 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
18640 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54  Cmp(zColName, pT
18650 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30  abCol->zName)==0
18660 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
18670 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d      if( j>=pTab-
18680 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73  >nCol ){.      s
18690 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
186a0 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
186b0 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e   has no column n
186c0 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20 20  amed %s",.      
186d0 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a    pTab->zName, z
186e0 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ColName);.      
186f0 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
18700 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20 67  ema = 1;.      g
18710 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18720 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
18730 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
18740 43 6f 6c 3c 3d 30 78 37 66 66 66 20 26 26 20 6a  Col<=0x7fff && j
18750 3c 3d 30 78 37 66 66 66 20 29 3b 0a 20 20 20 20  <=0x7fff );.    
18760 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
18770 5b 69 5d 20 3d 20 28 69 31 36 29 6a 3b 0a 20 20  [i] = (i16)j;.  
18780 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d    if( pListItem-
18790 3e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >pExpr ){.      
187a0 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20  int nColl;.     
187b0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 49 74   assert( pListIt
187c0 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  em->pExpr->op==T
187d0 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20  K_COLLATE );.   
187e0 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74     zColl = pList
187f0 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a  Item->pExpr->u.z
18800 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f  Token;.      nCo
18810 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  ll = sqlite3Strl
18820 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b  en30(zColl) + 1;
18830 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
18840 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a  Extra>=nColl );.
18850 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 78        memcpy(zEx
18860 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c  tra, zColl, nCol
18870 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20  l);.      zColl 
18880 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20  = zExtra;.      
18890 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b  zExtra += nColl;
188a0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2d 3d  .      nExtra -=
188b0 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73   nColl;.    }els
188c0 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  e{.      zColl =
188d0 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
188e0 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  Coll;.      if( 
188f0 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d  !zColl ) zColl =
18900 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 7d   "BINARY";.    }
18910 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
18920 69 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69  it.busy && !sqli
18930 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
18940 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20  (pParse, zColl) 
18950 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
18960 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18970 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
18980 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a  x->azColl[i] = z
18990 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73  Coll;.    reques
189a0 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70  tedSortOrder = p
189b0 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  ListItem->sortOr
189c0 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d  der & sortOrderM
189d0 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ask;.    pIndex-
189e0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
189f0 20 28 75 38 29 72 65 71 75 65 73 74 65 64 53 6f   (u8)requestedSo
18a00 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 69 66 28  rtOrder;.    if(
18a10 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e   pTab->aCol[j].n
18a20 6f 74 4e 75 6c 6c 3d 3d 30 20 29 20 70 49 6e 64  otNull==0 ) pInd
18a30 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  ex->uniqNotNull 
18a40 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
18a50 50 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d  Pk ){.    for(j=
18a60 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f  0; j<pPk->nKeyCo
18a70 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; j++){.      i
18a80 6e 74 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f  nt x = pPk->aiCo
18a90 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 69  lumn[j];.      i
18aa0 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 49 6e  f( hasColumn(pIn
18ab0 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70  dex->aiColumn, p
18ac0 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20  Index->nKeyCol, 
18ad0 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  x) ){.        pI
18ae0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b  ndex->nColumn--;
18af0 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20   .      }else{. 
18b00 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61         pIndex->a
18b10 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 78 3b 0a  iColumn[i] = x;.
18b20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
18b30 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 70 50 6b 2d  azColl[i] = pPk-
18b40 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20  >azColl[j];.    
18b50 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72      pIndex->aSor
18b60 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 50 6b 2d  tOrder[i] = pPk-
18b70 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a  >aSortOrder[j];.
18b80 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
18b90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
18ba0 73 73 65 72 74 28 20 69 3d 3d 70 49 6e 64 65 78  ssert( i==pIndex
18bb0 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 7d  ->nColumn );.  }
18bc0 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 64 65 78  else{.    pIndex
18bd0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
18be0 2d 31 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  -1;.    pIndex->
18bf0 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 22 42 49 4e  azColl[i] = "BIN
18c00 41 52 59 22 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ARY";.  }.  sqli
18c10 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
18c20 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66 28 20  (pIndex);.  if( 
18c30 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
18c40 65 3d 3d 30 20 29 20 65 73 74 69 6d 61 74 65 49  e==0 ) estimateI
18c50 6e 64 65 78 57 69 64 74 68 28 70 49 6e 64 65 78  ndexWidth(pIndex
18c60 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  );..  if( pTab==
18c70 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
18c80 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  e ){.    /* This
18c90 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65   routine has bee
18ca0 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  n called to crea
18cb0 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  te an automatic 
18cc0 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a  index as a.    *
18cd0 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52  * result of a PR
18ce0 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
18cf0 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20  QUE clause on a 
18d00 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
18d10 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50  n, or.    ** a P
18d20 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e  RIMARY KEY or UN
18d30 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c  IQUE clause foll
18d40 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e  owing the column
18d50 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20   definitions..  
18d60 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66    ** i.e. one of
18d70 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
18d80 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28 78  CREATE TABLE t(x
18d90 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29   PRIMARY KEY, y)
18da0 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  ;.    ** CREATE 
18db0 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e  TABLE t(x, y, UN
18dc0 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20  IQUE(x, y));.   
18dd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65   **.    ** Eithe
18de0 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20  r way, check to 
18df0 73 65 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  see if the table
18e00 20 61 6c 72 65 61 64 79 20 68 61 73 20 73 75 63   already has suc
18e10 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20  h an index. If. 
18e20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20     ** so, don't 
18e30 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e 67 20  bother creating 
18e40 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f  this one. This o
18e50 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20  nly applies to. 
18e60 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61     ** automatica
18e70 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64 69  lly created indi
18e80 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64  ces. Users can d
18e90 6f 20 61 73 20 74 68 65 79 20 77 69 73 68 20 77  o as they wish w
18ea0 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69  ith.    ** expli
18eb0 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20  cit indices..   
18ec0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55   **.    ** Two U
18ed0 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59  NIQUE or PRIMARY
18ee0 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73   KEY constraints
18ef0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
18f00 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a  equivalent.    *
18f10 2a 20 28 61 6e 64 20 74 68 75 73 20 73 75 70 70  * (and thus supp
18f20 72 65 73 73 69 6e 67 20 74 68 65 20 73 65 63 6f  ressing the seco
18f30 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20 69 66 20  nd one) even if 
18f40 74 68 65 79 20 68 61 76 65 20 64 69 66 66 65 72  they have differ
18f50 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20  ent.    ** sort 
18f60 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20  orders..    **. 
18f70 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 61     ** If there a
18f80 72 65 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6c  re different col
18f90 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
18fa0 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6c 75 6d   or if the colum
18fb0 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ns of.    ** the
18fc0 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63 75   constraint occu
18fd0 72 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 6f  r in different o
18fe0 72 64 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20  rders, then the 
18ff0 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a  constraints are.
19000 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65      ** considere
19010 64 20 64 69 73 74 69 6e 63 74 20 61 6e 64 20 62  d distinct and b
19020 6f 74 68 20 72 65 73 75 6c 74 20 69 6e 20 73 65  oth result in se
19030 70 61 72 61 74 65 20 69 6e 64 69 63 65 73 2e 0a  parate indices..
19040 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78      */.    Index
19050 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
19060 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
19070 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
19080 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
19090 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61    int k;.      a
190a0 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45  ssert( pIdx->onE
190b0 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b  rror!=OE_None );
190c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
190d0 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29  Idx->autoIndex )
190e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
190f0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
19100 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20  =OE_None );..   
19110 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b 65     if( pIdx->nKe
19120 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e 4b  yCol!=pIndex->nK
19130 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65  eyCol ) continue
19140 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b  ;.      for(k=0;
19150 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   k<pIdx->nKeyCol
19160 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
19170 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a  const char *z1;.
19180 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
19190 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20  ar *z2;.        
191a0 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  if( pIdx->aiColu
191b0 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61  mn[k]!=pIndex->a
191c0 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65  iColumn[k] ) bre
191d0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d  ak;.        z1 =
191e0 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d   pIdx->azColl[k]
191f0 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70  ;.        z2 = p
19200 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d  Index->azColl[k]
19210 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 31  ;.        if( z1
19220 21 3d 7a 32 20 26 26 20 73 71 6c 69 74 65 33 53  !=z2 && sqlite3S
19230 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29  trICmp(z1, z2) )
19240 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
19250 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64        if( k==pId
19260 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20  x->nKeyCol ){.  
19270 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
19280 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d  onError!=pIndex-
19290 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  >onError ){.    
192a0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f        /* This co
192b0 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73  nstraint creates
192c0 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20   the same index 
192d0 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  as a previous.  
192e0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74          ** const
192f0 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20  raint specified 
19300 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65  somewhere in the
19310 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
19320 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20  atement..       
19330 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68     ** However th
19340 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c  e ON CONFLICT cl
19350 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72  auses are differ
19360 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69  ent. If both thi
19370 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
19380 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74  constraint and t
19390 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69  he previous equi
193a0 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e  valent constrain
193b0 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a  t have explicit.
193c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20            ** ON 
193d0 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73  CONFLICT clauses
193e0 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f   this is an erro
193f0 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  r. Otherwise, us
19400 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  e the.          
19410 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70  ** explicitly sp
19420 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 72  ecified behavior
19430 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a   for the index..
19440 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
19450 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64         if( !(pId
19460 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
19470 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78  efault || pIndex
19480 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
19490 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20  fault) ){.      
194a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
194b0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
194c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
194d0 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43  conflicting ON C
194e0 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
194f0 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a  specified", 0);.
19500 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
19510 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
19520 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
19530 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ult ){.         
19540 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72     pIdx->onError
19550 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72   = pIndex->onErr
19560 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  or;.          }.
19570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
19580 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
19590 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
195a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
195b0 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49  * Link the new I
195c0 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74  ndex structure t
195d0 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20  o its table and 
195e0 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a  to the other.  *
195f0 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
19600 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e  base structures.
19610 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d   .  */.  if( db-
19620 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
19630 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
19640 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53  assert( sqlite3S
19650 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64  chemaMutexHeld(d
19660 62 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53  b, 0, pIndex->pS
19670 63 68 65 6d 61 29 20 29 3b 0a 20 20 20 20 70 20  chema) );.    p 
19680 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
19690 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63  ert(&pIndex->pSc
196a0 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a  hema->idxHash, .
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 70 49 6e 64 65 78            pIndex
196d0 2d 3e 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33  ->zName, sqlite3
196e0 53 74 72 6c 65 6e 33 30 28 70 49 6e 64 65 78 2d  Strlen30(pIndex-
196f0 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20 20  >zName),.       
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19710 20 20 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20     pIndex);.    
19720 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61  if( p ){.      a
19730 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78  ssert( p==pIndex
19740 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
19750 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
19760 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  */.      db->mal
19770 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
19780 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
19790 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
197a0 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73   }.    db->flags
197b0 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
197c0 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66  nChanges;.    if
197d0 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
197e0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74  .      pIndex->t
197f0 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e  num = db->init.n
19800 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20  ewTnum;.    }.  
19810 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
19820 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 43  is the initial C
19830 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
19840 65 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54 45  ement (or CREATE
19850 20 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20 20   TABLE if the.  
19860 2a 2a 20 69 6e 64 65 78 20 69 73 20 61 6e 20 69  ** index is an i
19870 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 66 6f 72  mplied index for
19880 20 61 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49   a UNIQUE or PRI
19890 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
198a0 69 6e 74 29 20 74 68 65 6e 0a 20 20 2a 2a 20 65  int) then.  ** e
198b0 6d 69 74 20 63 6f 64 65 20 74 6f 20 61 6c 6c 6f  mit code to allo
198c0 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 72  cate the index r
198d0 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69 73 6b 20  ootpage on disk 
198e0 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65 6e 74 72  and make an entr
198f0 79 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 69  y for.  ** the i
19900 6e 64 65 78 20 69 6e 20 74 68 65 20 73 71 6c 69  ndex in the sqli
19910 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
19920 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65  and populate the
19930 20 69 6e 64 65 78 20 77 69 74 68 0a 20 20 2a 2a   index with.  **
19940 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 2c 20   content.  But, 
19950 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 69  do not do this i
19960 66 20 77 65 20 61 72 65 20 73 69 6d 70 6c 79 20  f we are simply 
19970 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69  reading the sqli
19980 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20 74  te_master.  ** t
19990 61 62 6c 65 20 74 6f 20 70 61 72 73 65 20 74 68  able to parse th
199a0 65 20 73 63 68 65 6d 61 2c 20 6f 72 20 69 66 20  e schema, or if 
199b0 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 74 68  this index is th
199c0 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e  e PRIMARY KEY in
199d0 64 65 78 0a 20 20 2a 2a 20 6f 66 20 61 20 57 49  dex.  ** of a WI
199e0 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
199f0 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
19a00 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d  pTblName==0 it m
19a10 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20  eans this index 
19a20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20  is generated as 
19a30 61 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d 41  an implied PRIMA
19a40 52 59 20 4b 45 59 0a 20 20 2a 2a 20 6f 72 20 55  RY KEY.  ** or U
19a50 4e 49 51 55 45 20 69 6e 64 65 78 20 69 6e 20 61  NIQUE index in a
19a60 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
19a70 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20  atement.  Since 
19a80 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68  the table.  ** h
19a90 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65  as just been cre
19aa0 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e  ated, it contain
19ab0 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68  s no data and th
19ac0 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69  e index initiali
19ad0 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70  zation.  ** step
19ae0 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e   can be skipped.
19af0 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
19b00 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
19b10 20 26 26 20 28 48 61 73 52 6f 77 69 64 28 70 54   && (HasRowid(pT
19b20 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 21  ab) || pTblName!
19b30 3d 30 29 20 29 7b 0a 20 20 20 20 56 64 62 65 20  =0) ){.    Vdbe 
19b40 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  *v;.    char *zS
19b50 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65  tmt;.    int iMe
19b60 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
19b70 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  em;..    v = sql
19b80 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
19b90 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
19ba0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
19bb0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20  eate_index;...  
19bc0 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
19bd0 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65  rootpage for the
19be0 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20   index.    */.  
19bf0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
19c00 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
19c10 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20  rse, 1, iDb);.  
19c20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19c30 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  Op2(v, OP_Create
19c40 49 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d  Index, iDb, iMem
19c50 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65  );..    /* Gathe
19c60 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  r the complete t
19c70 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
19c80 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
19c90 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68  t into.    ** th
19ca0 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65  e zStmt variable
19cb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
19cc0 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  pStart ){.      
19cd0 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 28 70 50  int n = (int)(pP
19ce0 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
19cf0 2e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 29 20 2b  .z - pName->z) +
19d00 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
19d10 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28  ken.n;.      if(
19d20 20 70 4e 61 6d 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d   pName->z[n-1]==
19d30 27 3b 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20  ';' ) n--;.     
19d40 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65   /* A named inde
19d50 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63  x with an explic
19d60 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  it CREATE INDEX 
19d70 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
19d80 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
19d90 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43  e3MPrintf(db, "C
19da0 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e  REATE%s INDEX %.
19db0 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45  *s",.        onE
19dc0 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20  rror==OE_None ? 
19dd0 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 20  "" : " UNIQUE", 
19de0 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20  n, pName->z);.  
19df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
19e00 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  * An automatic i
19e10 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79 20  ndex created by 
19e20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
19e30 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
19e40 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a  nt */.      /* z
19e50 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
19e60 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20  rintf(""); */.  
19e70 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20      zStmt = 0;. 
19e80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
19e90 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c   an entry in sql
19ea0 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74  ite_master for t
19eb0 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  his index.    */
19ec0 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
19ed0 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
19ee0 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54  .        "INSERT
19ef0 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55   INTO %Q.%s VALU
19f00 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51  ES('index',%Q,%Q
19f10 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20  ,#%d,%Q);",.    
19f20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
19f30 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
19f40 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
19f50 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
19f60 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
19f70 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 69  zName,.        i
19f80 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53 74  Mem,.        zSt
19f90 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  mt.    );.    sq
19fa0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
19fb0 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  zStmt);..    /* 
19fc0 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77  Fill the index w
19fd0 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70  ith data and rep
19fe0 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e  arse the schema.
19ff0 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69   Code an OP_Expi
1a000 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76  re.    ** to inv
1a010 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d  alidate all pre-
1a020 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
1a030 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nts..    */.    
1a040 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a  if( pTblName ){.
1a050 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
1a060 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1a070 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a   pIndex, iMem);.
1a080 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61        sqlite3Cha
1a090 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
1a0a0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
1a0b0 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
1a0c0 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62  eSchemaOp(v, iDb
1a0d0 2c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ,.         sqlit
1a0e0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e  e3MPrintf(db, "n
1a0f0 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70  ame='%q' AND typ
1a100 65 3d 27 69 6e 64 65 78 27 22 2c 20 70 49 6e 64  e='index'", pInd
1a110 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ex->zName));.   
1a120 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a130 64 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70 69 72  dOp1(v, OP_Expir
1a140 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e, 0);.    }.  }
1a150 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69  ..  /* When addi
1a160 6e 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74  ng an index to t
1a170 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63  he list of indic
1a180 65 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20  es for a table, 
1a190 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61  make.  ** sure a
1a1a0 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c  ll indices label
1a1b0 65 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f  ed OE_Replace co
1a1c0 6d 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f  me after all tho
1a1d0 73 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20  se labeled.  ** 
1a1e0 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73  OE_Ignore.  This
1a1f0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f   is necessary fo
1a200 72 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f  r the correct co
1a210 6e 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a 20  nstraint check. 
1a220 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 28   ** processing (
1a230 69 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61  in sqlite3Genera
1a240 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63  teConstraintChec
1a250 6b 73 28 29 29 20 61 73 20 70 61 72 74 20 6f 66  ks()) as part of
1a260 0a 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e 64  .  ** UPDATE and
1a270 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
1a280 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28  ts.  .  */.  if(
1a290 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c   db->init.busy |
1a2a0 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b  | pTblName==0 ){
1a2b0 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  .    if( onError
1a2c0 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20  !=OE_Replace || 
1a2d0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a  pTab->pIndex==0.
1a2e0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62           || pTab
1a2f0 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ->pIndex->onErro
1a300 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a  r==OE_Replace){.
1a310 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
1a320 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  ext = pTab->pInd
1a330 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  ex;.      pTab->
1a340 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b  pIndex = pIndex;
1a350 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a360 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20    Index *pOther 
1a370 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
1a380 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74        while( pOt
1a390 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f  her->pNext && pO
1a3a0 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45  ther->pNext->onE
1a3b0 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
1a3c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68   ){.        pOth
1a3d0 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  er = pOther->pNe
1a3e0 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
1a3f0 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
1a400 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
1a410 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70  .      pOther->p
1a420 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20  Next = pIndex;. 
1a430 20 20 20 7d 0a 20 20 20 20 70 52 65 74 20 3d 20     }.    pRet = 
1a440 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 49 6e 64  pIndex;.    pInd
1a450 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ex = 0;.  }..  /
1a460 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f 72  * Clean up befor
1a470 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69  e exiting */.exi
1a480 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a  t_create_index:.
1a490 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 20 66    if( pIndex ) f
1a4a0 72 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  reeIndex(db, pIn
1a4b0 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  dex);.  sqlite3E
1a4c0 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 50  xprDelete(db, pP
1a4d0 49 57 68 65 72 65 29 3b 0a 20 20 73 71 6c 69 74  IWhere);.  sqlit
1a4e0 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
1a4f0 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73  (db, pList);.  s
1a500 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
1a510 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65  ete(db, pTblName
1a520 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
1a530 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
1a540 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
1a550 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20  ./*.** Fill the 
1a560 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d  Index.aiRowEst[]
1a570 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61   array with defa
1a580 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ult information 
1a590 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  - information.**
1a5a0 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e   to be used when
1a5b0 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e   we have not run
1a5c0 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d   the ANALYZE com
1a5d0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f  mand..**.** aiRo
1a5e0 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f  wEst[0] is suppo
1a5f0 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  se to contain th
1a600 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
1a610 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ents in the inde
1a620 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64  x..** Since we d
1a630 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73  o not know, gues
1a640 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69  s 1 million.  ai
1a650 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20  RowEst[1] is an 
1a660 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a  estimate of the.
1a670 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
1a680 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  s in the table t
1a690 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
1a6a0 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f  rticular value o
1a6b0 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63  f the.** first c
1a6c0 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
1a6d0 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d  ex.  aiRowEst[2]
1a6e0 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
1a6f0 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  of the number.**
1a700 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61   of rows that ma
1a710 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
1a720 61 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20  ar combiniation 
1a730 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63  of the first 2 c
1a740 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65  olumns.** of the
1a750 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20   index.  And so 
1a760 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20  forth.  It must 
1a770 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61  always be the ca
1a780 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20  se that.*.**    
1a790 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
1a7a0 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31  N]<=aiRowEst[N-1
1a7b0 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  ].**           a
1a7c0 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a  iRowEst[N]>=1.**
1a7d0 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74  .** Apart from t
1a7e0 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74  hat, we have lit
1a7f0 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73  tle to go on bes
1a800 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61  ides intuition a
1a810 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f  s to.** how aiRo
1a820 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65  wEst[] should be
1a830 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54   initialized.  T
1a840 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72  he numbers gener
1a850 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65  ated here.** are
1a860 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61   based on typica
1a870 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69  l values found i
1a880 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73  n actual indices
1a890 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1a8a0 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49  3DefaultRowEst(I
1a8b0 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 74  ndex *pIdx){.  t
1a8c0 52 6f 77 63 6e 74 20 2a 61 20 3d 20 70 49 64 78  Rowcnt *a = pIdx
1a8d0 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e  ->aiRowEst;.  in
1a8e0 74 20 69 3b 0a 20 20 74 52 6f 77 63 6e 74 20 6e  t i;.  tRowcnt n
1a8f0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d 30  ;.  assert( a!=0
1a900 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64   );.  a[0] = pId
1a910 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 45  x->pTable->nRowE
1a920 73 74 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c 31  st;.  if( a[0]<1
1a930 30 20 29 20 61 5b 30 5d 20 3d 20 31 30 3b 0a 20  0 ) a[0] = 10;. 
1a940 20 6e 20 3d 20 31 30 3b 0a 20 20 66 6f 72 28 69   n = 10;.  for(i
1a950 3d 31 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65  =1; i<=pIdx->nKe
1a960 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
1a970 61 5b 69 5d 20 3d 20 6e 3b 0a 20 20 20 20 69 66  a[i] = n;.    if
1a980 28 20 6e 3e 35 20 29 20 6e 2d 2d 3b 0a 20 20 7d  ( n>5 ) n--;.  }
1a990 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45  .  if( pIdx->onE
1a9a0 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b  rror!=OE_None ){
1a9b0 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e 4b 65  .    a[pIdx->nKe
1a9c0 79 43 6f 6c 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d  yCol] = 1;.  }.}
1a9d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1a9e0 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61  tine will drop a
1a9f0 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64  n existing named
1aa00 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f   index.  This ro
1aa10 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65  utine.** impleme
1aa20 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44  nts the DROP IND
1aa30 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  EX statement..*/
1aa40 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f  .void sqlite3Dro
1aa50 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  pIndex(Parse *pP
1aa60 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
1aa70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73  Name, int ifExis
1aa80 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ts){.  Index *pI
1aa90 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b  ndex;.  Vdbe *v;
1aaa0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1aab0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1aac0 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73 65 72  nt iDb;..  asser
1aad0 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  t( pParse->nErr=
1aae0 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76 65 72  =0 );   /* Never
1aaf0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70 72 69   called with pri
1ab00 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  or errors */.  i
1ab10 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
1ab20 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
1ab30 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1ab40 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1ab50 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b  Name->nSrc==1 );
1ab60 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
1ab70 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
1ab80 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
1ab90 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1aba0 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70  p_index;.  }.  p
1abb0 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
1abc0 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61  indIndex(db, pNa
1abd0 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20  me->a[0].zName, 
1abe0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
1abf0 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49  abase);.  if( pI
1ac00 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ndex==0 ){.    i
1ac10 66 28 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a  f( !ifExists ){.
1ac20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1ac30 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
1ac40 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53  o such index: %S
1ac50 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  ", pName, 0);.  
1ac60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1ac70 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1ac80 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50 61 72  NamedSchema(pPar
1ac90 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  se, pName->a[0].
1aca0 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20  zDatabase);.    
1acb0 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
1acc0 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
1acd0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1ace0 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
1acf0 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49  f( pIndex->autoI
1ad00 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
1ad10 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1ad20 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63  se, "index assoc
1ad30 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55  iated with UNIQU
1ad40 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52  E ".      "or PR
1ad50 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
1ad60 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64  aint cannot be d
1ad70 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20  ropped", 0);.   
1ad80 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
1ad90 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62  index;.  }.  iDb
1ada0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
1adb0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  ToIndex(db, pInd
1adc0 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69  ex->pSchema);.#i
1add0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1ade0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
1adf0 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
1ae00 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49   = SQLITE_DROP_I
1ae10 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20  NDEX;.    Table 
1ae20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
1ae30 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  pTable;.    cons
1ae40 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
1ae50 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
1ae60 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1ae70 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
1ae80 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
1ae90 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1aea0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1aeb0 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
1aec0 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
1aed0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
1aee0 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
1aef0 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
1af00 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f 64  PDB && iDb ) cod
1af10 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
1af20 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
1af30 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1af40 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
1af50 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  e, pIndex->zName
1af60 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
1af70 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
1af80 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1af90 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
1afa0 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
1afb0 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
1afc0 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  e the index and 
1afd0 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
1afe0 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73  table */.  v = s
1aff0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1b000 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
1b010 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
1b020 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1b030 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
1b040 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  ;.    sqlite3Nes
1b050 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
1b060 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20  .       "DELETE 
1b070 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
1b080 20 6e 61 6d 65 3d 25 51 20 41 4e 44 20 74 79 70   name=%Q AND typ
1b090 65 3d 27 69 6e 64 65 78 27 22 2c 0a 20 20 20 20  e='index'",.    
1b0a0 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
1b0b0 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
1b0c0 42 4c 45 28 69 44 62 29 2c 20 70 49 6e 64 65 78  BLE(iDb), pIndex
1b0d0 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20  ->zName.    );. 
1b0e0 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53     sqlite3ClearS
1b0f0 74 61 74 54 61 62 6c 65 73 28 70 50 61 72 73 65  tatTables(pParse
1b100 2c 20 69 44 62 2c 20 22 69 64 78 22 2c 20 70 49  , iDb, "idx", pI
1b110 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  ndex->zName);.  
1b120 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
1b130 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
1b140 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  b);.    destroyR
1b150 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
1b160 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44  pIndex->tnum, iD
1b170 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
1b180 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
1b190 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20  DropIndex, iDb, 
1b1a0 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e  0, 0, pIndex->zN
1b1b0 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78  ame, 0);.  }..ex
1b1c0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20  it_drop_index:. 
1b1d0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
1b1e0 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29  elete(db, pName)
1b1f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61  ;.}../*.** pArra
1b200 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
1b210 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62  o an array of ob
1b220 6a 65 63 74 73 2e 20 45 61 63 68 20 6f 62 6a 65  jects. Each obje
1b230 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72  ct in the.** arr
1b240 61 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79  ay is szEntry by
1b250 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 69  tes in size. Thi
1b260 73 20 72 6f 75 74 69 6e 65 20 75 73 65 73 20 73  s routine uses s
1b270 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
1b280 29 0a 2a 2a 20 74 6f 20 65 78 74 65 6e 64 20 74  ).** to extend t
1b290 68 65 20 61 72 72 61 79 20 73 6f 20 74 68 61 74  he array so that
1b2a0 20 74 68 65 72 65 20 69 73 20 73 70 61 63 65 20   there is space 
1b2b0 66 6f 72 20 61 20 6e 65 77 20 6f 62 6a 65 63 74  for a new object
1b2c0 20 61 74 20 74 68 65 20 65 6e 64 2e 0a 2a 2a 0a   at the end..**.
1b2d0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
1b2e0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
1b2f0 20 2a 70 6e 45 6e 74 72 79 20 63 6f 6e 74 61 69   *pnEntry contai
1b300 6e 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ns the current s
1b310 69 7a 65 20 6f 66 0a 2a 2a 20 74 68 65 20 61 72  ize of.** the ar
1b320 72 61 79 20 28 69 6e 20 65 6e 74 72 69 65 73 20  ray (in entries 
1b330 2d 20 73 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74  - so the allocat
1b340 69 6f 6e 20 69 73 20 28 28 2a 70 6e 45 6e 74 72  ion is ((*pnEntr
1b350 79 29 20 2a 20 73 7a 45 6e 74 72 79 29 20 62 79  y) * szEntry) by
1b360 74 65 73 0a 2a 2a 20 69 6e 20 74 6f 74 61 6c 29  tes.** in total)
1b370 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
1b380 65 61 6c 6c 6f 63 28 29 20 69 73 20 73 75 63 63  ealloc() is succ
1b390 65 73 73 66 75 6c 20 28 69 2e 65 2e 20 69 66 20  essful (i.e. if 
1b3a0 6e 6f 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e  no OOM condition
1b3b0 20 6f 63 63 75 72 73 29 2c 20 74 68 65 0a 2a 2a   occurs), the.**
1b3c0 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
1b3d0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6f 62 6a   for the new obj
1b3e0 65 63 74 20 69 73 20 7a 65 72 6f 65 64 2c 20 2a  ect is zeroed, *
1b3f0 70 6e 45 6e 74 72 79 20 75 70 64 61 74 65 64 20  pnEntry updated 
1b400 74 6f 0a 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  to.** reflect th
1b410 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 74 68  e new size of th
1b420 65 20 61 72 72 61 79 20 61 6e 64 20 61 20 70 6f  e array and a po
1b430 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
1b440 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 72   allocation.** r
1b450 65 74 75 72 6e 65 64 2e 20 2a 70 49 64 78 20 69  eturned. *pIdx i
1b460 73 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64  s set to the ind
1b470 65 78 20 6f 66 20 74 68 65 20 6e 65 77 20 61 72  ex of the new ar
1b480 72 61 79 20 65 6e 74 72 79 20 69 6e 20 74 68 69  ray entry in thi
1b490 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74  s case..**.** Ot
1b4a0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
1b4b0 72 65 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2c  realloc() fails,
1b4c0 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f   *pIdx is set to
1b4d0 20 2d 31 2c 20 2a 70 6e 45 6e 74 72 79 20 72 65   -1, *pnEntry re
1b4e0 6d 61 69 6e 73 0a 2a 2a 20 75 6e 63 68 61 6e 67  mains.** unchang
1b4f0 65 64 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  ed and a copy of
1b500 20 70 41 72 72 61 79 20 72 65 74 75 72 6e 65 64   pArray returned
1b510 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
1b520 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28  e3ArrayAllocate(
1b530 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
1b540 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1b550 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20  on to notify of 
1b560 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20  malloc failures 
1b570 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61  */.  void *pArra
1b580 79 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  y,     /* Array 
1b590 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67  of objects.  Mig
1b5a0 68 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65  ht be reallocate
1b5b0 64 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74  d */.  int szEnt
1b5c0 72 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  ry,      /* Size
1b5d0 20 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20   of each object 
1b5e0 69 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a  in the array */.
1b5f0 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20    int *pnEntry, 
1b600 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1b610 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74   objects current
1b620 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69  ly in use */.  i
1b630 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  nt *pIdx        
1b640 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e   /* Write the in
1b650 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f  dex of a new slo
1b660 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63  t here */.){.  c
1b670 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 20  har *z;.  int n 
1b680 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 69 66  = *pnEntry;.  if
1b690 28 20 28 6e 20 26 20 28 6e 2d 31 29 29 3d 3d 30  ( (n & (n-1))==0
1b6a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 20 3d   ){.    int sz =
1b6b0 20 28 6e 3d 3d 30 29 20 3f 20 31 20 3a 20 32 2a   (n==0) ? 1 : 2*
1b6c0 6e 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65  n;.    void *pNe
1b6d0 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
1b6e0 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c  lloc(db, pArray,
1b6f0 20 73 7a 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20   sz*szEntry);.  
1b700 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
1b710 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d  .      *pIdx = -
1b720 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1b730 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20  pArray;.    }.  
1b740 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b    pArray = pNew;
1b750 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72  .  }.  z = (char
1b760 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73  *)pArray;.  mems
1b770 65 74 28 26 7a 5b 6e 20 2a 20 73 7a 45 6e 74 72  et(&z[n * szEntr
1b780 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b  y], 0, szEntry);
1b790 0a 20 20 2a 70 49 64 78 20 3d 20 6e 3b 0a 20 20  .  *pIdx = n;.  
1b7a0 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65  ++*pnEntry;.  re
1b7b0 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a  turn pArray;.}..
1b7c0 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
1b7d0 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
1b7e0 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
1b7f0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
1b800 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
1b810 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  be..**.** A new 
1b820 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  IdList is return
1b830 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
1b840 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
1b850 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
1b860 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71  3IdListAppend(sq
1b870 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
1b880 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
1b890 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20  *pToken){.  int 
1b8a0 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
1b8b0 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
1b8c0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1b8d0 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1b8e0 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
1b8f0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1b900 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c  turn 0;.  }.  pL
1b910 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33  ist->a = sqlite3
1b920 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
1b930 20 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70       db,.      p
1b940 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73  List->a,.      s
1b950 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30  izeof(pList->a[0
1b960 5d 29 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74  ]),.      &pList
1b970 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 69 0a  ->nId,.      &i.
1b980 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29    );.  if( i<0 )
1b990 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  {.    sqlite3IdL
1b9a0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
1b9b0 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ist);.    return
1b9c0 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d   0;.  }.  pList-
1b9d0 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71  >a[i].zName = sq
1b9e0 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1b9f0 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a  en(db, pToken);.
1ba00 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
1ba10 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
1ba20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f  an IdList..*/.vo
1ba30 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  id sqlite3IdList
1ba40 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
1ba50 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73  db, IdList *pLis
1ba60 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  t){.  int i;.  i
1ba70 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
1ba80 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
1ba90 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
1baa0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1bab0 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74  DbFree(db, pList
1bac0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
1bad0 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
1bae0 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29  ee(db, pList->a)
1baf0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1bb00 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
1bb10 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1bb20 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74  e index in pList
1bb30 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 66 69   of the identifi
1bb40 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52  er named zId.  R
1bb50 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e  eturn -1.** if n
1bb60 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74  ot found..*/.int
1bb70 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e   sqlite3IdListIn
1bb80 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73  dex(IdList *pLis
1bb90 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
1bba0 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Name){.  int i;.
1bbb0 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
1bbc0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f   return -1;.  fo
1bbd0 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
1bbe0 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nId; i++){.    i
1bbf0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1bc00 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
1bc10 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29  ame, zName)==0 )
1bc20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
1bc30 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
1bc40 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 65 20  *.** Expand the 
1bc50 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
1bc60 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 53 72  for the given Sr
1bc70 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 79 0a  cList object by.
1bc80 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 78 74  ** creating nExt
1bc90 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 65 67  ra new slots beg
1bca0 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 72 74  inning at iStart
1bcb0 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a 65 72  .  iStart is zer
1bcc0 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20  o based..** New 
1bcd0 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f 65 64  slots are zeroed
1bce0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1bcf0 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 20 53  ple, suppose a S
1bd00 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  rcList initially
1bd10 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e   contains two en
1bd20 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54  tries: A,B..** T
1bd30 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 20 65  o append 3 new e
1bd40 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 65 20  ntries onto the 
1bd50 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a  end, do this:.**
1bd60 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 53 72  .**    sqlite3Sr
1bd70 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
1bd80 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 32 29   pSrclist, 3, 2)
1bd90 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68  ;.**.** After th
1bda0 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 74 20  e call above it 
1bdb0 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20  would contain:  
1bdc0 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20  A, B, nil, nil, 
1bdd0 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69  nil..** If the i
1bde0 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 20 68  Start argument h
1bdf0 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 65 61  ad been 1 instea
1be00 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 68 65  d of 2, then the
1be10 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64   result.** would
1be20 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 2c 20   have been:  A, 
1be30 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42  nil, nil, nil, B
1be40 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 74 68  .  To prepend th
1be50 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20  e new slots,.** 
1be60 74 68 65 20 69 53 74 61 72 74 20 76 61 6c 75 65  the iStart value
1be70 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68   would be 0.  Th
1be80 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 77 6f  e result then wo
1be90 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20  uld.** be: nil, 
1bea0 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a  nil, nil, A, B..
1beb0 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
1bec0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
1bed0 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 69  ls the SrcList i
1bee0 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 54 68  s unchanged.  Th
1bef0 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  e.** db->mallocF
1bf00 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c 6c 20  ailed flag will 
1bf10 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 2e 0a  be set to true..
1bf20 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
1bf30 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
1bf40 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e(.  sqlite3 *db
1bf50 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ,       /* Datab
1bf60 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ase connection t
1bf70 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20  o notify of OOM 
1bf80 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c  errors */.  SrcL
1bf90 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  ist *pSrc,     /
1bfa0 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 74 6f  * The SrcList to
1bfb0 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a   be enlarged */.
1bfc0 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
1bfd0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1bfe0 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f 20 61  f new slots to a
1bff0 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20  dd to pSrc->a[] 
1c000 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 74 20  */.  int iStart 
1c010 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1c020 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66   in pSrc->a[] of
1c030 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f 74 20   first new slot 
1c040 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  */.){.  int i;..
1c050 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65 63    /* Sanity chec
1c060 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20  king on calling 
1c070 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
1c080 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3e 3d  assert( iStart>=
1c090 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
1c0a0 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 61 73  Extra>=1 );.  as
1c0b0 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b  sert( pSrc!=0 );
1c0c0 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72  .  assert( iStar
1c0d0 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 29 3b  t<=pSrc->nSrc );
1c0e0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1c0f0 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65  additional space
1c100 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
1c110 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e  if( pSrc->nSrc+n
1c120 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c  Extra>pSrc->nAll
1c130 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  oc ){.    SrcLis
1c140 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74  t *pNew;.    int
1c150 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d 3e   nAlloc = pSrc->
1c160 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20 20 20  nSrc+nExtra;.   
1c170 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70   int nGot;.    p
1c180 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
1c190 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c  ealloc(db, pSrc,
1c1a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c1b0 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20  sizeof(*pSrc) + 
1c1c0 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f  (nAlloc-1)*sizeo
1c1d0 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b  f(pSrc->a[0]) );
1c1e0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
1c1f0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1c200 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1c210 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
1c220 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20  rn pSrc;.    }. 
1c230 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a     pSrc = pNew;.
1c240 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69      nGot = (sqli
1c250 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
1c260 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a 65  db, pNew) - size
1c270 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f  of(*pSrc))/sizeo
1c280 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b  f(pSrc->a[0])+1;
1c290 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f  .    pSrc->nAllo
1c2a0 63 20 3d 20 28 75 38 29 6e 47 6f 74 3b 0a 20 20  c = (u8)nGot;.  
1c2b0 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69  }..  /* Move exi
1c2c0 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68 61 74  sting slots that
1c2d0 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65 20   come after the 
1c2e0 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20 73  newly inserted s
1c2f0 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66  lots.  ** out of
1c300 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f   the way */.  fo
1c310 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31  r(i=pSrc->nSrc-1
1c320 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d  ; i>=iStart; i--
1c330 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69  ){.    pSrc->a[i
1c340 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72 63 2d  +nExtra] = pSrc-
1c350 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72  >a[i];.  }.  pSr
1c360 63 2d 3e 6e 53 72 63 20 2b 3d 20 28 69 38 29 6e  c->nSrc += (i8)n
1c370 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72  Extra;..  /* Zer
1c380 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f  o the newly allo
1c390 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20  cated slots */. 
1c3a0 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61   memset(&pSrc->a
1c3b0 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a  [iStart], 0, siz
1c3c0 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a  eof(pSrc->a[0])*
1c3d0 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69  nExtra);.  for(i
1c3e0 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72  =iStart; i<iStar
1c3f0 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a  t+nExtra; i++){.
1c400 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69      pSrc->a[i].i
1c410 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d  Cursor = -1;.  }
1c420 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20  ..  /* Return a 
1c430 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65  pointer to the e
1c440 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73 74 20  nlarged SrcList 
1c450 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63  */.  return pSrc
1c460 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  ;.}.../*.** Appe
1c470 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e  nd a new table n
1c480 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ame to the given
1c490 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74   SrcList.  Creat
1c4a0 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20  e a new SrcList 
1c4b0 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20  if.** need be.  
1c4c0 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63  A new entry is c
1c4d0 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 72  reated in the Sr
1c4e0 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 54  cList even if pT
1c4f0 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  able is NULL..**
1c500 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73  .** A SrcList is
1c510 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
1c520 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 61  LL if there is a
1c530 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68  n OOM error.  Th
1c540 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72  e returned.** Sr
1c550 63 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 74  cList might be t
1c560 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 53  he same as the S
1c570 72 63 4c 69 73 74 20 74 68 61 74 20 77 61 73 20  rcList that was 
1c580 69 6e 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68  input or it migh
1c590 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e  t be.** a new on
1c5a0 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  e.  If an OOM er
1c5b0 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c  ror does occurs,
1c5c0 20 74 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20   then the prior 
1c5d0 76 61 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a  value of pList.*
1c5e0 2a 20 74 68 61 74 20 69 73 20 69 6e 70 75 74 20  * that is input 
1c5f0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
1c600 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
1c610 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
1c620 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f   pDatabase is no
1c630 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73  t null, it means
1c640 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 20   that the table 
1c650 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a  has an optional.
1c660 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
1c670 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74   prefix.  Like t
1c680 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e  his:  "database.
1c690 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61  table".  The pDa
1c6a0 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73  tabase.** points
1c6b0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61   to the table na
1c6c0 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c  me and the pTabl
1c6d0 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
1c6e0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
1c6f0 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b  * The SrcList.a[
1c700 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73  ].zName field is
1c710 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65   filled with the
1c720 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63   table name whic
1c730 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20  h might.** come 
1c740 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20  from pTable (if 
1c750 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
1c760 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61  L) or from pData
1c770 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69  base.  .** SrcLi
1c780 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65  st.a[].zDatabase
1c790 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
1c7a0 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1c7b0 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a  e from pTable,.*
1c7c0 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69  * or with NULL i
1c7d0 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73  f no database is
1c7e0 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
1c7f0 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
1c800 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74  , if call like t
1c810 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
1c820 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1c830 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29  tAppend(D,A,B,0)
1c840 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69  ;.**.** Then B i
1c850 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  s a table name a
1c860 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
1c870 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66  name is unspecif
1c880 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a  ied.  If called.
1c890 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ** like this:.**
1c8a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
1c8b0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1c8c0 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a  (D,A,B,C);.**.**
1c8d0 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 74   Then C is the t
1c8e0 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20  able name and B 
1c8f0 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
1c900 6e 61 6d 65 2e 20 20 49 66 20 43 20 69 73 20 64  name.  If C is d
1c910 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 73  efined.** then s
1c920 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 65  o is B.  In othe
1c930 72 20 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 65  r words, we neve
1c940 72 20 68 61 76 65 20 61 20 63 61 73 65 20 77 68  r have a case wh
1c950 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ere:.**.**      
1c960 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1c970 74 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 29  tAppend(D,A,0,C)
1c980 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 61  ;.**.** Both pTa
1c990 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
1c9a0 65 20 61 72 65 20 61 73 73 75 6d 65 64 20 74 6f  e are assumed to
1c9b0 20 62 65 20 71 75 6f 74 65 64 2e 20 20 54 68 65   be quoted.  The
1c9c0 79 20 61 72 65 20 64 65 71 75 6f 74 65 64 0a 2a  y are dequoted.*
1c9d0 2a 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61  * before being a
1c9e0 64 64 65 64 20 74 6f 20 74 68 65 20 53 72 63 4c  dded to the SrcL
1c9f0 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ist..*/.SrcList 
1ca00 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
1ca10 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33  ppend(.  sqlite3
1ca20 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20   *db,        /* 
1ca30 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
1ca40 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
1ca50 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63  ailures */.  Src
1ca60 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
1ca70 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68   /* Append to th
1ca80 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c  is SrcList. NULL
1ca90 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 53   creates a new S
1caa0 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65  rcList */.  Toke
1cab0 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20  n *pTable,      
1cac0 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65  /* Table to appe
1cad0 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nd */.  Token *p
1cae0 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44  Database    /* D
1caf0 61 74 61 62 61 73 65 20 6f 66 20 74 68 65 20 74  atabase of the t
1cb00 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  able */.){.  str
1cb10 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1cb20 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 72   *pItem;.  asser
1cb30 74 28 20 70 44 61 74 61 62 61 73 65 3d 3d 30 20  t( pDatabase==0 
1cb40 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 20  || pTable!=0 ); 
1cb50 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 20   /* Cannot have 
1cb60 43 20 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a 20  C without B */. 
1cb70 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
1cb80 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
1cb90 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
1cba0 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c  (db, sizeof(SrcL
1cbb0 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
1cbc0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1cbd0 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  n 0;.    pList->
1cbe0 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a  nAlloc = 1;.  }.
1cbf0 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
1cc00 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28  3SrcListEnlarge(
1cc10 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c  db, pList, 1, pL
1cc20 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 69 66  ist->nSrc);.  if
1cc30 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1cc40 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
1cc50 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
1cc60 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72  b, pList);.    r
1cc70 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1cc80 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
1cc90 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b  [pList->nSrc-1];
1cca0 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65  .  if( pDatabase
1ccb0 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a   && pDatabase->z
1ccc0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61  ==0 ){.    pData
1ccd0 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  base = 0;.  }.  
1cce0 69 66 28 20 70 44 61 74 61 62 61 73 65 20 29 7b  if( pDatabase ){
1ccf0 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d  .    Token *pTem
1cd00 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20  p = pDatabase;. 
1cd10 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70     pDatabase = p
1cd20 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c  Table;.    pTabl
1cd30 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20  e = pTemp;.  }. 
1cd40 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20   pItem->zName = 
1cd50 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1cd60 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29  oken(db, pTable)
1cd70 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  ;.  pItem->zData
1cd80 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  base = sqlite3Na
1cd90 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1cda0 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 72 65  pDatabase);.  re
1cdb0 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
1cdc0 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64 62 65  *.** Assign Vdbe
1cdd0 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d  Cursor index num
1cde0 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c  bers to all tabl
1cdf0 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a  es in a SrcList.
1ce00 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1ce10 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
1ce20 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  ors(Parse *pPars
1ce30 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  e, SrcList *pLis
1ce40 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
1ce50 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1ce60 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73  em *pItem;.  ass
1ce70 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70 50 61  ert(pList || pPa
1ce80 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
1ce90 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
1cea0 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
1ceb0 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  i=0, pItem=pList
1cec0 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  ->a; i<pList->nS
1ced0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
1cee0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
1cef0 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29  em->iCursor>=0 )
1cf00 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49   break;.      pI
1cf10 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
1cf20 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
1cf30 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
1cf40 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
1cf50 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1cf60 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
1cf70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Parse, pItem->pS
1cf80 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20  elect->pSrc);.  
1cf90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1cfa0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
1cfb0 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73  an entire SrcLis
1cfc0 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  t including all 
1cfd0 69 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65  its substructure
1cfe0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1cff0 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 73  3SrcListDelete(s
1d000 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
1d010 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
1d020 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
1d030 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1d040 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
1d050 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1d060 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
1d070 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
1d080 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
1d090 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
1d0a0 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
1d0b0 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
1d0c0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1d0d0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  (db, pItem->zNam
1d0e0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  e);.    sqlite3D
1d0f0 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d  bFree(db, pItem-
1d100 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 73 71  >zAlias);.    sq
1d110 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1d120 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a  pItem->zIndex);.
1d130 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
1d140 65 54 61 62 6c 65 28 64 62 2c 20 70 49 74 65 6d  eTable(db, pItem
1d150 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c  ->pTab);.    sql
1d160 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1d170 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  (db, pItem->pSel
1d180 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ect);.    sqlite
1d190 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
1d1a0 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20  pItem->pOn);.   
1d1b0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
1d1c0 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
1d1d0 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73  pUsing);.  }.  s
1d1e0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1d1f0 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pList);.}../*.*
1d200 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1d210 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
1d220 70 61 72 73 65 72 20 74 6f 20 61 64 64 20 61 20  parser to add a 
1d230 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a  new term to the.
1d240 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77  ** end of a grow
1d250 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  ing FROM clause.
1d260 20 20 54 68 65 20 22 70 22 20 70 61 72 61 6d 65    The "p" parame
1d270 74 65 72 20 69 73 20 74 68 65 20 70 61 72 74 20  ter is the part 
1d280 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  of.** the FROM c
1d290 6c 61 75 73 65 20 74 68 61 74 20 68 61 73 20 61  lause that has a
1d2a0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73  lready been cons
1d2b0 74 72 75 63 74 65 64 2e 20 20 22 70 22 20 69 73  tructed.  "p" is
1d2c0 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73   NULL.** if this
1d2d0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65   is the first te
1d2e0 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
1d2f0 6c 61 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61  lause.  pTable a
1d300 6e 64 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20  nd pDatabase.** 
1d310 61 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  are the name of 
1d320 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61  the table and da
1d330 74 61 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20  tabase named in 
1d340 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1d350 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61  term..** pDataba
1d360 73 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68  se is NULL if th
1d370 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
1d380 71 75 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73  qualifier is mis
1d390 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73  sing - the.** us
1d3a0 75 61 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68  ual case.  If th
1d3b0 65 20 74 65 72 6d 20 68 61 73 20 61 20 61 6c 69  e term has a ali
1d3c0 61 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20  as, then pAlias 
1d3d0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
1d3e0 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49   alias token.  I
1d3f0 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20  f the term is a 
1d400 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70  subquery, then p
1d410 53 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a  Subquery is the.
1d420 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ** SELECT statem
1d430 65 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62  ent that the sub
1d440 71 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20  query encodes.  
1d450 54 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a  The pTable and.*
1d460 2a 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61  * pDatabase para
1d470 6d 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20  meters are NULL 
1d480 66 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20  for subqueries. 
1d490 20 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73   The pOn and pUs
1d4a0 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ing.** parameter
1d4b0 73 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e  s are the conten
1d4c0 74 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20  t of the ON and 
1d4d0 55 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a  USING clauses..*
1d4e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65  *.** Return a ne
1d4f0 77 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20  w SrcList which 
1d500 65 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46  encodes is the F
1d510 52 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77  ROM with the new
1d520 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a  .** term added..
1d530 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
1d540 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
1d550 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73  FromTerm(.  Pars
1d560 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1d570 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1d580 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
1d590 69 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ist *p,         
1d5a0 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20      /* The left 
1d5b0 70 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  part of the FROM
1d5c0 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20   clause already 
1d5d0 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  seen */.  Token 
1d5e0 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20  *pTable,        
1d5f0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1d600 20 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f   table to add to
1d610 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1d620 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61   */.  Token *pDa
1d630 74 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a  tabase,       /*
1d640 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
1d650 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
1d660 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b   pTable */.  Tok
1d670 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20  en *pAlias,     
1d680 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
1d690 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
1d6a0 68 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73  he AS subexpress
1d6b0 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ion */.  Select 
1d6c0 2a 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20  *pSubquery,     
1d6d0 20 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75   /* A subquery u
1d6e0 73 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  sed in place of 
1d6f0 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a  a table name */.
1d700 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20    Expr *pOn,    
1d710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1d720 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20   ON clause of a 
1d730 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74  join */.  IdList
1d740 20 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20   *pUsing        
1d750 20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63    /* The USING c
1d760 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
1d770 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
1d780 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1d790 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  em;.  sqlite3 *d
1d7a0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1d7b0 20 20 69 66 28 20 21 70 20 26 26 20 28 70 4f 6e    if( !p && (pOn
1d7c0 20 7c 7c 20 70 55 73 69 6e 67 29 20 29 7b 0a 20   || pUsing) ){. 
1d7d0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1d7e0 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 4a 4f  sg(pParse, "a JO
1d7f0 49 4e 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  IN clause is req
1d800 75 69 72 65 64 20 62 65 66 6f 72 65 20 25 73 22  uired before %s"
1d810 2c 20 0a 20 20 20 20 20 20 28 70 4f 6e 20 3f 20  , .      (pOn ? 
1d820 22 4f 4e 22 20 3a 20 22 55 53 49 4e 47 22 29 0a  "ON" : "USING").
1d830 20 20 20 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20      );.    goto 
1d840 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f  append_from_erro
1d850 72 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c  r;.  }.  p = sql
1d860 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
1d870 64 28 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c  d(db, p, pTable,
1d880 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69   pDatabase);.  i
1d890 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52  f( p==0 || NEVER
1d8a0 28 70 2d 3e 6e 53 72 63 3d 3d 30 29 20 29 7b 0a  (p->nSrc==0) ){.
1d8b0 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f      goto append_
1d8c0 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  from_error;.  }.
1d8d0 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b    pItem = &p->a[
1d8e0 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 61 73  p->nSrc-1];.  as
1d8f0 73 65 72 74 28 20 70 41 6c 69 61 73 21 3d 30 20  sert( pAlias!=0 
1d900 29 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73 2d  );.  if( pAlias-
1d910 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d  >n ){.    pItem-
1d920 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
1d930 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1d940 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a  b, pAlias);.  }.
1d950 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74    pItem->pSelect
1d960 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20   = pSubquery;.  
1d970 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e  pItem->pOn = pOn
1d980 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e  ;.  pItem->pUsin
1d990 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65  g = pUsing;.  re
1d9a0 74 75 72 6e 20 70 3b 0a 0a 20 61 70 70 65 6e 64  turn p;.. append
1d9b0 5f 66 72 6f 6d 5f 65 72 72 6f 72 3a 0a 20 20 61  _from_error:.  a
1d9c0 73 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20  ssert( p==0 );. 
1d9d0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1d9e0 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 73  te(db, pOn);.  s
1d9f0 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
1da00 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29 3b 0a  te(db, pUsing);.
1da10 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1da20 65 6c 65 74 65 28 64 62 2c 20 70 53 75 62 71 75  elete(db, pSubqu
1da30 65 72 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  ery);.  return 0
1da40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
1da50 6e 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20  n INDEXED BY or 
1da60 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
1da70 73 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72  se to the most r
1da80 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a  ecently added .*
1da90 2a 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  * element of the
1daa0 20 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73   source-list pas
1dab0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
1dac0 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76  d argument..*/.v
1dad0 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
1dae0 73 74 49 6e 64 65 78 65 64 42 79 28 50 61 72 73  stIndexedBy(Pars
1daf0 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
1db00 73 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49  st *p, Token *pI
1db10 6e 64 65 78 65 64 42 79 29 7b 0a 20 20 61 73 73  ndexedBy){.  ass
1db20 65 72 74 28 20 70 49 6e 64 65 78 65 64 42 79 21  ert( pIndexedBy!
1db30 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 20 26 26  =0 );.  if( p &&
1db40 20 41 4c 57 41 59 53 28 70 2d 3e 6e 53 72 63 3e   ALWAYS(p->nSrc>
1db50 30 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  0) ){.    struct
1db60 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1db70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
1db80 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73  nSrc-1];.    ass
1db90 65 72 74 28 20 70 49 74 65 6d 2d 3e 6e 6f 74 49  ert( pItem->notI
1dba0 6e 64 65 78 65 64 3d 3d 30 20 26 26 20 70 49 74  ndexed==0 && pIt
1dbb0 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30 20 29 3b  em->zIndex==0 );
1dbc0 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65  .    if( pIndexe
1dbd0 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49  dBy->n==1 && !pI
1dbe0 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20  ndexedBy->z ){. 
1dbf0 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49       /* A "NOT I
1dc00 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77  NDEXED" clause w
1dc10 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65  as supplied. See
1dc20 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20   parse.y .      
1dc30 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e  ** construct "in
1dc40 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64  dexed_opt" for d
1dc50 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
1dc60 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78   pItem->notIndex
1dc70 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
1dc80 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  e{.      pItem->
1dc90 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  zIndex = sqlite3
1dca0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
1dcb0 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78  arse->db, pIndex
1dcc0 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  edBy);.    }.  }
1dcd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62  .}../*.** When b
1dce0 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f  uilding up a FRO
1dcf0 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
1dd00 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e  parser, the join
1dd10 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
1dd20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68  initially attach
1dd30 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ed to the left o
1dd40 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65  perand.  But the
1dd50 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
1dd60 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65 20 6a  ** expects the j
1dd70 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  oin operator to 
1dd80 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  be on the right 
1dd90 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72  operand.  This r
1dda0 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73  outine.** Shifts
1ddb0 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74   all join operat
1ddc0 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  ors from left to
1ddd0 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e   right for an en
1dde0 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61  tire FROM.** cla
1ddf0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  use..**.** Examp
1de00 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20  le: Suppose the 
1de10 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69  join is like thi
1de20 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1de30 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f     A natural cro
1de40 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20  ss join B.**.** 
1de50 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20  The operator is 
1de60 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a  "natural cross j
1de70 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64  oin".  The A and
1de80 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20   B operands are 
1de90 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e  stored.** in p->
1dea0 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d  a[0] and p->a[1]
1deb0 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
1dec0 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 69 74   The parser init
1ded0 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65  ially stores the
1dee0 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74  .** operator wit
1def0 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69  h A.  This routi
1df00 6e 65 20 73 68 69 66 74 73 20 74 68 61 74 20 6f  ne shifts that o
1df10 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20  perator over to 
1df20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  B..*/.void sqlit
1df30 65 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f  e3SrcListShiftJo
1df40 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a  inType(SrcList *
1df50 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
1df60 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73     int i;.    as
1df70 73 65 72 74 28 20 70 2d 3e 61 20 7c 7c 20 70 2d  sert( p->a || p-
1df80 3e 6e 53 72 63 3d 3d 30 20 29 3b 0a 20 20 20 20  >nSrc==0 );.    
1df90 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b  for(i=p->nSrc-1;
1dfa0 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
1dfb0 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79    p->a[i].jointy
1dfc0 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a  pe = p->a[i-1].j
1dfd0 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20  ointype;.    }. 
1dfe0 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74     p->a[0].joint
1dff0 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ype = 0;.  }.}..
1e000 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72  /*.** Begin a tr
1e010 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
1e020 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72  d sqlite3BeginTr
1e030 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
1e040 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70  *pParse, int typ
1e050 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
1e060 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
1e070 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74  int i;..  assert
1e080 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20  ( pParse!=0 );. 
1e090 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
1e0a0 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ;.  assert( db!=
1e0b0 30 20 29 3b 0a 2f 2a 20 20 69 66 28 20 64 62 2d  0 );./*  if( db-
1e0c0 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[0].pBt==0 )
1e0d0 20 72 65 74 75 72 6e 3b 20 2a 2f 0a 20 20 69 66   return; */.  if
1e0e0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1e0f0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1e100 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
1e110 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 7b  BEGIN", 0, 0) ){
1e120 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1e130 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1e140 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1e150 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e   if( !v ) return
1e160 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b  ;.  if( type!=TK
1e170 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20  _DEFERRED ){.   
1e180 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
1e190 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
1e1a0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1e1b0 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  p2(v, OP_Transac
1e1c0 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d  tion, i, (type==
1e1d0 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29  TK_EXCLUSIVE)+1)
1e1e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1e1f0 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
1e200 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  i);.    }.  }.  
1e210 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e220 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
1e230 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  it, 0, 0);.}../*
1e240 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61  .** Commit a tra
1e250 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
1e260 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72   sqlite3CommitTr
1e270 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
1e280 2a 70 50 61 72 73 65 29 7b 0a 20 20 56 64 62 65  *pParse){.  Vdbe
1e290 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *v;..  assert( 
1e2a0 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
1e2b0 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64  ssert( pParse->d
1e2c0 62 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 73 71  b!=0 );.  if( sq
1e2d0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1e2e0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
1e2f0 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d  ANSACTION, "COMM
1e300 49 54 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  IT", 0, 0) ){.  
1e310 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1e320 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1e330 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1e340 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1e350 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e360 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
1e370 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 0);.  }.}../*.
1e380 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72  ** Rollback a tr
1e390 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
1e3a0 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63  d sqlite3Rollbac
1e3b0 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72  kTransaction(Par
1e3c0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 56  se *pParse){.  V
1e3d0 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72  dbe *v;..  asser
1e3e0 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
1e3f0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1e400 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66 28  ->db!=0 );.  if(
1e410 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1e420 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1e430 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52  _TRANSACTION, "R
1e440 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20  OLLBACK", 0, 0) 
1e450 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
1e460 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33   }.  v = sqlite3
1e470 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1e480 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1e490 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e4a0 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
1e4b0 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d  it, 1, 1);.  }.}
1e4c0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1e4d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1e4e0 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
1e4f0 65 6e 20 69 74 20 70 61 72 73 65 73 20 61 20 63  en it parses a c
1e500 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74 65  ommand to create
1e510 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72 20  ,.** release or 
1e520 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20  rollback an SQL 
1e530 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76  savepoint. .*/.v
1e540 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76 65 70  oid sqlite3Savep
1e550 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72  oint(Parse *pPar
1e560 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65  se, int op, Toke
1e570 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61  n *pName){.  cha
1e580 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
1e590 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1e5a0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
1e5b0 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  e);.  if( zName 
1e5c0 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
1e5d0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1e5e0 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66  pParse);.#ifndef
1e5f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1e600 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73  HORIZATION.    s
1e610 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1e620 20 2a 20 63 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20   * const az[] = 
1e630 7b 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c 45  { "BEGIN", "RELE
1e640 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  ASE", "ROLLBACK"
1e650 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   };.    assert( 
1e660 21 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e  !SAVEPOINT_BEGIN
1e670 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   && SAVEPOINT_RE
1e680 4c 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56 45  LEASE==1 && SAVE
1e690 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d  POINT_ROLLBACK==
1e6a0 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  2 );.#endif.    
1e6b0 69 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74 65  if( !v || sqlite
1e6c0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1e6d0 65 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f  e, SQLITE_SAVEPO
1e6e0 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61  INT, az[op], zNa
1e6f0 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  me, 0) ){.      
1e700 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
1e710 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  arse->db, zName)
1e720 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
1e730 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1e740 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
1e750 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c  P_Savepoint, op,
1e760 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34   0, 0, zName, P4
1e770 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d  _DYNAMIC);.  }.}
1e780 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1e790 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62  e the TEMP datab
1e7a0 61 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  ase is open and 
1e7b0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
1e7c0 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68  e.  Return.** th
1e7d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
1e7e0 72 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65  rs.  Leave any e
1e7f0 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
1e800 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75   the pParse stru
1e810 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cture..*/.int sq
1e820 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
1e830 61 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61  abase(Parse *pPa
1e840 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  rse){.  sqlite3 
1e850 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1e860 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b  ;.  if( db->aDb[
1e870 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50  1].pBt==0 && !pP
1e880 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b  arse->explain ){
1e890 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1e8a0 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 20 20 20   Btree *pBt;.   
1e8b0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
1e8c0 74 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20 20  t flags = .     
1e8d0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1e8e0 5f 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20  _READWRITE |.   
1e8f0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1e900 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
1e910 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1e920 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20  N_EXCLUSIVE |.  
1e930 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1e940 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
1e950 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
1e960 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
1e970 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  B;..    rc = sql
1e980 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62  ite3BtreeOpen(db
1e990 2d 3e 70 56 66 73 2c 20 30 2c 20 64 62 2c 20 26  ->pVfs, 0, db, &
1e9a0 70 42 74 2c 20 30 2c 20 66 6c 61 67 73 29 3b 0a  pBt, 0, flags);.
1e9b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e9c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1e9d0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1e9e0 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
1e9f0 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
1ea00 72 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20  ry database ".  
1ea10 20 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20        "file for 
1ea20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72  storing temporar
1ea30 79 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20  y tables");.    
1ea40 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72    pParse->rc = r
1ea50 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  c;.      return 
1ea60 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  1;.    }.    db-
1ea70 3e 61 44 62 5b 31 5d 2e 70 42 74 20 3d 20 70 42  >aDb[1].pBt = pB
1ea80 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  t;.    assert( d
1ea90 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
1eaa0 61 20 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  a );.    if( SQL
1eab0 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74  ITE_NOMEM==sqlit
1eac0 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
1ead0 7a 65 28 70 42 74 2c 20 64 62 2d 3e 6e 65 78 74  ze(pBt, db->next
1eae0 50 61 67 65 73 69 7a 65 2c 20 2d 31 2c 20 30 29  Pagesize, -1, 0)
1eaf0 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61   ){.      db->ma
1eb00 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
1eb10 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1eb20 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1eb30 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
1eb40 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
1eb50 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69  e that will veri
1eb60 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
1eb70 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a  okie and start.*
1eb80 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  * a read-transac
1eb90 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d  tion for all nam
1eba0 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
1ebb0 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  s..**.** It is i
1ebc0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c  mportant that al
1ebd0 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73  l schema cookies
1ebe0 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e 64   be verified and
1ebf0 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61   all.** read tra
1ec00 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61  nsactions be sta
1ec10 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74  rted before anyt
1ec20 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e  hing else happen
1ec30 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45  s in.** the VDBE
1ec40 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74   program.  But t
1ec50 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
1ec60 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
1ec70 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f  much other.** co
1ec80 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65  de has been gene
1ec90 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20  rated.  So here 
1eca0 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a  is what we do:.*
1ecb0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
1ecc0 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
1ecd0 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63   is called, we c
1ece0 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74  ode an OP_Goto t
1ecf0 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70  hat.** will jump
1ed00 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
1ed10 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
1ed20 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65  he program.  The
1ed30 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65  n we.** record e
1ed40 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68  very database th
1ed50 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68  at needs its sch
1ed60 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20  ema verified in 
1ed70 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63  the.** pParse->c
1ed80 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e  ookieMask field.
1ed90 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61    Later, after a
1eda0 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61  ll other code ha
1edb0 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61  s been.** genera
1edc0 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ted, the subrout
1edd0 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68  ine that does th
1ede0 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63  e cookie verific
1edf0 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74  ations and.** st
1ee00 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  arts the transac
1ee10 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f  tions will be co
1ee20 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47  ded and the OP_G
1ee30 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20  oto P2 value.** 
1ee40 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
1ee50 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75  point to that su
1ee60 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67  broutine.  The g
1ee70 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  eneration of the
1ee80 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  .** cookie verif
1ee90 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69  ication subrouti
1eea0 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20  ne code happens 
1eeb0 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  in sqlite3Finish
1eec0 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20  Coding()..**.** 
1eed0 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f  If iDb<0 then co
1eee0 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f  de the OP_Goto o
1eef0 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20  nly - don't set 
1ef00 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20 74  flag to verify t
1ef10 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20  he.** schema on 
1ef20 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20 20  any databases.  
1ef30 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
1ef40 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65   to position the
1ef50 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c   OP_Goto.** earl
1ef60 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62  y in the code, b
1ef70 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66  efore we know if
1ef80 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74 61   any database ta
1ef90 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65  bles will be use
1efa0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1efb0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
1efc0 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
1efd0 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
1efe0 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
1eff0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
1f000 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 0a  level(pParse);..
1f010 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f020 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 69 66  MIT_TRIGGER.  if
1f030 28 20 70 54 6f 70 6c 65 76 65 6c 21 3d 70 50 61  ( pToplevel!=pPa
1f040 72 73 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  rse ){.    /* Th
1f050 69 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b  is branch is tak
1f060 65 6e 20 69 66 20 61 20 74 72 69 67 67 65 72 20  en if a trigger 
1f070 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  is currently bei
1f080 6e 67 20 63 6f 64 65 64 2e 20 49 6e 20 74 68 69  ng coded. In thi
1f090 73 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 73  s.    ** case, s
1f0a0 65 74 20 63 6f 6f 6b 69 65 47 6f 74 6f 20 74 6f  et cookieGoto to
1f0b0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
1f0c0 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20 74  e to show that t
1f0d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  his function.   
1f0e0 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 61 6c   ** has been cal
1f0f0 6c 65 64 2e 20 54 68 69 73 20 69 73 20 75 73 65  led. This is use
1f100 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
1f110 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61 6e 74  ExprCodeConstant
1f120 73 28 29 0a 20 20 20 20 2a 2a 20 66 75 6e 63 74  s().    ** funct
1f130 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 70 50 61 72  ion. */.    pPar
1f140 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d  se->cookieGoto =
1f150 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   -1;.  }.#endif.
1f160 20 20 69 66 28 20 70 54 6f 70 6c 65 76 65 6c 2d    if( pToplevel-
1f170 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29  >cookieGoto==0 )
1f180 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  {.    Vdbe *v = 
1f190 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1f1a0 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 69  Toplevel);.    i
1f1b0 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
1f1c0 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20  ;  /* This only 
1f1d0 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 72 65  happens if there
1f1e0 20 77 61 73 20 61 20 70 72 69 6f 72 20 65 72 72   was a prior err
1f1f0 6f 72 20 2a 2f 0a 20 20 20 20 70 54 6f 70 6c 65  or */.    pTople
1f200 76 65 6c 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20  vel->cookieGoto 
1f210 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
1f220 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  Op2(v, OP_Goto, 
1f230 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69  0, 0)+1;.  }.  i
1f240 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20  f( iDb>=0 ){.   
1f250 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1f260 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b 0a 20 20  Toplevel->db;.  
1f270 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b 3b 0a    yDbMask mask;.
1f280 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62  .    assert( iDb
1f290 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  <db->nDb );.    
1f2a0 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
1f2b0 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69  iDb].pBt!=0 || i
1f2c0 44 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  Db==1 );.    ass
1f2d0 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f  ert( iDb<SQLITE_
1f2e0 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29  MAX_ATTACHED+2 )
1f2f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
1f300 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
1f310 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
1f320 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28   );.    mask = (
1f330 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 44 62  (yDbMask)1)<<iDb
1f340 3b 0a 20 20 20 20 69 66 28 20 28 70 54 6f 70 6c  ;.    if( (pTopl
1f350 65 76 65 6c 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  evel->cookieMask
1f360 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
1f370 20 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e       pToplevel->
1f380 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20 6d 61  cookieMask |= ma
1f390 73 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 6c 65  sk;.      pTople
1f3a0 76 65 6c 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  vel->cookieValue
1f3b0 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b  [iDb] = db->aDb[
1f3c0 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63  iDb].pSchema->sc
1f3d0 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20  hema_cookie;.   
1f3e0 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
1f3f0 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b  PDB && iDb==1 ){
1f400 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f410 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65  OpenTempDatabase
1f420 28 70 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20  (pToplevel);.   
1f430 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
1f440 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ../*.** If argum
1f450 65 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c  ent zDb is NULL,
1f460 20 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74   then call sqlit
1f470 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
1f480 6d 61 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a  ma() for each .*
1f490 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
1f4a0 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ase. Otherwise, 
1f4b0 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68  invoke it for th
1f4c0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  e database named
1f4d0 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f   zDb only..*/.vo
1f4e0 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  id sqlite3CodeVe
1f4f0 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
1f500 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
1f510 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
1f520 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1f530 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1f540 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1f550 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
1f560 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  {.    Db *pDb = 
1f570 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
1f580 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26   if( pDb->pBt &&
1f590 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c   (!zDb || 0==sql
1f5a0 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
1f5b0 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 29 20 29 7b   pDb->zName)) ){
1f5c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
1f5d0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
1f5e0 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d  Parse, i);.    }
1f5f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1f600 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
1f610 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66   that prepares f
1f620 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72  or doing an oper
1f630 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69  ation that.** mi
1f640 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64  ght change the d
1f650 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
1f660 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
1f670 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  ts a new transac
1f680 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e  tion if we are n
1f690 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  ot already withi
1f6a0 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  n.** a transacti
1f6b0 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  on.  If we are a
1f6c0 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20  lready within a 
1f6d0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
1f6e0 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  n a checkpoint.*
1f6f0 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20  * is set if the 
1f700 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72  setStatement par
1f710 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20  ameter is true. 
1f720 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68   A checkpoint sh
1f730 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66  ould.** be set f
1f740 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68  or operations th
1f750 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64  at might fail (d
1f760 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69  ue to a constrai
1f770 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  nt) part of.** t
1f780 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61  he way through a
1f790 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65  nd which will ne
1f7a0 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20  ed to undo some 
1f7b0 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68  writes without h
1f7c0 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  aving to.** roll
1f7d0 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74  back the whole t
1f7e0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72  ransaction.  For
1f7f0 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72   operations wher
1f800 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
1f810 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63  s.** can be chec
1f820 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63  ked before any c
1f830 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
1f840 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
1f850 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20   it is never.** 
1f860 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
1f870 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68  o a write and th
1f880 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  e checkpoint sho
1f890 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a  uld not be set..
1f8a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1f8b0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1f8c0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
1f8d0 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65  , int setStateme
1f8e0 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  nt, int iDb){.  
1f8f0 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
1f900 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
1f910 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
1f920 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
1f930 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
1f940 65 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 6c  e, iDb);.  pTopl
1f950 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 73 6b 20  evel->writeMask 
1f960 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c  |= ((yDbMask)1)<
1f970 3c 69 44 62 3b 0a 20 20 70 54 6f 70 6c 65 76 65  <iDb;.  pTopleve
1f980 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  l->isMultiWrite 
1f990 7c 3d 20 73 65 74 53 74 61 74 65 6d 65 6e 74 3b  |= setStatement;
1f9a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61  .}../*.** Indica
1f9b0 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61 74  te that the stat
1f9c0 65 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20  ement currently 
1f9d0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
1f9e0 6f 6e 20 6d 69 67 68 74 20 77 72 69 74 65 0a 2a  on might write.*
1f9f0 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * more than one 
1fa00 65 6e 74 72 79 20 28 65 78 61 6d 70 6c 65 3a 20  entry (example: 
1fa10 64 65 6c 65 74 69 6e 67 20 6f 6e 65 20 72 6f 77  deleting one row
1fa20 20 74 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   then inserting 
1fa30 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 69 6e 73 65  another,.** inse
1fa40 72 74 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 72  rting multiple r
1fa50 6f 77 73 20 69 6e 20 61 20 74 61 62 6c 65 2c 20  ows in a table, 
1fa60 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72  or inserting a r
1fa70 6f 77 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74  ow and index ent
1fa80 72 69 65 73 2e 29 0a 2a 2a 20 49 66 20 61 6e 20  ries.).** If an 
1fa90 61 62 6f 72 74 20 6f 63 63 75 72 73 20 61 66 74  abort occurs aft
1faa0 65 72 20 73 6f 6d 65 20 6f 66 20 74 68 65 73 65  er some of these
1fab0 20 77 72 69 74 65 73 20 68 61 76 65 20 63 6f 6d   writes have com
1fac0 70 6c 65 74 65 64 2c 20 74 68 65 6e 20 69 74 20  pleted, then it 
1fad0 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e 65 63 65 73  will.** be neces
1fae0 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 74 68 65  sary to undo the
1faf0 20 63 6f 6d 70 6c 65 74 65 64 20 77 72 69 74 65   completed write
1fb00 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1fb10 65 33 4d 75 6c 74 69 57 72 69 74 65 28 50 61 72  e3MultiWrite(Par
1fb20 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50  se *pParse){.  P
1fb30 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20  arse *pToplevel 
1fb40 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f  = sqlite3ParseTo
1fb50 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a  plevel(pParse);.
1fb60 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d    pToplevel->isM
1fb70 75 6c 74 69 57 72 69 74 65 20 3d 20 31 3b 0a 7d  ultiWrite = 1;.}
1fb80 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 63 6f 64  ../* .** The cod
1fb90 65 20 67 65 6e 65 72 61 74 6f 72 20 63 61 6c 6c  e generator call
1fba0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  s this routine i
1fbb0 66 20 69 73 20 64 69 73 63 6f 76 65 72 73 20 74  f is discovers t
1fbc0 68 61 74 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73  hat it is.** pos
1fbd0 73 69 62 6c 65 20 74 6f 20 61 62 6f 72 74 20 61  sible to abort a
1fbe0 20 73 74 61 74 65 6d 65 6e 74 20 70 72 69 6f 72   statement prior
1fbf0 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20   to completion. 
1fc00 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 0a 2a 2a   In order to .**
1fc10 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 61 62   perform this ab
1fc20 6f 72 74 20 77 69 74 68 6f 75 74 20 63 6f 72 72  ort without corr
1fc30 75 70 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  upting the datab
1fc40 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ase, we need to 
1fc50 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 74 68 61  make.** sure tha
1fc60 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
1fc70 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  is protected by 
1fc80 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
1fc90 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  saction..**.** T
1fca0 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6f  echnically, we o
1fcb0 6e 6c 79 20 6e 65 65 64 20 74 6f 20 73 65 74 20  nly need to set 
1fcc0 74 68 65 20 6d 61 79 41 62 6f 72 74 20 66 6c 61  the mayAbort fla
1fcd0 67 20 69 66 20 74 68 65 0a 2a 2a 20 69 73 4d 75  g if the.** isMu
1fce0 6c 74 69 57 72 69 74 65 20 66 6c 61 67 20 77 61  ltiWrite flag wa
1fcf0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74  s previously set
1fd00 2e 20 20 54 68 65 72 65 20 69 73 20 61 20 74 69  .  There is a ti
1fd10 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
1fd20 20 73 75 63 68 20 74 68 61 74 20 74 68 65 20 61   such that the a
1fd30 62 6f 72 74 20 6d 75 73 74 20 6f 63 63 75 72 20  bort must occur 
1fd40 61 66 74 65 72 20 74 68 65 20 6d 75 6c 74 69 77  after the multiw
1fd50 72 69 74 65 2e 20 20 54 68 69 73 20 6d 61 6b 65  rite.  This make
1fd60 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 61 74 65 6d  s.** some statem
1fd70 65 6e 74 73 20 69 6e 76 6f 6c 76 69 6e 67 20 74  ents involving t
1fd80 68 65 20 52 45 50 4c 41 43 45 20 63 6f 6e 66 6c  he REPLACE confl
1fd90 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
1fda0 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 67 6f 20 61  lgorithm.** go a
1fdb0 20 6c 69 74 74 6c 65 20 66 61 73 74 65 72 2e 20   little faster. 
1fdc0 20 42 75 74 20 74 61 6b 69 6e 67 20 61 64 76 61   But taking adva
1fdd0 6e 74 61 67 65 20 6f 66 20 74 68 69 73 20 74 69  ntage of this ti
1fde0 6d 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 2a 2a  me dependency.**
1fdf0 20 6d 61 6b 65 73 20 69 74 20 6d 6f 72 65 20 64   makes it more d
1fe00 69 66 66 69 63 75 6c 74 20 74 6f 20 70 72 6f 76  ifficult to prov
1fe10 65 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20  e that the code 
1fe20 69 73 20 63 6f 72 72 65 63 74 20 28 69 6e 20 0a  is correct (in .
1fe30 2a 2a 20 70 61 72 74 69 63 75 6c 61 72 2c 20 69  ** particular, i
1fe40 74 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  t prevents us fr
1fe50 6f 6d 20 77 72 69 74 69 6e 67 20 61 6e 20 65 66  om writing an ef
1fe60 66 65 63 74 69 76 65 0a 2a 2a 20 69 6d 70 6c 65  fective.** imple
1fe70 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 73 71 6c  mentation of sql
1fe80 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
1fe90 72 74 28 29 29 20 61 6e 64 20 73 6f 20 77 65 20  rt()) and so we 
1fea0 68 61 76 65 20 63 68 6f 73 65 6e 0a 2a 2a 20 74  have chosen.** t
1feb0 6f 20 74 61 6b 65 20 74 68 65 20 73 61 66 65 20  o take the safe 
1fec0 72 6f 75 74 65 20 61 6e 64 20 73 6b 69 70 20 74  route and skip t
1fed0 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  he optimization.
1fee0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1fef0 4d 61 79 41 62 6f 72 74 28 50 61 72 73 65 20 2a  MayAbort(Parse *
1ff00 70 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65  pParse){.  Parse
1ff10 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
1ff20 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
1ff30 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54  el(pParse);.  pT
1ff40 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 41 62 6f 72  oplevel->mayAbor
1ff50 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 1;.}../*.** 
1ff60 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20  Code an OP_Halt 
1ff70 74 68 61 74 20 63 61 75 73 65 73 20 74 68 65 20  that causes the 
1ff80 76 64 62 65 20 74 6f 20 72 65 74 75 72 6e 20 61  vdbe to return a
1ff90 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
1ffa0 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 2e 20 54 68  INT.** error. Th
1ffb0 65 20 6f 6e 45 72 72 6f 72 20 70 61 72 61 6d 65  e onError parame
1ffc0 74 65 72 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ter determines w
1ffd0 68 69 63 68 20 28 69 66 20 61 6e 79 29 20 6f 66  hich (if any) of
1ffe0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
1fff0 2a 20 61 6e 64 2f 6f 72 20 63 75 72 72 65 6e 74  * and/or current
20000 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
20010 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
20020 76 6f 69 64 20 73 71 6c 69 74 65 33 48 61 6c 74  void sqlite3Halt
20030 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61  Constraint(.  Pa
20040 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
20050 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
20060 78 74 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43  xt */.  int errC
20070 6f 64 65 2c 20 20 20 20 20 20 2f 2a 20 65 78 74  ode,      /* ext
20080 65 6e 64 65 64 20 65 72 72 6f 72 20 63 6f 64 65  ended error code
20090 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
200a0 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74  r,      /* Const
200b0 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20  raint type */.  
200c0 63 68 61 72 20 2a 70 34 2c 20 20 20 20 20 20 20  char *p4,       
200d0 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61    /* Error messa
200e0 67 65 20 2a 2f 0a 20 20 69 38 20 70 34 74 79 70  ge */.  i8 p4typ
200f0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 34 5f  e,        /* P4_
20100 53 54 41 54 49 43 20 6f 72 20 50 34 5f 54 52 41  STATIC or P4_TRA
20110 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 75 38 20 70  NSIENT */.  u8 p
20120 35 45 72 72 6d 73 67 20 20 20 20 20 20 20 2f 2a  5Errmsg       /*
20130 20 50 35 5f 45 72 72 4d 73 67 20 74 79 70 65 20   P5_ErrMsg type 
20140 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  */.){.  Vdbe *v 
20150 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
20160 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
20170 72 74 28 20 28 65 72 72 43 6f 64 65 26 30 78 66  rt( (errCode&0xf
20180 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
20190 52 41 49 4e 54 20 29 3b 0a 20 20 69 66 28 20 6f  RAINT );.  if( o
201a0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 6f 72 74  nError==OE_Abort
201b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d   ){.    sqlite3M
201c0 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b  ayAbort(pParse);
201d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
201e0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48  beAddOp4(v, OP_H
201f0 61 6c 74 2c 20 65 72 72 43 6f 64 65 2c 20 6f 6e  alt, errCode, on
20200 45 72 72 6f 72 2c 20 30 2c 20 70 34 2c 20 70 34  Error, 0, p4, p4
20210 74 79 70 65 29 3b 0a 20 20 69 66 28 20 70 35 45  type);.  if( p5E
20220 72 72 6d 73 67 20 29 20 73 71 6c 69 74 65 33 56  rrmsg ) sqlite3V
20230 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
20240 35 45 72 72 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a  5Errmsg);.}../*.
20250 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61  ** Code an OP_Ha
20260 6c 74 20 64 75 65 20 74 6f 20 55 4e 49 51 55 45  lt due to UNIQUE
20270 20 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20   or PRIMARY KEY 
20280 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
20290 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
202a0 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74  lite3UniqueConst
202b0 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
202c0 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
202d0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
202e0 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20  .  int onError, 
202f0 20 20 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69       /* Constrai
20300 6e 74 20 74 79 70 65 20 2a 2f 0a 20 20 49 6e 64  nt type */.  Ind
20310 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 2f  ex *pIdx       /
20320 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61 74  * The index that
20330 20 74 72 69 67 67 65 72 73 20 74 68 65 20 63 6f   triggers the co
20340 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20  nstraint */.){. 
20350 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 69   char *zErr;.  i
20360 6e 74 20 6a 3b 0a 20 20 53 74 72 41 63 63 75 6d  nt j;.  StrAccum
20370 20 65 72 72 4d 73 67 3b 0a 20 20 54 61 62 6c 65   errMsg;.  Table
20380 20 2a 70 54 61 62 20 3d 20 70 49 64 78 2d 3e 70   *pTab = pIdx->p
20390 54 61 62 6c 65 3b 0a 0a 20 20 73 71 6c 69 74 65  Table;..  sqlite
203a0 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 65  3StrAccumInit(&e
203b0 72 72 4d 73 67 2c 20 30 2c 20 30 2c 20 32 30 30  rrMsg, 0, 0, 200
203c0 29 3b 0a 20 20 65 72 72 4d 73 67 2e 64 62 20 3d  );.  errMsg.db =
203d0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 66   pParse->db;.  f
203e0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
203f0 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nKeyCol; j++){. 
20400 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20     char *zCol = 
20410 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d  pTab->aCol[pIdx-
20420 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  >aiColumn[j]].zN
20430 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 6a 20 29  ame;.    if( j )
20440 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
20450 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20  Append(&errMsg, 
20460 22 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20 73 71  ", ", 2);.    sq
20470 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
20480 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 70 54 61  end(&errMsg, pTa
20490 62 2d 3e 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20  b->zName, -1);. 
204a0 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
204b0 75 6d 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67  umAppend(&errMsg
204c0 2c 20 22 2e 22 2c 20 31 29 3b 0a 20 20 20 20 73  , ".", 1);.    s
204d0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
204e0 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 7a 43  pend(&errMsg, zC
204f0 6f 6c 2c 20 2d 31 29 3b 0a 20 20 7d 0a 20 20 7a  ol, -1);.  }.  z
20500 45 72 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Err = sqlite3Str
20510 41 63 63 75 6d 46 69 6e 69 73 68 28 26 65 72 72  AccumFinish(&err
20520 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 48  Msg);.  sqlite3H
20530 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
20540 61 72 73 65 2c 20 0a 20 20 20 20 28 70 49 64 78  arse, .    (pIdx
20550 2d 3e 61 75 74 6f 49 6e 64 65 78 3d 3d 32 29 3f  ->autoIndex==2)?
20560 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
20570 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a 53 51 4c  T_PRIMARYKEY:SQL
20580 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55  ITE_CONSTRAINT_U
20590 4e 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72 72  NIQUE,.    onErr
205a0 6f 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e  or, zErr, P4_DYN
205b0 41 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72 61  AMIC, P5_Constra
205c0 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a  intUnique);.}...
205d0 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50  /*.** Code an OP
205e0 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f 6e  _Halt due to non
205f0 2d 75 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a 2a  -unique rowid..*
20600 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
20610 77 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  widConstraint(. 
20620 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
20630 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
20640 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
20650 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
20660 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74  Conflict resolut
20670 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f  ion algorithm */
20680 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 20  .  Table *pTab  
20690 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
206a0 65 20 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d 75  e with the non-u
206b0 6e 69 71 75 65 20 72 6f 77 69 64 20 2a 2f 20 0a  nique rowid */ .
206c0 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b  ){.  char *zMsg;
206d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
206e0 20 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20   pTab->iPKey>=0 
206f0 29 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  ){.    zMsg = sq
20700 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61  lite3MPrintf(pPa
20710 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73 22  rse->db, "%s.%s"
20720 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20  , pTab->zName,. 
20730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20740 20 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61           pTab->a
20750 43 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d  Col[pTab->iPKey]
20760 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20  .zName);.    rc 
20770 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
20780 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a  INT_PRIMARYKEY;.
20790 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 73    }else{.    zMs
207a0 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
207b0 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22  tf(pParse->db, "
207c0 25 73 2e 72 6f 77 69 64 22 2c 20 70 54 61 62 2d  %s.rowid", pTab-
207d0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20  >zName);.    rc 
207e0 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
207f0 49 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a 20  INT_ROWID;.  }. 
20800 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73   sqlite3HaltCons
20810 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 72  traint(pParse, r
20820 63 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73 67  c, onError, zMsg
20830 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20 20  , P4_DYNAMIC,.  
20840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20850 20 20 20 20 20 20 50 35 5f 43 6f 6e 73 74 72 61        P5_Constra
20860 69 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f  intUnique);.}../
20870 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
20880 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73  e if pIndex uses
20890 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
208a0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
208b0 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
208c0 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61  f it does and fa
208d0 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e  lse if it does n
208e0 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ot..*/.#ifndef S
208f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
20900 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  EX.static int co
20910 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e  llationMatch(con
20920 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20  st char *zColl, 
20930 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a  Index *pIndex){.
20940 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
20950 74 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20  t( zColl!=0 );. 
20960 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64   for(i=0; i<pInd
20970 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  ex->nColumn; i++
20980 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
20990 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61  r *z = pIndex->a
209a0 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73  zColl[i];.    as
209b0 73 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70 49  sert( z!=0 || pI
209c0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
209d0 5d 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ]<0 );.    if( p
209e0 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Index->aiColumn[
209f0 69 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69  i]>=0 && 0==sqli
20a00 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43  te3StrICmp(z, zC
20a10 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65  oll) ){.      re
20a20 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
20a30 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
20a40 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
20a50 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
20a60 63 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74  ces of pTab that
20a70 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69   use the collati
20a80 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
20a90 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d  l..** If pColl==
20aa0 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65  0 then recompute
20ab0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20   all indices of 
20ac0 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  pTab..*/.#ifndef
20ad0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
20ae0 4e 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64  NDEX.static void
20af0 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61   reindexTable(Pa
20b00 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
20b10 6c 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63  le *pTab, char c
20b20 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20  onst *zColl){.  
20b30 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
20b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
20b50 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
20b60 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
20b70 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54  .  for(pIndex=pT
20b80 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  ab->pIndex; pInd
20b90 65 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65  ex; pIndex=pInde
20ba0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  x->pNext){.    i
20bb0 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63  f( zColl==0 || c
20bc0 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43  ollationMatch(zC
20bd0 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a  oll, pIndex) ){.
20be0 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
20bf0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
20c00 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
20c10 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
20c20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65  .      sqlite3Be
20c30 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f  ginWriteOperatio
20c40 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62  n(pParse, 0, iDb
20c50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
20c60 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
20c70 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b  se, pIndex, -1);
20c80 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
20c90 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d  dif../*.** Recom
20ca0 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
20cb0 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69   of all tables i
20cc0 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
20cd0 77 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64  where the.** ind
20ce0 69 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c  ices use the col
20cf0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
20d00 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c  pColl.  If pColl
20d10 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75  ==0 then recompu
20d20 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65  te.** all indice
20d30 73 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f  s everywhere..*/
20d40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20d50 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61  OMIT_REINDEX.sta
20d60 74 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78  tic void reindex
20d70 44 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20  Databases(Parse 
20d80 2a 70 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f  *pParse, char co
20d90 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44  nst *zColl){.  D
20da0 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
20db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
20dc0 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
20dd0 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
20de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20df0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
20e00 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f   index number */
20e10 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
20e20 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f   pParse->db;   /
20e30 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
20e40 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48  onnection */.  H
20e50 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20  ashElem *k;     
20e60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
20e70 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
20e80 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a  ables in pDb */.
20e90 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20eb0 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
20ec0 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61  database */..  a
20ed0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
20ee0 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78  reeHoldsAllMutex
20ef0 65 73 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65  es(db) );  /* Ne
20f00 65 64 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20  eded for schema 
20f10 61 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28  access */.  for(
20f20 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61  iDb=0, pDb=db->a
20f30 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  Db; iDb<db->nDb;
20f40 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a   iDb++, pDb++){.
20f50 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21      assert( pDb!
20f60 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  =0 );.    for(k=
20f70 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
20f80 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
20f90 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73  blHash);  k; k=s
20fa0 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29  qliteHashNext(k)
20fb0 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
20fc0 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61  (Table*)sqliteHa
20fd0 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20  shData(k);.     
20fe0 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
20ff0 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c  arse, pTab, zCol
21000 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
21010 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
21020 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
21030 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  the REINDEX comm
21040 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  and..**.**      
21050 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20    REINDEX       
21060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21070 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20       -- 1.**    
21080 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f      REINDEX  <co
21090 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20  llation>        
210a0 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20         -- 2.**  
210b0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
210c0 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62  <database>.?<tab
210d0 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a  lename>  -- 3.**
210e0 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
210f0 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69   ?<database>.?<i
21100 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a  ndexname>  -- 4.
21110 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75  **.** Form 1 cau
21120 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ses all indices 
21130 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  in all attached 
21140 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20  databases to be 
21150 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d  rebuilt..** Form
21160 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20   2 rebuilds all 
21170 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64  indices in all d
21180 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73  atabases that us
21190 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63  e the named.** c
211a0 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
211b0 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20  n.  Forms 3 and 
211c0 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61  4 rebuild the na
211d0 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c  med index or all
211e0 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f  .** indices asso
211f0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
21200 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a  named table..*/.
21210 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21220 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64  MIT_REINDEX.void
21230 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28   sqlite3Reindex(
21240 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
21250 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f  oken *pName1, To
21260 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20  ken *pName2){.  
21270 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
21280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
21290 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
212a0 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  e to be reindexe
212b0 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  d, or NULL */.  
212c0 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
212d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
212e0 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ame of a table o
212f0 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e  r index */.  con
21300 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  st char *zDb;   
21310 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
21320 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
21330 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
21340 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
21350 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
21360 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
21370 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
21380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21390 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
213a0 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
213b0 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
213c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
213d0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
213e0 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
213f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
21400 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
21410 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
21420 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f  nnection */.  To
21430 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20  ken *pObjName;  
21440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
21450 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
21460 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65  r index to be re
21470 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a  indexed */..  /*
21480 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
21490 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
214a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
214b0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
214c0 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
214d0 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
214e0 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
214f0 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
21500 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
21510 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
21520 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
21530 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30  .  if( pName1==0
21540 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44   ){.    reindexD
21550 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
21560 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
21570 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56  .  }else if( NEV
21580 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c  ER(pName2==0) ||
21590 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b   pName2->z==0 ){
215a0 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  .    char *zColl
215b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
215c0 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a  ame1->z );.    z
215d0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  Coll = sqlite3Na
215e0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
215f0 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b  se->db, pName1);
21600 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20  .    if( !zColl 
21610 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43  ) return;.    pC
21620 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
21630 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
21640 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b  (db), zColl, 0);
21650 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
21660 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44  {.      reindexD
21670 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
21680 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73   zColl);.      s
21690 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
216a0 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72   zColl);.      r
216b0 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
216c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
216d0 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, zColl);.  }. 
216e0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
216f0 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
21700 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
21710 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  , &pObjName);.  
21720 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
21730 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  rn;.  z = sqlite
21740 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
21750 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  b, pObjName);.  
21760 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
21770 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61  n;.  zDb = db->a
21780 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
21790 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
217a0 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20  indTable(db, z, 
217b0 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  zDb);.  if( pTab
217c0 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54   ){.    reindexT
217d0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
217e0 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
217f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
21800 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
21810 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
21820 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
21830 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69   z, zDb);.  sqli
21840 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
21850 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
21860 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
21870 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
21880 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
21890 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66  ;.    sqlite3Ref
218a0 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
218b0 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
218c0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
218d0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
218e0 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
218f0 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  to identify the 
21900 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69  object to be rei
21910 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64  ndexed");.}.#end
21920 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
21930 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63   a KeyInfo struc
21940 74 75 72 65 20 74 68 61 74 20 69 73 20 61 70 70  ture that is app
21950 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
21960 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a 2a 2a   given Index..**
21970 0a 2a 2a 20 54 68 65 20 4b 65 79 49 6e 66 6f 20  .** The KeyInfo 
21980 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 61 6e  structure for an
21990 20 69 6e 64 65 78 20 69 73 20 63 61 63 68 65 64   index is cached
219a0 20 69 6e 20 74 68 65 20 49 6e 64 65 78 20 6f 62   in the Index ob
219b0 6a 65 63 74 2e 0a 2a 2a 20 53 6f 20 74 68 65 72  ject..** So ther
219c0 65 20 6d 69 67 68 74 20 62 65 20 6d 75 6c 74 69  e might be multi
219d0 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73 20 74  ple references t
219e0 6f 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 70  o the returned p
219f0 6f 69 6e 74 65 72 2e 20 20 54 68 65 0a 2a 2a 20  ointer.  The.** 
21a00 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f  caller should no
21a10 74 20 74 72 79 20 74 6f 20 6d 6f 64 69 66 79 20  t try to modify 
21a20 74 68 65 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  the KeyInfo obje
21a30 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  ct..**.** The ca
21a40 6c 6c 65 72 20 73 68 6f 75 6c 64 20 69 6e 76 6f  ller should invo
21a50 6b 65 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  ke sqlite3KeyInf
21a60 6f 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  oUnref() on the 
21a70 72 65 74 75 72 6e 65 64 20 6f 62 6a 65 63 74 0a  returned object.
21a80 2a 2a 20 77 68 65 6e 20 69 74 20 68 61 73 20 66  ** when it has f
21a90 69 6e 69 73 68 65 64 20 75 73 69 6e 67 20 69 74  inished using it
21aa0 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71  ..*/.KeyInfo *sq
21ab0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e  lite3KeyInfoOfIn
21ac0 64 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73  dex(Parse *pPars
21ad0 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  e, Index *pIdx){
21ae0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
21af0 45 72 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  Err ) return 0;.
21b00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21b10 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
21b20 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 70 4b 65  .  if( pIdx->pKe
21b30 79 49 6e 66 6f 20 26 26 20 70 49 64 78 2d 3e 70  yInfo && pIdx->p
21b40 4b 65 79 49 6e 66 6f 2d 3e 64 62 21 3d 70 50 61  KeyInfo->db!=pPa
21b50 72 73 65 2d 3e 64 62 20 29 7b 0a 20 20 20 20 73  rse->db ){.    s
21b60 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
21b70 65 66 28 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66  ef(pIdx->pKeyInf
21b80 6f 29 3b 0a 20 20 20 20 70 49 64 78 2d 3e 70 4b  o);.    pIdx->pK
21b90 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 7d 0a  eyInfo = 0;.  }.
21ba0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 49 64  #endif.  if( pId
21bb0 78 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29  x->pKeyInfo==0 )
21bc0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
21bd0 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78   int nCol = pIdx
21be0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69  ->nColumn;.    i
21bf0 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e  nt nKey = pIdx->
21c00 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 4b 65 79  nKeyCol;.    Key
21c10 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 20 20  Info *pKey;.    
21c20 69 66 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f  if( pIdx->uniqNo
21c30 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  tNull ){.      p
21c40 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79  Key = sqlite3Key
21c50 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65  InfoAlloc(pParse
21c60 2d 3e 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c  ->db, nKey, nCol
21c70 2d 6e 4b 65 79 29 3b 0a 20 20 20 20 7d 65 6c 73  -nKey);.    }els
21c80 65 7b 0a 20 20 20 20 20 20 70 4b 65 79 20 3d 20  e{.      pKey = 
21c90 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c  sqlite3KeyInfoAl
21ca0 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
21cb0 6e 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  nCol, 0);.    }.
21cc0 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a      if( pKey ){.
21cd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
21ce0 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72  lite3KeyInfoIsWr
21cf0 69 74 65 61 62 6c 65 28 70 4b 65 79 29 20 29 3b  iteable(pKey) );
21d00 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
21d10 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
21d20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c        char *zCol
21d30 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
21d40 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
21d50 20 4e 45 56 45 52 28 7a 43 6f 6c 6c 3d 3d 30 29   NEVER(zColl==0)
21d60 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42 49 4e 41   ) zColl = "BINA
21d70 52 59 22 3b 0a 20 20 20 20 20 20 20 20 70 4b 65  RY";.        pKe
21d80 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71  y->aColl[i] = sq
21d90 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
21da0 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
21db0 29 3b 0a 20 20 20 20 20 20 20 20 70 4b 65 79 2d  );.        pKey-
21dc0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
21dd0 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
21de0 72 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  r[i];.      }.  
21df0 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
21e00 6e 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20  nErr ){.        
21e10 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
21e20 72 65 66 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ref(pKey);.     
21e30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21e40 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pIdx->pKeyInfo =
21e50 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 0a 20   pKey;.      }. 
21e60 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
21e70 6e 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  n sqlite3KeyInfo
21e80 52 65 66 28 70 49 64 78 2d 3e 70 4b 65 79 49 6e  Ref(pIdx->pKeyIn
21e90 66 6f 29 3b 0a 7d 0a                             fo);.}.