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 23 69 66 6e 64 65 66 20 53 51 t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65 _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63 TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 ck {. int iDb;
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
03a0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f The database co
03b0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 ntaining the tab
03c0: 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 le to be locked
03d0: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20 */. int iTab;
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
03f0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 he root page of
0400: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 the table to be
0410: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 locked */. u8 i
0420: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20 sWriteLock;
0430: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77 /* True for w
0440: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 rite lock. Fals
0450: 65 20 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63 e for a read loc
0460: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 k */. const cha
0470: 72 20 2a 7a 4c 6f 63 6b 4e 61 6d 65 3b 20 2f 2a r *zLockName; /*
0480: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 Name of the tab
0490: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 le */.};../*.**
04a0: 52 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 Record the fact
04b0: 74 68 61 74 20 77 65 20 77 61 6e 74 20 74 6f 20 that we want to
04c0: 6c 6f 63 6b 20 61 20 74 61 62 6c 65 20 61 74 20 lock a table at
04d0: 72 75 6e 2d 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a run-time. .**.*
04e0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 62 * The table to b
04f0: 65 20 6c 6f 63 6b 65 64 20 68 61 73 20 72 6f 6f e locked has roo
0500: 74 20 70 61 67 65 20 69 54 61 62 20 61 6e 64 20 t page iTab and
0510: 69 73 20 66 6f 75 6e 64 20 69 6e 20 64 61 74 61 is found in data
0520: 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 20 72 base iDb..** A r
0530: 65 61 64 20 6f 72 20 61 20 77 72 69 74 65 20 6c ead or a write l
0540: 6f 63 6b 20 63 61 6e 20 62 65 20 74 61 6b 65 6e ock can be taken
0550: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 69 73 depending on is
0560: 57 72 69 74 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a Writelock..**.**
0570: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 This routine ju
0580: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 66 st records the f
0590: 61 63 74 20 74 68 61 74 20 74 68 65 20 6c 6f 63 act that the loc
05a0: 6b 20 69 73 20 64 65 73 69 72 65 64 2e 20 20 54 k is desired. T
05b0: 68 65 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 6d 61 he.** code to ma
05c0: 6b 65 20 74 68 65 20 6c 6f 63 6b 20 6f 63 63 75 ke the lock occu
05d0: 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 r is generated b
05e0: 79 20 61 20 6c 61 74 65 72 20 63 61 6c 6c 20 74 y a later call t
05f0: 6f 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f o.** codeTableLo
0600: 63 6b 73 28 29 20 77 68 69 63 68 20 6f 63 63 75 cks() which occu
0610: 72 73 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 rs during sqlite
0620: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 3FinishCoding().
0630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
0640: 54 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 50 61 72 TableLock(. Par
0650: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 se *pParse,
0660: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 /* Parsing conte
0670: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 2c xt */. int iDb,
0680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e /* In
0690: 64 65 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 dex of the datab
06a0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 ase containing t
06b0: 68 65 20 74 61 62 6c 65 20 74 6f 20 6c 6f 63 6b he table to lock
06c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 2c 20 */. int iTab,
06d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 /* Root
06e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 page number of
06f0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 the table to be
0700: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69 locked */. u8 i
0710: 73 57 72 69 74 65 4c 6f 63 6b 2c 20 20 20 20 2f sWriteLock, /
0720: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 77 72 69 * True for a wri
0730: 74 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e te lock */. con
0740: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 st char *zName
0750: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 /* Name of the t
0760: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 able to be locke
0770: 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 d */.){. Parse
0780: 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c *pToplevel = sql
0790: 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 ite3ParseTopleve
07a0: 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 l(pParse);. int
07b0: 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 i;. int nBytes
07c0: 3b 0a 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 ;. TableLock *p
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e ;. assert( iDb>
07e0: 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 69 44 62 =0 );.. if( iDb
07f0: 3d 3d 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 ==1 ) return;.
0800: 69 66 28 20 21 73 71 6c 69 74 65 33 42 74 72 65 if( !sqlite3Btre
0810: 65 53 68 61 72 61 62 6c 65 28 70 50 61 72 73 65 eSharable(pParse
0820: 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 ->db->aDb[iDb].p
0830: 42 74 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 Bt) ) return;.
0840: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70 6c for(i=0; i<pTopl
0850: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b evel->nTableLock
0860: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d 20 ; i++){. p =
0870: 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 &pToplevel->aTab
0880: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69 leLock[i];. i
0890: 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20 26 f( p->iDb==iDb &
08a0: 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62 20 & p->iTab==iTab
08b0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57 72 ){. p->isWr
08c0: 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69 73 iteLock = (p->is
08d0: 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73 57 WriteLock || isW
08e0: 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 riteLock);.
08f0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 return;. }.
0900: 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20 73 }.. nBytes = s
0910: 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b 29 izeof(TableLock)
0920: 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e * (pToplevel->n
0930: 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20 TableLock+1);.
0940: 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c pToplevel->aTabl
0950: 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73 71 eLock =. sq
0960: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 lite3DbReallocOr
0970: 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d 3e Free(pToplevel->
0980: 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 db, pToplevel->a
0990: 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65 TableLock, nByte
09a0: 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c 65 s);. if( pTople
09b0: 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 20 vel->aTableLock
09c0: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f 70 ){. p = &pTop
09d0: 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 level->aTableLoc
09e0: 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54 61 k[pToplevel->nTa
09f0: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20 bleLock++];.
0a00: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 p->iDb = iDb;.
0a10: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 p->iTab = iTab
0a20: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65 ;. p->isWrite
0a30: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f Lock = isWriteLo
0a40: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4c 6f 63 6b ck;. p->zLock
0a50: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 Name = zName;.
0a60: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c }else{. pTopl
0a70: 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b evel->nTableLock
0a80: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 = 0;. sqlite
0a90: 33 4f 6f 6d 46 61 75 6c 74 28 70 54 6f 70 6c 65 3OomFault(pTople
0aa0: 76 65 6c 2d 3e 64 62 29 3b 0a 20 20 7d 0a 7d 0a vel->db);. }.}.
0ab0: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f ./*.** Code an O
0ac0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74 P_TableLock inst
0ad0: 72 75 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 ruction for each
0ae0: 20 74 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79 table locked by
0af0: 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e the.** statemen
0b00: 74 20 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79 t (configured by
0b10: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 calls to sqlite
0b20: 33 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a 3TableLock())..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f /.static void co
0b40: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72 deTableLocks(Par
0b50: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 se *pParse){. i
0b60: 6e 74 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56 nt i;. Vdbe *pV
0b70: 64 62 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d dbe; .. pVdbe =
0b80: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 sqlite3GetVdbe(
0b90: 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 pParse);. asser
0ba0: 74 28 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f t( pVdbe!=0 ); /
0bb0: 2a 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 * sqlite3GetVdbe
0bc0: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44 cannot fail: VD
0bd0: 42 45 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 BE already alloc
0be0: 61 74 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 ated */.. for(i
0bf0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 =0; i<pParse->nT
0c00: 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a ableLock; i++){.
0c10: 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 TableLock *p
0c20: 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62 = &pParse->aTab
0c30: 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69 leLock[i];. i
0c40: 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a nt p1 = p->iDb;.
0c50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 sqlite3VdbeA
0c60: 64 64 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f ddOp4(pVdbe, OP_
0c70: 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70 TableLock, p1, p
0c80: 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69 ->iTab, p->isWri
0c90: 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 teLock,.
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d p-
0cb0: 3e 7a 4c 6f 63 6b 4e 61 6d 65 2c 20 50 34 5f 53 >zLockName, P4_S
0cc0: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 TATIC);. }.}.#e
0cd0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f lse. #define co
0ce0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a deTableLocks(x).
0cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 #endif../*.** Re
0d00: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 turn TRUE if the
0d10: 20 67 69 76 65 6e 20 79 44 62 4d 61 73 6b 20 6f given yDbMask o
0d20: 62 6a 65 63 74 20 69 73 20 65 6d 70 74 79 20 2d bject is empty -
0d30: 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 if it contains
0d40: 6e 6f 0a 2a 2a 20 31 20 62 69 74 73 2e 20 20 54 no.** 1 bits. T
0d50: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 his routine is u
0d60: 73 65 64 20 62 79 20 74 68 65 20 44 62 4d 61 73 sed by the DbMas
0d70: 6b 41 6c 6c 5a 65 72 6f 28 29 20 61 6e 64 20 44 kAllZero() and D
0d80: 62 4d 61 73 6b 4e 6f 74 5a 65 72 6f 28 29 0a 2a bMaskNotZero().*
0d90: 2a 20 6d 61 63 72 6f 73 20 77 68 65 6e 20 53 51 * macros when SQ
0da0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 LITE_MAX_ATTACHE
0db0: 44 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 D is greater tha
0dc0: 6e 20 33 30 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c n 30..*/.#if SQL
0dd0: 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 ITE_MAX_ATTACHED
0de0: 3e 33 30 0a 69 6e 74 20 73 71 6c 69 74 65 33 44 >30.int sqlite3D
0df0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 79 44 62 bMaskAllZero(yDb
0e00: 4d 61 73 6b 20 6d 29 7b 0a 20 20 69 6e 74 20 69 Mask m){. int i
0e10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 ;. for(i=0; i<s
0e20: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 3b 20 izeof(yDbMask);
0e30: 69 2b 2b 29 20 69 66 28 20 6d 5b 69 5d 20 29 20 i++) if( m[i] )
0e40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 return 0;. retu
0e50: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a rn 1;.}.#endif..
0e60: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 /*.** This routi
0e70: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 ne is called aft
0e80: 65 72 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 er a single SQL
0e90: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65 statement has be
0ea0: 65 6e 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 en.** parsed and
0eb0: 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 a VDBE program
0ec0: 74 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20 to execute that
0ed0: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65 statement has be
0ee0: 65 6e 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20 en.** prepared.
0ef0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 This routine pu
0f00: 74 73 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67 ts the finishing
0f10: 20 74 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a touches on the.
0f20: 2a 2a 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 ** VDBE program
0f30: 61 6e 64 20 72 65 73 65 74 73 20 74 68 65 20 70 and resets the p
0f40: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 20 Parse structure
0f50: 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 for the next.**
0f60: 70 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 parse..**.** Not
0f70: 65 20 74 68 61 74 20 69 66 20 61 6e 20 65 72 72 e that if an err
0f80: 6f 72 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20 or occurred, it
0f90: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 might be the cas
0fa0: 65 20 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 e that.** no VDB
0fb0: 45 20 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72 E code was gener
0fc0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 ated..*/.void sq
0fd0: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e lite3FinishCodin
0fe0: 67 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 g(Parse *pParse)
0ff0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b {. sqlite3 *db;
1000: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 . Vdbe *v;.. a
1010: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 ssert( pParse->p
1020: 54 6f 70 6c 65 76 65 6c 3d 3d 30 20 29 3b 0a 20 Toplevel==0 );.
1030: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 db = pParse->db
1040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e ;. if( pParse->
1050: 6e 65 73 74 65 64 20 29 20 72 65 74 75 72 6e 3b nested ) return;
1060: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f . if( db->mallo
1070: 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 cFailed || pPars
1080: 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 69 e->nErr ){. i
1090: 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 f( pParse->rc==S
10a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 72 73 QLITE_OK ) pPars
10b0: 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 e->rc = SQLITE_E
10c0: 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e RROR;. return
10d0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 67 69 ;. }.. /* Begi
10e0: 6e 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20 n by generating
10f0: 73 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e some termination
1100: 20 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64 code at the end
1110: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62 of the. ** vdb
1120: 65 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20 e program. */.
1130: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 v = sqlite3GetV
1140: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 dbe(pParse);. a
1150: 73 73 65 72 74 28 20 21 70 50 61 72 73 65 2d 3e ssert( !pParse->
1160: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 0a 20 20 isMultiWrite .
1170: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 || sqlite3V
1180: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 dbeAssertMayAbor
1190: 74 28 76 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 t(v, pParse->may
11a0: 41 62 6f 72 74 29 29 3b 0a 20 20 69 66 28 20 76 Abort));. if( v
11b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 ){. sqlite3V
11c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f dbeAddOp0(v, OP_
11d0: 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53 51 4c 49 Halt);..#if SQLI
11e0: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 TE_USER_AUTHENTI
11f0: 43 41 54 49 4f 4e 0a 20 20 20 20 69 66 28 20 70 CATION. if( p
1200: 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 Parse->nTableLoc
1210: 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e k>0 && db->init.
1220: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 busy==0 ){.
1230: 20 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 sqlite3UserAuth
1240: 49 6e 69 74 28 64 62 29 3b 0a 20 20 20 20 20 20 Init(db);.
1250: 69 66 28 20 64 62 2d 3e 61 75 74 68 2e 61 75 74 if( db->auth.aut
1260: 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f 55 73 65 hLevel<UAUTH_Use
1270: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c r ){. sql
1280: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 ite3ErrorMsg(pPa
1290: 72 73 65 2c 20 22 75 73 65 72 20 6e 6f 74 20 61 rse, "user not a
12a0: 75 74 68 65 6e 74 69 63 61 74 65 64 22 29 3b 0a uthenticated");.
12b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e pParse->
12c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55 54 48 rc = SQLITE_AUTH
12d0: 5f 55 53 45 52 3b 0a 20 20 20 20 20 20 20 20 72 _USER;. r
12e0: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 eturn;. }.
12f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 }.#endif..
1300: 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d /* The cookie m
1310: 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 ask contains one
1320: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 64 61 bit for each da
1330: 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e tabase file open
1340: 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20 .. ** (Bit 0
1350: 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 is for main, bit
1360: 20 31 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 1 is for temp,
1370: 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 and so forth.)
1380: 42 69 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 Bits are. **
1390: 73 65 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 set for each dat
13a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 75 73 abase that is us
13b0: 65 64 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f ed. Generate co
13c0: 64 65 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20 de to start a.
13d0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e ** transaction
13e0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61 on each used da
13f0: 74 61 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65 tabase and to ve
1400: 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 rify the schema
1410: 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e cookie. ** on
1420: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62 each used datab
1430: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 ase.. */.
1440: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 if( db->mallocFa
1450: 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20 20 26 26 iled==0 . &&
1460: 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65 72 6f 28 (DbMaskNonZero(
1470: 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 pParse->cookieMa
1480: 73 6b 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e 70 sk) || pParse->p
1490: 43 6f 6e 73 74 45 78 70 72 29 0a 20 20 20 20 29 ConstExpr). )
14a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 2c {. int iDb,
14b0: 20 69 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 i;. assert
14c0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 ( sqlite3VdbeGet
14d0: 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63 6f 64 65 Op(v, 0)->opcode
14e0: 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a 20 20 20 ==OP_Init );.
14f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 sqlite3VdbeJu
1500: 6d 70 48 65 72 65 28 76 2c 20 30 29 3b 0a 20 20 mpHere(v, 0);.
1510: 20 20 20 20 66 6f 72 28 69 44 62 3d 30 3b 20 69 for(iDb=0; i
1520: 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b Db<db->nDb; iDb+
1530: 2b 29 7b 0a 20 20 20 20 20 20 20 20 53 63 68 65 +){. Sche
1540: 6d 61 20 2a 70 53 63 68 65 6d 61 3b 0a 20 20 20 ma *pSchema;.
1550: 20 20 20 20 20 69 66 28 20 44 62 4d 61 73 6b 54 if( DbMaskT
1560: 65 73 74 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b est(pParse->cook
1570: 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 20 ieMask, iDb)==0
1580: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 ) continue;.
1590: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 sqlite3VdbeU
15a0: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 sesBtree(v, iDb)
15b0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d ;. pSchem
15c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d a = db->aDb[iDb]
15d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 .pSchema;.
15e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 sqlite3VdbeAdd
15f0: 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20 20 20 Op4Int(v,.
1600: 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 OP_Transacti
1610: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 on,
1620: 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f 64 65 /* Opcode
1630: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 44 */. iD
1640: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 b,
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1660: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 20 20 /* P1 */.
1670: 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74 28 70 DbMaskTest(p
1680: 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b Parse->writeMask
1690: 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a 2f 0a ,iDb), /* P2 */.
16a0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d pSchem
16b0: 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 a->schema_cookie
16c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 , /*
16d0: 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 P3 */.
16e0: 70 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61 pSchema->iGenera
16f0: 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 tion
1700: 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 /* P4 */.
1710: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 );. i
1720: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 f( db->init.busy
1730: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 64 62 ==0 ) sqlite3Vdb
1740: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b eChangeP5(v, 1);
1750: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d . VdbeCom
1760: 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20 20 20 ment((v,.
1770: 20 20 20 20 20 20 20 22 75 73 65 73 53 74 6d 74 "usesStmt
1780: 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70 50 61 Journal=%d", pPa
1790: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20 26 26 rse->mayAbort &&
17a0: 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 pParse->isMulti
17b0: 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20 20 7d Write));. }
17c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
17d0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c OMIT_VIRTUALTABL
17e0: 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b E. for(i=0;
17f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62 i<pParse->nVtab
1800: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 Lock; i++){.
1810: 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d char *vtab =
1820: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 (char *)sqlite3
1830: 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 50 GetVTable(db, pP
1840: 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f 63 6b arse->apVtabLock
1850: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 [i]);. sq
1860: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 lite3VdbeAddOp4(
1870: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c v, OP_VBegin, 0,
1880: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f 0, 0, vtab, P4_
1890: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d 0a 20 VTAB);. }.
18a0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 74 pParse->nVt
18b0: 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64 abLock = 0;.#end
18c0: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63 if.. /* Onc
18d0: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65 e all the cookie
18e0: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69 s have been veri
18f0: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63 fied and transac
1900: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20 tions opened, .
1910: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74 ** obtain t
1920: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c he required tabl
1930: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73 e-locks. This is
1940: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 a no-op unless
1950: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68 the . ** sh
1960: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 ared-cache featu
1970: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 re is enabled..
1980: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f */. co
1990: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61 deTableLocks(pPa
19a0: 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 rse);.. /*
19b0: 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79 20 41 Initialize any A
19c0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64 61 74 UTOINCREMENT dat
19d0: 61 20 73 74 72 75 63 74 75 72 65 73 20 72 65 71 a structures req
19e0: 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a uired.. */.
19f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 sqlite3Aut
1a00: 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69 6e 28 oincrementBegin(
1a10: 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 pParse);..
1a20: 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61 6e 74 /* Code constant
1a30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 expressions tha
1a40: 74 20 77 68 65 72 65 20 66 61 63 74 6f 72 65 64 t where factored
1a50: 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20 6c 6f out of inner lo
1a60: 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 ops */. if(
1a70: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 pParse->pConstE
1a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 45 xpr ){. E
1a90: 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d 20 70 xprList *pEL = p
1aa0: 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 Parse->pConstExp
1ab0: 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 r;. pPars
1ac0: 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 e->okConstFactor
1ad0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f = 0;. fo
1ae0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e 6e 45 r(i=0; i<pEL->nE
1af0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 xpr; i++){.
1b00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 sqlite3Expr
1b10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 4c Code(pParse, pEL
1b20: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45 ->a[i].pExpr, pE
1b30: 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e 73 74 L->a[i].u.iConst
1b40: 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20 20 20 ExprReg);.
1b50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 }. }..
1b60: 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20 6a /* Finally, j
1b70: 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 ump back to the
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 beginning of the
1b90: 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f 64 65 executable code
1ba0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 . */. sqlit
1bb0: 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 31 29 e3VdbeGoto(v, 1)
1bc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 ;. }. }...
1bd0: 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42 45 20 /* Get the VDBE
1be0: 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f program ready fo
1bf0: 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f r execution. */
1c00: 0a 20 20 69 66 28 20 76 20 26 26 20 70 50 61 72 . if( v && pPar
1c10: 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21 se->nErr==0 && !
1c20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 db->mallocFailed
1c30: 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e ){. /* A min
1c40: 69 6d 75 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73 imum of one curs
1c50: 6f 72 20 69 73 20 72 65 71 75 69 72 65 64 20 69 or is required i
1c60: 66 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 f autoincrement
1c70: 69 73 20 75 73 65 64 0a 20 20 20 20 2a 20 20 53 is used. * S
1c80: 65 65 20 74 69 63 6b 65 74 20 5b 61 36 39 36 33 ee ticket [a6963
1c90: 37 39 63 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20 79c1f08866] */.
1ca0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 if( pParse->p
1cb0: 41 69 6e 63 21 3d 30 20 26 26 20 70 50 61 72 73 Ainc!=0 && pPars
1cc0: 65 2d 3e 6e 54 61 62 3d 3d 30 20 29 20 70 50 61 e->nTab==0 ) pPa
1cd0: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 rse->nTab = 1;.
1ce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 sqlite3VdbeMa
1cf0: 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73 keReady(v, pPars
1d00: 65 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e e);. pParse->
1d10: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 rc = SQLITE_DONE
1d20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 ;. }else{. p
1d30: 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 Parse->rc = SQLI
1d40: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 7d 0a TE_ERROR;. }.}.
1d50: 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 ./*.** Run the p
1d60: 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65 20 67 arser and code g
1d70: 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72 73 69 enerator recursi
1d80: 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f vely in order to
1d90: 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 generate.** cod
1da0: 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20 73 74 e for the SQL st
1db0: 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e atement given on
1dc0: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 to the end of th
1dd0: 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65 78 74 e pParse context
1de0: 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75 6e .** currently un
1df0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e der construction
1e00: 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61 72 73 . When the pars
1e10: 65 72 20 69 73 20 72 75 6e 20 72 65 63 75 72 73 er is run recurs
1e20: 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 ively.** this wa
1e30: 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f y, the final OP_
1e40: 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70 70 65 Halt is not appe
1e50: 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72 20 69 nded and other i
1e60: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a nitialization.**
1e70: 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f and finalizatio
1e80: 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d 69 74 n steps are omit
1e90: 74 65 64 20 62 65 63 61 75 73 65 20 74 68 6f 73 ted because thos
1ea0: 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 e are handling b
1eb0: 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f y the.** outermo
1ec0: 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a st parser..**.**
1ed0: 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e 67 20 Not everything
1ee0: 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 is nestable. Th
1ef0: 69 73 20 66 61 63 69 6c 69 74 79 20 69 73 20 64 is facility is d
1f00: 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 esigned to permi
1f10: 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 t.** INSERT, UPD
1f20: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 ATE, and DELETE
1f30: 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61 69 6e operations again
1f40: 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 st SQLITE_MASTER
1f50: 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 . Use.** care i
1f60: 66 20 79 6f 75 20 64 65 63 69 64 65 20 74 6f 20 f you decide to
1f70: 74 72 79 20 74 6f 20 75 73 65 20 74 68 69 73 20 try to use this
1f80: 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 routine for some
1f90: 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 73 2e other purposes.
1fa0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
1fb0: 4e 65 73 74 65 64 50 61 72 73 65 28 50 61 72 73 NestedParse(Pars
1fc0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 e *pParse, const
1fd0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 char *zFormat,
1fe0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 ...){. va_list
1ff0: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c ap;. char *zSql
2000: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 ;. char *zErrMs
2010: 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 g = 0;. sqlite3
2020: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 *db = pParse->d
2030: 62 3b 0a 20 20 63 68 61 72 20 73 61 76 65 42 75 b;. char saveBu
2040: 66 5b 50 41 52 53 45 5f 54 41 49 4c 5f 53 5a 5d f[PARSE_TAIL_SZ]
2050: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d ;.. if( pParse-
2060: 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a >nErr ) return;.
2070: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 assert( pParse
2080: 2d 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20 ->nested<10 );
2090: 2f 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c /* Nesting shoul
20a0: 64 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d d only be of lim
20b0: 69 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 ited depth */.
20c0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f va_start(ap, zFo
20d0: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 rmat);. zSql =
20e0: 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 sqlite3VMPrintf(
20f0: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 db, zFormat, ap)
2100: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a ;. va_end(ap);.
2110: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b if( zSql==0 ){
2120: 0a 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f . return; /
2130: 2a 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 * A malloc must
2140: 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 have failed */.
2150: 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 }. pParse->nes
2160: 74 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 ted++;. memcpy(
2170: 73 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54 saveBuf, PARSE_T
2180: 41 49 4c 28 70 50 61 72 73 65 29 2c 20 50 41 52 AIL(pParse), PAR
2190: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 6d SE_TAIL_SZ);. m
21a0: 65 6d 73 65 74 28 50 41 52 53 45 5f 54 41 49 4c emset(PARSE_TAIL
21b0: 28 70 50 61 72 73 65 29 2c 20 30 2c 20 50 41 52 (pParse), 0, PAR
21c0: 53 45 5f 54 41 49 4c 5f 53 5a 29 3b 0a 20 20 73 SE_TAIL_SZ);. s
21d0: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28 qlite3RunParser(
21e0: 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a pParse, zSql, &z
21f0: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 ErrMsg);. sqlit
2200: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 e3DbFree(db, zEr
2210: 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 rMsg);. sqlite3
2220: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 DbFree(db, zSql)
2230: 3b 0a 20 20 6d 65 6d 63 70 79 28 50 41 52 53 45 ;. memcpy(PARSE
2240: 5f 54 41 49 4c 28 70 50 61 72 73 65 29 2c 20 73 _TAIL(pParse), s
2250: 61 76 65 42 75 66 2c 20 50 41 52 53 45 5f 54 41 aveBuf, PARSE_TA
2260: 49 4c 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65 IL_SZ);. pParse
2270: 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 ->nested--;.}..#
2280: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 if SQLITE_USER_A
2290: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a UTHENTICATION./*
22a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 .** Return TRUE
22b0: 69 66 20 7a 54 61 62 6c 65 20 69 73 20 74 68 65 if zTable is the
22c0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 name of the sys
22d0: 74 65 6d 20 74 61 62 6c 65 20 74 68 61 74 20 73 tem table that s
22e0: 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6c 69 73 tores the.** lis
22f0: 74 20 6f 66 20 75 73 65 72 73 20 61 6e 64 20 74 t of users and t
2300: 68 65 69 72 20 61 63 63 65 73 73 20 63 72 65 64 heir access cred
2310: 65 6e 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 entials..*/.int
2320: 73 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 sqlite3UserAuthT
2330: 61 62 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 able(const char
2340: 2a 7a 54 61 62 6c 65 29 7b 0a 20 20 72 65 74 75 *zTable){. retu
2350: 72 6e 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 rn sqlite3_stric
2360: 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 mp(zTable, "sqli
2370: 74 65 5f 75 73 65 72 22 29 3d 3d 30 3b 0a 7d 0a te_user")==0;.}.
2380: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f #endif../*.** Lo
2390: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f cate the in-memo
23a0: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 ry structure tha
23b0: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61 t describes a pa
23c0: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 rticular databas
23d0: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e e.** table given
23e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 the name of tha
23f0: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 t table and (opt
2400: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d ionally) the nam
2410: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 e of the.** data
2420: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 base containing
2430: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 the table. Retu
2440: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 rn NULL if not f
2450: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a ound..**.** If z
2460: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 Database is 0, a
2470: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65 ll databases are
2480: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 searched for th
2490: 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a e table and the.
24a0: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e ** first matchin
24b0: 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72 g table is retur
24c0: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 ned. (No checki
24d0: 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 ng for duplicate
24e0: 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 table.** names
24f0: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 is done.) The s
2500: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54 earch order is T
2510: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 EMP first, then
2520: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a MAIN, then any.*
2530: 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 * auxiliary data
2540: 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e bases added usin
2550: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d g the ATTACH com
2560: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 mand..**.** See
2570: 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61 also sqlite3Loca
2580: 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 teTable()..*/.Ta
2590: 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 ble *sqlite3Find
25a0: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 Table(sqlite3 *d
25b0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a b, const char *z
25c0: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 Name, const char
25d0: 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20 *zDatabase){.
25e0: 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 Table *p = 0;.
25f0: 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 6c 6c int i;.. /* All
2600: 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71 mutexes are req
2610: 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61 uired for schema
2620: 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 access. Make s
2630: 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d ure we hold them
2640: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a . */. assert( z
2650: 44 61 74 61 62 61 73 65 21 3d 30 20 7c 7c 20 73 Database!=0 || s
2660: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 qlite3BtreeHolds
2670: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 AllMutexes(db) )
2680: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 ;.#if SQLITE_USE
2690: 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e R_AUTHENTICATION
26a0: 0a 20 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 61 . /* Only the a
26b0: 64 6d 69 6e 20 75 73 65 72 20 69 73 20 61 6c 6c dmin user is all
26c0: 6f 77 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68 61 owed to know tha
26d0: 74 20 74 68 65 20 73 71 6c 69 74 65 5f 75 73 65 t the sqlite_use
26e0: 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78 69 r table. ** exi
26f0: 73 74 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d sts */. if( db-
2700: 3e 61 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3c >auth.authLevel<
2710: 55 41 55 54 48 5f 41 64 6d 69 6e 20 26 26 20 73 UAUTH_Admin && s
2720: 71 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61 qlite3UserAuthTa
2730: 62 6c 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29 7b ble(zName)!=0 ){
2740: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 . return 0;.
2750: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 68 69 6c }.#endif. whil
2760: 65 28 31 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d e(1){. for(i=
2770: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 OMIT_TEMPDB; i<d
2780: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 b->nDb; i++){.
2790: 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 int j = (i<2
27a0: 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f ) ? i^1 : i; /
27b0: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 * Search TEMP be
27c0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 fore MAIN */.
27d0: 20 20 20 69 66 28 20 7a 44 61 74 61 62 61 73 65 if( zDatabase
27e0: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 ==0 || sqlite3St
27f0: 72 49 43 6d 70 28 7a 44 61 74 61 62 61 73 65 2c rICmp(zDatabase,
2800: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 44 62 53 db->aDb[j].zDbS
2810: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 Name)==0 ){.
2820: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 assert( sqli
2830: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 te3SchemaMutexHe
2840: 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a ld(db, j, 0) );.
2850: 20 20 20 20 20 20 20 20 70 20 3d 20 73 71 6c 69 p = sqli
2860: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d te3HashFind(&db-
2870: 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d >aDb[j].pSchema-
2880: 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 29 >tblHash, zName)
2890: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 20 ;. if( p
28a0: 29 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 20 20 ) return p;.
28b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a }. }. /*
28c0: 20 4e 6f 74 20 66 6f 75 6e 64 2e 20 20 49 66 20 Not found. If
28d0: 74 68 65 20 6e 61 6d 65 20 77 65 20 77 65 72 65 the name we were
28e0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 77 61 73 looking for was
28f0: 20 74 65 6d 70 2e 73 71 6c 69 74 65 5f 6d 61 73 temp.sqlite_mas
2900: 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 ter. ** then
2910: 63 68 61 6e 67 65 20 74 68 65 20 6e 61 6d 65 20 change the name
2920: 74 6f 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d to sqlite_temp_m
2930: 61 73 74 65 72 20 61 6e 64 20 74 72 79 20 61 67 aster and try ag
2940: 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 ain. */. if(
2950: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a sqlite3StrICmp(z
2960: 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 4d Name, MASTER_NAM
2970: 45 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 E)!=0 ) break;.
2980: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 if( sqlite3_s
2990: 74 72 69 63 6d 70 28 7a 44 61 74 61 62 61 73 65 tricmp(zDatabase
29a0: 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 44 62 , db->aDb[1].zDb
29b0: 53 4e 61 6d 65 29 21 3d 30 20 29 20 62 72 65 61 SName)!=0 ) brea
29c0: 6b 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 k;. zName = T
29d0: 45 4d 50 5f 4d 41 53 54 45 52 5f 4e 41 4d 45 3b EMP_MASTER_NAME;
29e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b . }. return 0;
29f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 .}../*.** Locate
2a00: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 the in-memory s
2a10: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 tructure that de
2a20: 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 scribes a partic
2a30: 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a ular database.**
2a40: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 table given the
2a50: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 name of that ta
2a60: 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 ble and (optiona
2a70: 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 lly) the name of
2a80: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 the.** database
2a90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 containing the
2aa0: 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e table. Return N
2ab0: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 ULL if not found
2ac0: 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61 6e . Also leave an
2ad0: 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 .** error messag
2ae0: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 e in pParse->zEr
2af0: 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 rMsg..**.** The
2b00: 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 difference betwe
2b10: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 en this routine
2b20: 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 54 and sqlite3FindT
2b30: 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20 74 able() is that t
2b40: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6c his.** routine l
2b50: 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d eaves an error m
2b60: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 essage in pParse
2b70: 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65 0a ->zErrMsg where.
2b80: 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 ** sqlite3FindTa
2b90: 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e 0a ble() does not..
2ba0: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 */.Table *sqlite
2bb0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20 20 3LocateTable(.
2bc0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 Parse *pParse,
2bd0: 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65 78 /* contex
2be0: 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72 65 t in which to re
2bf0: 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a 20 port errors */.
2c00: 20 75 33 32 20 66 6c 61 67 73 2c 20 20 20 20 20 u32 flags,
2c10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 4f 43 41 54 /* LOCAT
2c20: 45 5f 56 49 45 57 20 6f 72 20 4c 4f 43 41 54 45 E_VIEW or LOCATE
2c30: 5f 4e 4f 45 52 52 20 2a 2f 0a 20 20 63 6f 6e 73 _NOERR */. cons
2c40: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 t char *zName,
2c50: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 /* Name of th
2c60: 65 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 6c e table we are l
2c70: 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 ooking for */.
2c80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61 const char *zDba
2c90: 73 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f se /* Name o
2ca0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 f the database.
2cb0: 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a Might be NULL *
2cc0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b /.){. Table *p;
2cd0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d . sqlite3 *db =
2ce0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 pParse->db;..
2cf0: 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 /* Read the data
2d00: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 base schema. If
2d10: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c an error occurs,
2d20: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 leave an error
2d30: 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 message. ** and
2d40: 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 code in pParse
2d50: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e and return NULL.
2d60: 20 2a 2f 0a 20 20 69 66 28 20 28 64 62 2d 3e 6d */. if( (db->m
2d70: 44 62 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47 DbFlags & DBFLAG
2d80: 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29 3d _SchemaKnownOk)=
2d90: 3d 30 20 0a 20 20 20 26 26 20 53 51 4c 49 54 45 =0 . && SQLITE
2da0: 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 _OK!=sqlite3Read
2db0: 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 0a 20 Schema(pParse).
2dc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 ){. return 0
2dd0: 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c ;. }.. p = sql
2de0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 ite3FindTable(db
2df0: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 , zName, zDbase)
2e00: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a ;. if( p==0 ){.
2e10: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
2e20: 7a 4d 73 67 20 3d 20 66 6c 61 67 73 20 26 20 4c zMsg = flags & L
2e30: 4f 43 41 54 45 5f 56 49 45 57 20 3f 20 22 6e 6f OCATE_VIEW ? "no
2e40: 20 73 75 63 68 20 76 69 65 77 22 20 3a 20 22 6e such view" : "n
2e50: 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b 0a 23 o such table";.#
2e60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
2e70: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a IT_VIRTUALTABLE.
2e80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 if( sqlite3F
2e90: 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 indDbName(db, zD
2ea0: 62 61 73 65 29 3c 31 20 29 7b 0a 20 20 20 20 20 base)<1 ){.
2eb0: 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 /* If zName is
2ec0: 74 68 65 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 the not the name
2ed0: 20 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20 74 of a table in t
2ee0: 68 65 20 73 63 68 65 6d 61 20 63 72 65 61 74 65 he schema create
2ef0: 64 20 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a d using. **
2f00: 20 43 52 45 41 54 45 2c 20 74 68 65 6e 20 63 68 CREATE, then ch
2f10: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 eck to see if it
2f20: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 is the name of
2f30: 61 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 an virtual table
2f40: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 that. ** c
2f50: 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f an be an eponymo
2f60: 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 us virtual table
2f70: 2e 20 2a 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c . */. Modul
2f80: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c e *pMod = (Modul
2f90: 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 e*)sqlite3HashFi
2fa0: 6e 64 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 2c nd(&db->aModule,
2fb0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 zName);. i
2fc0: 66 28 20 70 4d 6f 64 3d 3d 30 20 26 26 20 73 71 f( pMod==0 && sq
2fd0: 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a lite3_strnicmp(z
2fe0: 4e 61 6d 65 2c 20 22 70 72 61 67 6d 61 5f 22 2c Name, "pragma_",
2ff0: 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7)==0 ){.
3000: 20 20 70 4d 6f 64 20 3d 20 73 71 6c 69 74 65 33 pMod = sqlite3
3010: 50 72 61 67 6d 61 56 74 61 62 52 65 67 69 73 74 PragmaVtabRegist
3020: 65 72 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 er(db, zName);.
3030: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 }. if(
3040: 20 70 4d 6f 64 20 26 26 20 73 71 6c 69 74 65 33 pMod && sqlite3
3050: 56 74 61 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 VtabEponymousTab
3060: 6c 65 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 leInit(pParse, p
3070: 4d 6f 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 Mod) ){.
3080: 72 65 74 75 72 6e 20 70 4d 6f 64 2d 3e 70 45 70 return pMod->pEp
3090: 6f 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 oTab;. }.
30a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 }.#endif. i
30b0: 66 28 20 28 66 6c 61 67 73 20 26 20 4c 4f 43 41 f( (flags & LOCA
30c0: 54 45 5f 4e 4f 45 52 52 29 3d 3d 30 20 29 7b 0a TE_NOERR)==0 ){.
30d0: 20 20 20 20 20 20 69 66 28 20 7a 44 62 61 73 65 if( zDbase
30e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 ){. sqli
30f0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 te3ErrorMsg(pPar
3100: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c se, "%s: %s.%s",
3110: 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a zMsg, zDbase, z
3120: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c Name);. }el
3130: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 se{. sqli
3140: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 te3ErrorMsg(pPar
3150: 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d se, "%s: %s", zM
3160: 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 sg, zName);.
3170: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 72 73 65 }. pParse
3180: 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 ->checkSchema =
3190: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 1;. }. }..
31a0: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a return p;.}../*.
31b0: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 ** Locate the ta
31c0: 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 ble identified b
31d0: 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 y *p..**.** This
31e0: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72 is a wrapper ar
31f0: 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c 6f 63 61 ound sqlite3Loca
3200: 74 65 54 61 62 6c 65 28 29 2e 20 54 68 65 20 64 teTable(). The d
3210: 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 ifference betwee
3220: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c 6f 63 61 n.** sqlite3Loca
3230: 74 65 54 61 62 6c 65 28 29 20 61 6e 64 20 74 68 teTable() and th
3240: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 is function is t
3250: 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f hat this functio
3260: 6e 20 72 65 73 74 72 69 63 74 73 0a 2a 2a 20 74 n restricts.** t
3270: 68 65 20 73 65 61 72 63 68 20 74 6f 20 73 63 68 he search to sch
3280: 65 6d 61 20 28 70 2d 3e 70 53 63 68 65 6d 61 29 ema (p->pSchema)
3290: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 if it is not NU
32a0: 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d 61 20 6d LL. p->pSchema m
32b0: 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d 4e 55 4c ay be.** non-NUL
32c0: 4c 20 69 66 20 69 74 20 69 73 20 70 61 72 74 20 L if it is part
32d0: 6f 66 20 61 20 76 69 65 77 20 6f 72 20 74 72 69 of a view or tri
32e0: 67 67 65 72 20 70 72 6f 67 72 61 6d 20 64 65 66 gger program def
32f0: 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a 2a 2a 20 inition. See.**
3300: 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 sqlite3FixSrcLis
3310: 74 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e t() for details.
3320: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 .*/.Table *sqlit
3330: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 e3LocateTableIte
3340: 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 m(. Parse *pPar
3350: 73 65 2c 20 0a 20 20 75 33 32 20 66 6c 61 67 73 se, . u32 flags
3360: 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 ,. struct SrcLi
3370: 73 74 5f 69 74 65 6d 20 2a 70 0a 29 7b 0a 20 20 st_item *p.){.
3380: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b const char *zDb;
3390: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 . assert( p->pS
33a0: 63 68 65 6d 61 3d 3d 30 20 7c 7c 20 70 2d 3e 7a chema==0 || p->z
33b0: 44 61 74 61 62 61 73 65 3d 3d 30 20 29 3b 0a 20 Database==0 );.
33c0: 20 69 66 28 20 70 2d 3e 70 53 63 68 65 6d 61 20 if( p->pSchema
33d0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 62 20 3d ){. int iDb =
33e0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f sqlite3SchemaTo
33f0: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 Index(pParse->db
3400: 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 , p->pSchema);.
3410: 20 20 20 7a 44 62 20 3d 20 70 50 61 72 73 65 2d zDb = pParse-
3420: 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 >db->aDb[iDb].zD
3430: 62 53 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b bSName;. }else{
3440: 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e 7a 44 . zDb = p->zD
3450: 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20 20 72 atabase;. }. r
3460: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c 6f 63 eturn sqlite3Loc
3470: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c ateTable(pParse,
3480: 20 66 6c 61 67 73 2c 20 70 2d 3e 7a 4e 61 6d 65 flags, p->zName
3490: 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a , zDb);.}../*.**
34a0: 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d Locate the in-m
34b0: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 emory structure
34c0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a that describes .
34d0: 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 ** a particular
34e0: 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 index given the
34f0: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 name of that ind
3500: 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 ex.** and the na
3510: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 me of the databa
3520: 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 se that contains
3530: 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 the index..** R
3540: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f eturn NULL if no
3550: 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 t found..**.** I
3560: 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 f zDatabase is 0
3570: 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 , all databases
3580: 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 are searched for
3590: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e the.** table an
35a0: 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 d the first matc
35b0: 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 hing index is re
35c0: 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 turned. (No che
35d0: 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 cking.** for dup
35e0: 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d licate index nam
35f0: 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 es is done.) Th
3600: 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 e search order i
3610: 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c s.** TEMP first,
3620: 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e then MAIN, then
3630: 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 any auxiliary d
3640: 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a atabases added.*
3650: 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 * using the ATTA
3660: 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 CH command..*/.I
3670: 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e ndex *sqlite3Fin
3680: 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a dIndex(sqlite3 *
3690: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a db, const char *
36a0: 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 zName, const cha
36b0: 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 r *zDb){. Index
36c0: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 *p = 0;. int i
36d0: 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65 78 ;. /* All mutex
36e0: 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20 es are required
36f0: 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73 for schema acces
3700: 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77 65 s. Make sure we
3710: 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a 20 hold them. */.
3720: 20 61 73 73 65 72 74 28 20 7a 44 62 21 3d 30 20 assert( zDb!=0
3730: 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 || sqlite3BtreeH
3740: 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 oldsAllMutexes(d
3750: 62 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d b) );. for(i=OM
3760: 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d IT_TEMPDB; i<db-
3770: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 >nDb; i++){.
3780: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 int j = (i<2) ?
3790: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61 i^1 : i; /* Sea
37a0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20 rch TEMP before
37b0: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65 MAIN */. Sche
37c0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 ma *pSchema = db
37d0: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 ->aDb[j].pSchema
37e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 ;. assert( pS
37f0: 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28 chema );. if(
3800: 20 7a 44 62 20 26 26 20 73 71 6c 69 74 65 33 53 zDb && sqlite3S
3810: 74 72 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e trICmp(zDb, db->
3820: 61 44 62 5b 6a 5d 2e 7a 44 62 53 4e 61 6d 65 29 aDb[j].zDbSName)
3830: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 ) continue;.
3840: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 assert( sqlite3
3850: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 SchemaMutexHeld(
3860: 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 db, j, 0) );.
3870: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 p = sqlite3Hash
3880: 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 Find(&pSchema->i
3890: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a dxHash, zName);.
38a0: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 if( p ) brea
38b0: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 k;. }. return
38c0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c p;.}../*.** Recl
38d0: 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 aim the memory u
38e0: 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a sed by an index.
38f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 */.void sqlite3F
3900: 72 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33 reeIndex(sqlite3
3910: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b *db, Index *p){
3920: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
3930: 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73 OMIT_ANALYZE. s
3940: 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 qlite3DeleteInde
3950: 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b xSamples(db, p);
3960: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 .#endif. sqlite
3970: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 3ExprDelete(db,
3980: 70 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 p->pPartIdxWhere
3990: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 );. sqlite3Expr
39a0: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 ListDelete(db, p
39b0: 2d 3e 61 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73 ->aColExpr);. s
39c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
39d0: 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 p->zColAff);.
39e0: 69 66 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64 if( p->isResized
39f0: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 ) sqlite3DbFree
3a00: 28 64 62 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e (db, (void *)p->
3a10: 61 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20 azColl);.#ifdef
3a20: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 SQLITE_ENABLE_ST
3a30: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73 AT3_OR_STAT4. s
3a40: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 qlite3_free(p->a
3a50: 69 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69 66 iRowEst);.#endif
3a60: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 . sqlite3DbFree
3a70: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a (db, p);.}../*.*
3a80: 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20 * For the index
3a90: 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 called zIdxName
3aa0: 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69 which is found i
3ab0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 n the database i
3ac0: 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 Db,.** unlike th
3ad0: 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 at index from it
3ae0: 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d s Table then rem
3af0: 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72 ove the index fr
3b00: 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 om.** the index
3b10: 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66 hash table and f
3b20: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 ree all memory s
3b30: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 tructures associ
3b40: 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 ated.** with the
3b50: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 index..*/.void
3b60: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 sqlite3UnlinkAnd
3b70: 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69 DeleteIndex(sqli
3b80: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 te3 *db, int iDb
3b90: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 , const char *zI
3ba0: 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 dxName){. Index
3bb0: 20 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68 *pIndex;. Hash
3bc0: 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65 *pHash;.. asse
3bd0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d rt( sqlite3Schem
3be0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 aMutexHeld(db, i
3bf0: 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73 Db, 0) );. pHas
3c00: 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 h = &db->aDb[iDb
3c10: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 ].pSchema->idxHa
3c20: 73 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 sh;. pIndex = s
3c30: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 qlite3HashInsert
3c40: 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 (pHash, zIdxName
3c50: 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 , 0);. if( ALWA
3c60: 59 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 YS(pIndex) ){.
3c70: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54 if( pIndex->pT
3c80: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49 able->pIndex==pI
3c90: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 ndex ){. pI
3ca0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 ndex->pTable->pI
3cb0: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70 ndex = pIndex->p
3cc0: 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b Next;. }else{
3cd0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b . Index *p;
3ce0: 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66 . /* Justif
3cf0: 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59 ication of ALWAY
3d00: 53 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20 S(); The index
3d10: 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c must be on the l
3d20: 69 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 ist of. **
3d30: 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 indices. */.
3d40: 20 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 p = pIndex->pT
3d50: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 able->pIndex;.
3d60: 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 while( ALWAY
3d70: 53 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74 S(p) && p->pNext
3d80: 21 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20 !=pIndex ){ p =
3d90: 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20 p->pNext; }.
3da0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 20 26 if( ALWAYS(p &
3db0: 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 & p->pNext==pInd
3dc0: 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 ex) ){. p
3dd0: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 ->pNext = pIndex
3de0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d ->pNext;. }
3df0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 . }. sqlit
3e00: 65 33 46 72 65 65 49 6e 64 65 78 28 64 62 2c 20 e3FreeIndex(db,
3e10: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 pIndex);. }. d
3e20: 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 b->mDbFlags |= D
3e30: 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e BFLAG_SchemaChan
3e40: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f ge;.}../*.** Loo
3e50: 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 6c 69 k through the li
3e60: 73 74 20 6f 66 20 6f 70 65 6e 20 64 61 74 61 62 st of open datab
3e70: 61 73 65 20 66 69 6c 65 73 20 69 6e 20 64 62 2d ase files in db-
3e80: 3e 61 44 62 5b 5d 20 61 6e 64 20 69 66 0a 2a 2a >aDb[] and if.**
3e90: 20 61 6e 79 20 68 61 76 65 20 62 65 65 6e 20 63 any have been c
3ea0: 6c 6f 73 65 64 2c 20 72 65 6d 6f 76 65 20 74 68 losed, remove th
3eb0: 65 6d 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 em from the list
3ec0: 2e 20 20 52 65 61 6c 6c 6f 63 61 74 65 20 74 68 . Reallocate th
3ed0: 65 0a 2a 2a 20 64 62 2d 3e 61 44 62 5b 5d 20 73 e.** db->aDb[] s
3ee0: 74 72 75 63 74 75 72 65 20 74 6f 20 61 20 73 6d tructure to a sm
3ef0: 61 6c 6c 65 72 20 73 69 7a 65 2c 20 69 66 20 70 aller size, if p
3f00: 6f 73 73 69 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 45 ossible..**.** E
3f10: 6e 74 72 79 20 30 20 28 74 68 65 20 22 6d 61 69 ntry 0 (the "mai
3f20: 6e 22 20 64 61 74 61 62 61 73 65 29 20 61 6e 64 n" database) and
3f30: 20 65 6e 74 72 79 20 31 20 28 74 68 65 20 22 74 entry 1 (the "t
3f40: 65 6d 70 22 20 64 61 74 61 62 61 73 65 29 0a 2a emp" database).*
3f50: 2a 20 61 72 65 20 6e 65 76 65 72 20 63 61 6e 64 * are never cand
3f60: 69 64 61 74 65 73 20 66 6f 72 20 62 65 69 6e 67 idates for being
3f70: 20 63 6f 6c 6c 61 70 73 65 64 2e 0a 2a 2f 0a 76 collapsed..*/.v
3f80: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 oid sqlite3Colla
3f90: 70 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79 pseDatabaseArray
3fa0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 (sqlite3 *db){.
3fb0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 int i, j;. for
3fc0: 28 69 3d 6a 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 (i=j=2; i<db->nD
3fd0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 b; i++){. str
3fe0: 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 uct Db *pDb = &d
3ff0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 b->aDb[i];. i
4000: 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 f( pDb->pBt==0 )
4010: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 {. sqlite3D
4020: 62 46 72 65 65 28 64 62 2c 20 70 44 62 2d 3e 7a bFree(db, pDb->z
4030: 44 62 53 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 DbSName);.
4040: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 20 3d 20 pDb->zDbSName =
4050: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 0;. continu
4060: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 e;. }. if(
4070: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 j<i ){. db
4080: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 ->aDb[j] = db->a
4090: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 Db[i];. }.
40a0: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e j++;. }. db->
40b0: 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 nDb = j;. if( d
40c0: 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d b->nDb<=2 && db-
40d0: 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 >aDb!=db->aDbSta
40e0: 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 tic ){. memcp
40f0: 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c y(db->aDbStatic,
4100: 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 db->aDb, 2*size
4110: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b of(db->aDb[0]));
4120: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 . sqlite3DbFr
4130: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b ee(db, db->aDb);
4140: 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 . db->aDb = d
4150: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 b->aDbStatic;.
4160: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 }.}../*.** Reset
4170: 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 the schema for
4180: 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 the database at
4190: 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f index iDb. Also
41a0: 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45 reset the.** TE
41b0: 4d 50 20 73 63 68 65 6d 61 2e 20 20 54 68 65 20 MP schema. The
41c0: 72 65 73 65 74 20 69 73 20 64 65 66 65 72 72 65 reset is deferre
41d0: 64 20 69 66 20 64 62 2d 3e 6e 53 63 68 65 6d 61 d if db->nSchema
41e0: 4c 6f 63 6b 20 69 73 20 6e 6f 74 20 7a 65 72 6f Lock is not zero
41f0: 2e 0a 2a 2a 20 44 65 66 65 72 72 65 64 20 72 65 ..** Deferred re
4200: 73 65 74 73 20 6d 61 79 20 62 65 20 72 75 6e 20 sets may be run
4210: 62 79 20 63 61 6c 6c 69 6e 67 20 77 69 74 68 20 by calling with
4220: 69 44 62 3c 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 iDb<0..*/.void s
4230: 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65 53 63 qlite3ResetOneSc
4240: 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 hema(sqlite3 *db
4250: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e , int iDb){. in
4260: 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 69 t i;. assert( i
4270: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 Db<db->nDb );..
4280: 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 if( iDb>=0 ){.
4290: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 assert( sqlit
42a0: 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c e3SchemaMutexHel
42b0: 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b d(db, iDb, 0) );
42c0: 0a 20 20 20 20 44 62 53 65 74 50 72 6f 70 65 72 . DbSetProper
42d0: 74 79 28 64 62 2c 20 69 44 62 2c 20 44 42 5f 52 ty(db, iDb, DB_R
42e0: 65 73 65 74 57 61 6e 74 65 64 29 3b 0a 20 20 20 esetWanted);.
42f0: 20 44 62 53 65 74 50 72 6f 70 65 72 74 79 28 64 DbSetProperty(d
4300: 62 2c 20 31 2c 20 44 42 5f 52 65 73 65 74 57 61 b, 1, DB_ResetWa
4310: 6e 74 65 64 29 3b 0a 20 20 20 20 64 62 2d 3e 6d nted);. db->m
4320: 44 62 46 6c 61 67 73 20 26 3d 20 7e 44 42 46 4c DbFlags &= ~DBFL
4330: 41 47 5f 53 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b AG_SchemaKnownOk
4340: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 64 62 2d ;. }.. if( db-
4350: 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 3d 3d 30 20 >nSchemaLock==0
4360: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 ){. for(i=0;
4370: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b i<db->nDb; i++){
4380: 0a 20 20 20 20 20 20 69 66 28 20 44 62 48 61 73 . if( DbHas
4390: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 2c 20 Property(db, i,
43a0: 44 42 5f 52 65 73 65 74 57 61 6e 74 65 64 29 20 DB_ResetWanted)
43b0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 ){. sqlit
43c0: 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 64 62 e3SchemaClear(db
43d0: 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 ->aDb[i].pSchema
43e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d );. }. }
43f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 . }.}../*.** Er
4400: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 ase all schema i
4410: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 nformation from
4420: 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 all attached dat
4430: 61 62 61 73 65 73 20 28 69 6e 63 6c 75 64 69 6e abases (includin
4440: 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61 6e 64 20 g.** "main" and
4450: 22 74 65 6d 70 22 29 20 66 6f 72 20 61 20 73 69 "temp") for a si
4460: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 63 6f ngle database co
4470: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 nnection..*/.voi
4480: 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c d sqlite3ResetAl
4490: 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 lSchemasOfConnec
44a0: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 tion(sqlite3 *db
44b0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 ){. int i;. sq
44c0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 lite3BtreeEnterA
44d0: 6c 6c 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74 ll(db);. assert
44e0: 28 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 ( db->nSchemaLoc
44f0: 6b 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d k==0 );. for(i=
4500: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 0; i<db->nDb; i+
4510: 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 +){. Db *pDb
4520: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 = &db->aDb[i];.
4530: 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 if( pDb->pSch
4540: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c ema ){. sql
4550: 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28 ite3SchemaClear(
4560: 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 pDb->pSchema);.
4570: 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 6d }. }. db->m
4580: 44 62 46 6c 61 67 73 20 26 3d 20 7e 28 44 42 46 DbFlags &= ~(DBF
4590: 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 65 LAG_SchemaChange
45a0: 7c 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 4b 6e |DBFLAG_SchemaKn
45b0: 6f 77 6e 4f 6b 29 3b 0a 20 20 73 71 6c 69 74 65 ownOk);. sqlite
45c0: 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 3VtabUnlockList(
45d0: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 db);. sqlite3Bt
45e0: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b reeLeaveAll(db);
45f0: 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 . sqlite3Collap
4600: 73 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28 seDatabaseArray(
4610: 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 db);.}../*.** Th
4620: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 is routine is ca
4630: 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d lled when a comm
4640: 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f it occurs..*/.vo
4650: 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 id sqlite3Commit
4660: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 InternalChanges(
4670: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 sqlite3 *db){.
4680: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 db->mDbFlags &=
4690: 7e 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 ~DBFLAG_SchemaCh
46a0: 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 ange;.}../*.** D
46b0: 65 6c 65 74 65 20 6d 65 6d 6f 72 79 20 61 6c 6c elete memory all
46c0: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 63 ocated for the c
46d0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 20 61 olumn names of a
46e0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 28 table or view (
46f0: 74 68 65 0a 2a 2a 20 54 61 62 6c 65 2e 61 43 6f the.** Table.aCo
4700: 6c 5b 5d 20 61 72 72 61 79 29 2e 0a 2a 2f 0a 76 l[] array)..*/.v
4710: 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 oid sqlite3Delet
4720: 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 73 71 6c eColumnNames(sql
4730: 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 ite3 *db, Table
4740: 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 *pTable){. int
4750: 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f i;. Column *pCo
4760: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 l;. assert( pTa
4770: 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 ble!=0 );. if(
4780: 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65 2d 3e (pCol = pTable->
4790: 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 aCol)!=0 ){.
47a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 6c for(i=0; i<pTabl
47b0: 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 e->nCol; i++, pC
47c0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c ol++){. sql
47d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 ite3DbFree(db, p
47e0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 Col->zName);.
47f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 sqlite3ExprDe
4800: 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 lete(db, pCol->p
4810: 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c Dflt);. sql
4820: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 ite3DbFree(db, p
4830: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 Col->zColl);.
4840: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 }. sqlite3Db
4850: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d Free(db, pTable-
4860: 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f >aCol);. }.}../
4870: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 *.** Remove the
4880: 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75 memory data stru
4890: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65 ctures associate
48a0: 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e d with the given
48b0: 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 .** Table. No c
48c0: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 hanges are made
48d0: 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20 to disk by this
48e0: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 routine..**.** T
48f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 his routine just
4900: 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74 deletes the dat
4910: 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74 a structure. It
4920: 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b does not unlink
4930: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61 .** the table da
4940: 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f ta structure fro
4950: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 m the hash table
4960: 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 . But it does d
4970: 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 estroy.** memory
4980: 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 structures of t
4990: 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 he indices and f
49a0: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f oreign keys asso
49b0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 ciated with .**
49c0: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a the table..**.**
49d0: 20 54 68 65 20 64 62 20 70 61 72 61 6d 65 74 65 The db paramete
49e0: 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 r is optional.
49f0: 49 74 20 69 73 20 6e 65 65 64 65 64 20 69 66 20 It is needed if
4a00: 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 the Table object
4a10: 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 6c 6f .** contains lo
4a20: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 20 okaside memory.
4a30: 20 28 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 (Table objects
4a40: 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 64 6f in the schema do
4a50: 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c 6f 6f 6b not use.** look
4a60: 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c 20 62 75 aside memory, bu
4a70: 74 20 73 6f 6d 65 20 65 70 68 65 6d 65 72 61 6c t some ephemeral
4a80: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73 20 64 Table objects d
4a90: 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a 2a 20 64 o.) Or the.** d
4aa0: 62 20 70 61 72 61 6d 65 74 65 72 20 63 61 6e 20 b parameter can
4ab0: 62 65 20 75 73 65 64 20 77 69 74 68 20 64 62 2d be used with db-
4ac0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 74 6f >pnBytesFreed to
4ad0: 20 6d 65 61 73 75 72 65 20 74 68 65 20 6d 65 6d measure the mem
4ae0: 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 ory.** used by t
4af0: 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 2e he Table object.
4b00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
4b10: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 SQLITE_NOINLINE
4b20: 64 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 deleteTable(sqli
4b30: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a te3 *db, Table *
4b40: 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 pTable){. Index
4b50: 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 *pIndex, *pNext
4b60: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 ;..#ifdef SQLITE
4b70: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 52 65 63 6f _DEBUG. /* Reco
4b80: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 rd the number of
4b90: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f outstanding loo
4ba0: 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f kaside allocatio
4bb0: 6e 73 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62 ns in schema Tab
4bc0: 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 les. ** prior t
4bd0: 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65 o doing any free
4be0: 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 () operations.
4bf0: 53 69 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62 Since schema Tab
4c00: 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20 les do not use.
4c10: 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 ** lookaside, t
4c20: 68 69 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c his number shoul
4c30: 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f d not change. */
4c40: 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 . int nLookasid
4c50: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 64 62 20 e = 0;. if( db
4c60: 26 26 20 28 70 54 61 62 6c 65 2d 3e 74 61 62 46 && (pTable->tabF
4c70: 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 lags & TF_Epheme
4c80: 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6e ral)==0 ){. n
4c90: 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 73 71 6c 69 Lookaside = sqli
4ca0: 74 65 33 4c 6f 6f 6b 61 73 69 64 65 55 73 65 64 te3LookasideUsed
4cb0: 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e (db, 0);. }.#en
4cc0: 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 dif.. /* Delete
4cd0: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73 all indices ass
4ce0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 ociated with thi
4cf0: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f s table. */. fo
4d00: 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62 6c r(pIndex = pTabl
4d10: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 e->pIndex; pInde
4d20: 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 x; pIndex=pNext)
4d30: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 49 {. pNext = pI
4d40: 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 ndex->pNext;.
4d50: 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d assert( pIndex-
4d60: 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 >pSchema==pTable
4d70: 2d 3e 70 53 63 68 65 6d 61 0a 20 20 20 20 20 20 ->pSchema.
4d80: 20 20 20 7c 7c 20 28 49 73 56 69 72 74 75 61 6c || (IsVirtual
4d90: 28 70 54 61 62 6c 65 29 20 26 26 20 70 49 6e 64 (pTable) && pInd
4da0: 65 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c ex->idxType!=SQL
4db0: 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 ITE_IDXTYPE_APPD
4dc0: 45 46 29 20 29 3b 0a 20 20 20 20 69 66 28 20 28 EF) );. if( (
4dd0: 64 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 70 6e 42 db==0 || db->pnB
4de0: 79 74 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 ytesFreed==0) &&
4df0: 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 !IsVirtual(pTab
4e00: 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 le) ){. cha
4e10: 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64 65 r *zName = pInde
4e20: 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20 20 x->zName; .
4e30: 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64 65 TESTONLY ( Inde
4e40: 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c 69 x *pOld = ) sqli
4e50: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a 20 te3HashInsert(.
4e60: 20 20 20 20 20 20 20 20 26 70 49 6e 64 65 78 2d &pIndex-
4e70: 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 >pSchema->idxHas
4e80: 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20 20 h, zName, 0.
4e90: 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 );. asser
4ea0: 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c 69 t( db==0 || sqli
4eb0: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 te3SchemaMutexHe
4ec0: 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 ld(db, 0, pIndex
4ed0: 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 ->pSchema) );.
4ee0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 assert( pOld
4ef0: 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c 64 ==pIndex || pOld
4f00: 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 ==0 );. }.
4f10: 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 65 sqlite3FreeInde
4f20: 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 x(db, pIndex);.
4f30: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 }.. /* Delete
4f40: 61 6e 79 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 any foreign keys
4f50: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 69 attached to thi
4f60: 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 s table. */. sq
4f70: 6c 69 74 65 33 46 6b 44 65 6c 65 74 65 28 64 62 lite3FkDelete(db
4f80: 2c 20 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a , pTable);.. /*
4f90: 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c Delete the Tabl
4fa0: 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73 65 e structure itse
4fb0: 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 lf.. */. sqlit
4fc0: 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 e3DeleteColumnNa
4fd0: 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b mes(db, pTable);
4fe0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 . sqlite3DbFree
4ff0: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 (db, pTable->zNa
5000: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 me);. sqlite3Db
5010: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d Free(db, pTable-
5020: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c >zColAff);. sql
5030: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 ite3SelectDelete
5040: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 (db, pTable->pSe
5050: 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 lect);. sqlite3
5060: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 ExprListDelete(d
5070: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 b, pTable->pChec
5080: 6b 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 k);.#ifndef SQLI
5090: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 TE_OMIT_VIRTUALT
50a0: 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 56 74 ABLE. sqlite3Vt
50b0: 61 62 43 6c 65 61 72 28 64 62 2c 20 70 54 61 62 abClear(db, pTab
50c0: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 le);.#endif. sq
50d0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
50e0: 70 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 pTable);.. /* V
50f0: 65 72 69 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f erify that no lo
5100: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 okaside memory w
5110: 61 73 20 75 73 65 64 20 62 79 20 73 63 68 65 6d as used by schem
5120: 61 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 a tables */. as
5130: 73 65 72 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 sert( nLookaside
5140: 3d 3d 30 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 ==0 || nLookasid
5150: 65 3d 3d 73 71 6c 69 74 65 33 4c 6f 6f 6b 61 73 e==sqlite3Lookas
5160: 69 64 65 55 73 65 64 28 64 62 2c 30 29 20 29 3b ideUsed(db,0) );
5170: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 .}.void sqlite3D
5180: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 eleteTable(sqlit
5190: 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 e3 *db, Table *p
51a0: 54 61 62 6c 65 29 7b 0a 20 20 2f 2a 20 44 6f 20 Table){. /* Do
51b0: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74 not delete the t
51c0: 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72 able until the r
51d0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 eference count r
51e0: 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a eaches zero. */.
51f0: 20 20 69 66 28 20 21 70 54 61 62 6c 65 20 29 20 if( !pTable )
5200: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 28 return;. if( ((
5210: 21 64 62 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 !db || db->pnByt
5220: 65 73 46 72 65 65 64 3d 3d 30 29 20 26 26 20 28 esFreed==0) && (
5230: 2d 2d 70 54 61 62 6c 65 2d 3e 6e 54 61 62 52 65 --pTable->nTabRe
5240: 66 29 3e 30 29 20 29 20 72 65 74 75 72 6e 3b 0a f)>0) ) return;.
5250: 20 20 64 65 6c 65 74 65 54 61 62 6c 65 28 64 62 deleteTable(db
5260: 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a 0a 2f , pTable);.}.../
5270: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 *.** Unlink the
5280: 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f 6d given table from
5290: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 73 the hash tables
52a0: 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65 20 and the delete
52b0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74 72 the.** table str
52c0: 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c 20 ucture with all
52d0: 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64 20 its indices and
52e0: 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a 2f foreign keys..*/
52f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c .void sqlite3Unl
5300: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62 6c inkAndDeleteTabl
5310: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 e(sqlite3 *db, i
5320: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 nt iDb, const ch
5330: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a 20 ar *zTabName){.
5340: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62 20 Table *p;. Db
5350: 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 *pDb;.. assert(
5360: 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 db!=0 );. asse
5370: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 rt( iDb>=0 && iD
5380: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 b<db->nDb );. a
5390: 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 20 ssert( zTabName
53a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c );. assert( sql
53b0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 ite3SchemaMutexH
53c0: 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 eld(db, iDb, 0)
53d0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 7a );. testcase( z
53e0: 54 61 62 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 3b TabName[0]==0 );
53f0: 20 20 2f 2a 20 5a 65 72 6f 2d 6c 65 6e 67 74 68 /* Zero-length
5400: 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 table names are
5410: 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20 20 70 44 allowed */. pD
5420: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 b = &db->aDb[iDb
5430: 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 ];. p = sqlite3
5440: 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d HashInsert(&pDb-
5450: 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 >pSchema->tblHas
5460: 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 20 30 29 3b h, zTabName, 0);
5470: 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 . sqlite3Delete
5480: 54 61 62 6c 65 28 64 62 2c 20 70 29 3b 0a 20 20 Table(db, p);.
5490: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 db->mDbFlags |=
54a0: 44 42 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 DBFLAG_SchemaCha
54b0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 nge;.}../*.** Gi
54c0: 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 ven a token, ret
54d0: 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 urn a string tha
54e0: 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 t consists of th
54f0: 65 20 74 65 78 74 20 6f 66 20 74 68 61 74 0a 2a e text of that.*
5500: 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 * token. Space
5510: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 to hold the retu
5520: 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 rned string.** i
5530: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 s obtained from
5540: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 sqliteMalloc() a
5550: 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 nd must be freed
5560: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a by the calling.
5570: 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a ** function..**.
5580: 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e ** Any quotation
5590: 20 6d 61 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 marks (ex: "na
55a0: 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 me", 'name', [na
55b0: 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 me], or `name`)
55c0: 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 that.** surround
55d0: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 the body of the
55e0: 20 74 6f 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 token are remov
55f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 ed..**.** Tokens
5600: 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 are often just
5610: 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 pointers into th
5620: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 e original SQL t
5630: 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 ext and so.** ar
5640: 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 e not \000 termi
5650: 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f nated and are no
5660: 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54 t persistent. T
5670: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 he returned stri
5680: 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 ng.** is \000 te
5690: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20 rminated and is
56a0: 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 persistent..*/.c
56b0: 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 har *sqlite3Name
56c0: 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 FromToken(sqlite
56d0: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 3 *db, Token *pN
56e0: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e ame){. char *zN
56f0: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 ame;. if( pName
5700: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 ){. zName =
5710: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 sqlite3DbStrNDup
5720: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d (db, (char*)pNam
5730: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b e->z, pName->n);
5740: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 . sqlite3Dequ
5750: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 ote(zName);. }e
5760: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d lse{. zName =
5770: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 0;. }. return
5780: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a zName;.}../*.**
5790: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65 Open the sqlite
57a0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74 _master table st
57b0: 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65 ored in database
57c0: 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a number iDb for.
57d0: 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20 ** writing. The
57e0: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 table is opened
57f0: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a using cursor 0..
5800: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f */.void sqlite3O
5810: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50 penMasterTable(P
5820: 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 arse *p, int iDb
5830: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 ){. Vdbe *v = s
5840: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29 qlite3GetVdbe(p)
5850: 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 ;. sqlite3Table
5860: 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53 Lock(p, iDb, MAS
5870: 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 4d 41 53 TER_ROOT, 1, MAS
5880: 54 45 52 5f 4e 41 4d 45 29 3b 0a 20 20 73 71 6c TER_NAME);. sql
5890: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e ite3VdbeAddOp4In
58a0: 74 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 t(v, OP_OpenWrit
58b0: 65 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f e, 0, MASTER_ROO
58c0: 54 2c 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 T, iDb, 5);. if
58d0: 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a ( p->nTab==0 ){.
58e0: 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b p->nTab = 1;
58f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 . }.}../*.** Pa
5900: 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f rameter zName po
5910: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 ints to a nul-te
5920: 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20 rminated buffer
5930: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e containing the n
5940: 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 ame.** of a data
5950: 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 base ("main", "t
5960: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 emp" or the name
5970: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 of an attached
5980: 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e db). This.** fun
5990: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 ction returns th
59a0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e e index of the n
59b0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e amed database in
59c0: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a db->aDb[], or.*
59d0: 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 * -1 if the name
59e0: 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 d db cannot be f
59f0: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c ound..*/.int sql
5a00: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 ite3FindDbName(s
5a10: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 qlite3 *db, cons
5a20: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a t char *zName){.
5a30: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 int i = -1;
5a40: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 /* Databas
5a50: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 e number */. if
5a60: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 ( zName ){. D
5a70: 62 20 2a 70 44 62 3b 0a 20 20 20 20 66 6f 72 28 b *pDb;. for(
5a80: 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 i=(db->nDb-1), p
5a90: 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 Db=&db->aDb[i];
5aa0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d i>=0; i--, pDb--
5ab0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d ){. if( 0==
5ac0: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 sqlite3_stricmp(
5ad0: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a pDb->zDbSName, z
5ae0: 4e 61 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 Name) ) break;.
5af0: 20 20 20 20 20 2f 2a 20 22 6d 61 69 6e 22 20 69 /* "main" i
5b00: 73 20 61 6c 77 61 79 73 20 61 6e 20 61 63 63 65 s always an acce
5b10: 70 74 61 62 6c 65 20 61 6c 69 61 73 20 66 6f 72 ptable alias for
5b20: 20 74 68 65 20 70 72 69 6d 61 72 79 20 64 61 74 the primary dat
5b30: 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 65 abase. ** e
5b40: 76 65 6e 20 69 66 20 69 74 20 68 61 73 20 62 65 ven if it has be
5b50: 65 6e 20 72 65 6e 61 6d 65 64 20 75 73 69 6e 67 en renamed using
5b60: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 SQLITE_DBCONFIG
5b70: 5f 4d 41 49 4e 44 42 4e 41 4d 45 2e 20 2a 2f 0a _MAINDBNAME. */.
5b80: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26 if( i==0 &
5b90: 26 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 & 0==sqlite3_str
5ba0: 69 63 6d 70 28 22 6d 61 69 6e 22 2c 20 7a 4e 61 icmp("main", zNa
5bb0: 6d 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 me) ) break;.
5bc0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 }. }. return
5bd0: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 i;.}../*.** The
5be0: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e token *pName con
5bf0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f tains the name o
5c00: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69 f a database (ei
5c10: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a ther "main" or.*
5c20: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20 * "temp" or the
5c30: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63 name of an attac
5c40: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f hed db). This ro
5c50: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 utine returns th
5c60: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 e.** index of th
5c70: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65 e named database
5c80: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f in db->aDb[], o
5c90: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 r -1 if the name
5ca0: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f d db .** does no
5cb0: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 t exist..*/.int
5cc0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71 sqlite3FindDb(sq
5cd0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e lite3 *db, Token
5ce0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 *pName){. int
5cf0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 i;
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5d10: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d /* Database num
5d20: 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a ber */. char *z
5d30: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 Name;
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
5d50: 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 Name we are sea
5d60: 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 rching for */.
5d70: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e zName = sqlite3N
5d80: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c ameFromToken(db,
5d90: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73 pName);. i = s
5da0: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 qlite3FindDbName
5db0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73 (db, zName);. s
5dc0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
5dd0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 zName);. retur
5de0: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74 n i;.}../* The t
5df0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20 able or view or
5e00: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20 trigger name is
5e10: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 passed to this r
5e20: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e outine via token
5e30: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 s.** pName1 and
5e40: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74 pName2. If the t
5e50: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75 able name was fu
5e60: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66 lly qualified, f
5e70: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a or example:.**.*
5e80: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 * CREATE TABLE x
5e90: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a xx.yyy (...);.**
5ea0: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 .** Then pName1
5eb0: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 is set to "xxx"
5ec0: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 and pName2 "yyy
5ed0: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 ". On the other
5ee0: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74 hand if.** the t
5ef0: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 able name is not
5f00: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 fully qualified
5f10: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 , i.e.:.**.** CR
5f20: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e EATE TABLE yyy(.
5f30: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 ..);.**.** Then
5f40: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f pName1 is set to
5f50: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 "yyy" and pName
5f60: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 2 is ""..**.** T
5f70: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 his routine sets
5f80: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70 the *ppUnqual p
5f90: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 ointer to point
5fa0: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e at the token (pN
5fb0: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65 ame1 or.** pName
5fc0: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74 2) that stores t
5fd0: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74 he unqualified t
5fe0: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20 able name. The
5ff0: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 index of the.**
6000: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69 database "xxx" i
6010: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 s returned..*/.i
6020: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 nt sqlite3TwoPar
6030: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a tName(. Parse *
6040: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 pParse, /*
6050: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65 Parsing and code
6060: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 generating cont
6070: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a ext */. Token *
6080: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20 pName1, /*
6090: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65 The "xxx" in the
60a0: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 name "xxx.yyy"
60b0: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f or "xxx" */. To
60c0: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 ken *pName2,
60d0: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69 /* The "yyy" i
60e0: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e n the name "xxx.
60f0: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 yyy" */. Token
6100: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a **pUnqual /*
6110: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61 Write the unqua
6120: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61 lified object na
6130: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 me here */.){.
6140: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 int iDb;
6150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 /* D
6160: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 atabase holding
6170: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 the object */.
6180: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 sqlite3 *db = pP
6190: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 arse->db;.. ass
61a0: 65 72 74 28 20 70 4e 61 6d 65 32 21 3d 30 20 29 ert( pName2!=0 )
61b0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e ;. if( pName2->
61c0: 6e 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 n>0 ){. if( d
61d0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b b->init.busy ) {
61e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 . sqlite3Er
61f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 rorMsg(pParse, "
6200: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 corrupt database
6210: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e ");. return
6220: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a -1;. }. *
6230: 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 pUnqual = pName2
6240: 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 ;. iDb = sqli
6250: 74 65 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e te3FindDb(db, pN
6260: 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 ame1);. if( i
6270: 44 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 Db<0 ){. sq
6280: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 lite3ErrorMsg(pP
6290: 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 arse, "unknown d
62a0: 61 74 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 atabase %T", pNa
62b0: 6d 65 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 me1);. retu
62c0: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d rn -1;. }. }
62d0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 else{. assert
62e0: 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d ( db->init.iDb==
62f0: 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 0 || db->init.bu
6300: 73 79 20 7c 7c 20 49 4e 5f 52 45 4e 41 4d 45 5f sy || IN_RENAME_
6310: 4f 42 4a 45 43 54 0a 20 20 20 20 20 20 20 20 20 OBJECT.
6320: 20 20 20 20 7c 7c 20 28 64 62 2d 3e 6d 44 62 46 || (db->mDbF
6330: 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f 56 61 lags & DBFLAG_Va
6340: 63 75 75 6d 29 21 3d 30 29 3b 0a 20 20 20 20 69 cuum)!=0);. i
6350: 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 Db = db->init.iD
6360: 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 b;. *pUnqual
6370: 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 = pName1;. }.
6380: 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f return iDb;.}../
6390: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e *.** This routin
63a0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 e is used to che
63b0: 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 ck if the UTF-8
63c0: 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 string zName is
63d0: 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 a legal.** unqua
63e0: 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 lified name for
63f0: 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a a new schema obj
6400: 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 ect (table, inde
6410: 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 x, view or.** tr
6420: 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 igger). All name
6430: 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 s are legal exce
6440: 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 pt those that be
6450: 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 gin with the str
6460: 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 ing.** "sqlite_"
6470: 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 (in upper, lowe
6480: 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 r or mixed case)
6490: 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f . This portion o
64a0: 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a f the namespace.
64b0: 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66 ** is reserved f
64c0: 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e or internal use.
64d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 .*/.int sqlite3C
64e0: 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 heckObjectName(P
64f0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f arse *pParse, co
6500: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 nst char *zName)
6510: 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d {. if( !pParse-
6520: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 >db->init.busy &
6530: 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 & pParse->nested
6540: 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 ==0 . &
6550: 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 & (pParse->db->f
6560: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 lags & SQLITE_Wr
6570: 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 iteSchema)==0.
6580: 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 && 0==sq
6590: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e lite3StrNICmp(zN
65a0: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 ame, "sqlite_",
65b0: 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 7) ){. sqlite
65c0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 3ErrorMsg(pParse
65d0: 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 , "object name r
65e0: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 eserved for inte
65f0: 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a rnal use: %s", z
6600: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 Name);. retur
6610: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a n SQLITE_ERROR;.
6620: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c }. return SQL
6630: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a ITE_OK;.}../*.**
6640: 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49 4d Return the PRIM
6650: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f 66 ARY KEY index of
6660: 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64 65 a table.*/.Inde
6670: 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61 72 x *sqlite3Primar
6680: 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65 20 yKeyIndex(Table
6690: 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 *pTab){. Index
66a0: 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61 62 *p;. for(p=pTab
66b0: 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 21 ->pIndex; p && !
66c0: 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 IsPrimaryKeyInde
66d0: 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 x(p); p=p->pNext
66e0: 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a ){}. return p;.
66f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 }../*.** Return
6700: 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e the column of in
6710: 64 65 78 20 70 49 64 78 20 74 68 61 74 20 63 6f dex pIdx that co
6720: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 61 62 rresponds to tab
6730: 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43 6f le.** column iCo
6740: 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 l. Return -1 if
6750: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 not found..*/.i
6760: 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 16 sqlite3Column
6770: 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 OfIndex(Index *p
6780: 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b 0a Idx, i16 iCol){.
6790: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 int i;. for(i
67a0: 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c =0; i<pIdx->nCol
67b0: 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 umn; i++){. i
67c0: 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e 61 f( iCol==pIdx->a
67d0: 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65 74 iColumn[i] ) ret
67e0: 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 urn i;. }. ret
67f0: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a urn -1;.}../*.**
6800: 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 Begin construct
6810: 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 ing a new table
6820: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 representation i
6830: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 n memory. This
6840: 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 is.** the first
6850: 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f of several actio
6860: 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 n routines that
6870: 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 get called in re
6880: 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 sponse.** to a C
6890: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 REATE TABLE stat
68a0: 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 ement. In parti
68b0: 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 cular, this rout
68c0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a ine is called.**
68d0: 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f after seeing to
68e0: 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e kens "CREATE" an
68f0: 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 d "TABLE" and th
6900: 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 e table name. Th
6910: 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 e isTemp.** flag
6920: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 is true if the
6930: 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 table should be
6940: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 stored in the au
6950: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 xiliary database
6960: 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 .** file instead
6970: 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 of in the main
6980: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 database file.
6990: 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 This is normally
69a0: 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 the case.** whe
69b0: 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 n the "TEMP" or
69c0: 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 "TEMPORARY" keyw
69d0: 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 ord occurs in be
69e0: 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 tween.** CREATE
69f0: 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a and TABLE..**.**
6a00: 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 The new table r
6a10: 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c ecord is initial
6a20: 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 ized and put in
6a30: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c pParse->pNewTabl
6a40: 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 e..** As more of
6a50: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c the CREATE TABL
6a60: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 E statement is p
6a70: 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 arsed, additiona
6a80: 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 l action.** rout
6a90: 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c ines will be cal
6aa0: 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 led to add more
6ab0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 information to t
6ac0: 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 his record..** A
6ad0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 t the end of the
6ae0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 CREATE TABLE st
6af0: 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c atement, the sql
6b00: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 ite3EndTable() r
6b10: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c outine.** is cal
6b20: 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 led to complete
6b30: 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e the construction
6b40: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c of the new tabl
6b50: 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 e record..*/.voi
6b60: 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 d sqlite3StartTa
6b70: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 ble(. Parse *pP
6b80: 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 arse, /* Parse
6b90: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 r context */. T
6ba0: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 oken *pName1,
6bb0: 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 /* First part of
6bc0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 the name of the
6bd0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a table or view *
6be0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 /. Token *pName
6bf0: 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 2, /* Second p
6c00: 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 art of the name
6c10: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 of the table or
6c20: 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 view */. int is
6c30: 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 Temp, /* Tr
6c40: 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 ue if this is a
6c50: 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 TEMP table */.
6c60: 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 int isView,
6c70: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 /* True if this
6c80: 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 is a VIEW */.
6c90: 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20 int isVirtual,
6ca0: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 /* True if this
6cb0: 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61 is a VIRTUAL ta
6cc0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 ble */. int noE
6cd0: 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 rr /* Do
6ce0: 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65 nothing if table
6cf0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 already exists
6d00: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 */.){. Table *p
6d10: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a Table;. char *z
6d20: 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 Name = 0; /* The
6d30: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 name of the new
6d40: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 table */. sqli
6d50: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 te3 *db = pParse
6d60: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b ->db;. Vdbe *v;
6d70: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 . int iDb;
6d80: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 /* Database
6d90: 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 number to create
6da0: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f the table in */
6db0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b . Token *pName;
6dc0: 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 /* Unqualifi
6dd0: 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 ed name of the t
6de0: 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a able to create *
6df0: 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 /.. if( db->ini
6e00: 74 2e 62 75 73 79 20 26 26 20 64 62 2d 3e 69 6e t.busy && db->in
6e10: 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20 29 7b it.newTnum==1 ){
6e20: 0a 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 . /* Special
6e30: 63 61 73 65 3a 20 20 50 61 72 73 69 6e 67 20 74 case: Parsing t
6e40: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 he sqlite_master
6e50: 20 6f 72 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f or sqlite_temp_
6e60: 6d 61 73 74 65 72 20 73 63 68 65 6d 61 20 2a 2f master schema */
6e70: 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 . iDb = db->i
6e80: 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 7a 4e 61 nit.iDb;. zNa
6e90: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 me = sqlite3DbSt
6ea0: 72 44 75 70 28 64 62 2c 20 53 43 48 45 4d 41 5f rDup(db, SCHEMA_
6eb0: 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 20 TABLE(iDb));.
6ec0: 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31 3b pName = pName1;
6ed0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a . }else{. /*
6ee0: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 The common case
6ef0: 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73 71 */. iDb = sq
6f00: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 lite3TwoPartName
6f10: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c (pParse, pName1,
6f20: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 pName2, &pName)
6f30: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 ;. if( iDb<0
6f40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 ) return;. if
6f50: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 ( !OMIT_TEMPDB &
6f60: 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61 6d & isTemp && pNam
6f70: 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21 3d e2->n>0 && iDb!=
6f80: 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 1 ){. /* If
6f90: 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70 creating a temp
6fa0: 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65 table, the name
6fb0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c may not be qual
6fc0: 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a 20 ified. Unless .
6fd0: 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 ** the data
6fe0: 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74 65 base name is "te
6ff0: 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f 0a mp" anyway. */.
7000: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 sqlite3Err
7010: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 orMsg(pParse, "t
7020: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e emporary table n
7030: 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 ame must be unqu
7040: 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 20 alified");.
7050: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 return;. }.
7060: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d if( !OMIT_TEM
7070: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 20 PDB && isTemp )
7080: 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a 4e 61 iDb = 1;. zNa
7090: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 me = sqlite3Name
70a0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e FromToken(db, pN
70b0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 49 4e ame);. if( IN
70c0: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 _RENAME_OBJECT )
70d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 {. sqlite3R
70e0: 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 enameTokenMap(pP
70f0: 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 7a 4e 61 arse, (void*)zNa
7100: 6d 65 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 me, pName);.
7110: 7d 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e }. }. pParse->
7120: 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e sNameToken = *pN
7130: 61 6d 65 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 ame;. if( zName
7140: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 ==0 ) return;.
7150: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 if( SQLITE_OK!=s
7160: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 qlite3CheckObjec
7170: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e tName(pParse, zN
7180: 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f ame) ){. goto
7190: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 begin_table_err
71a0: 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 or;. }. if( db
71b0: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20 ->init.iDb==1 )
71c0: 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e isTemp = 1;.#ifn
71d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
71e0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 AUTHORIZATION.
71f0: 61 73 73 65 72 74 28 20 69 73 54 65 6d 70 3d 3d assert( isTemp==
7200: 30 20 7c 7c 20 69 73 54 65 6d 70 3d 3d 31 20 29 0 || isTemp==1 )
7210: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 56 69 ;. assert( isVi
7220: 65 77 3d 3d 30 20 7c 7c 20 69 73 56 69 65 77 3d ew==0 || isView=
7230: 3d 31 20 29 3b 0a 20 20 7b 0a 20 20 20 20 73 74 =1 );. {. st
7240: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61 43 atic const u8 aC
7250: 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 ode[] = {.
7260: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 SQLITE_CREATE_T
7270: 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 4c ABLE,. SQL
7280: 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f ITE_CREATE_TEMP_
7290: 54 41 42 4c 45 2c 0a 20 20 20 20 20 20 20 53 51 TABLE,. SQ
72a0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 LITE_CREATE_VIEW
72b0: 2c 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f ,. SQLITE_
72c0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 CREATE_TEMP_VIEW
72d0: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 68 61 72 . };. char
72e0: 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b *zDb = db->aDb[
72f0: 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 iDb].zDbSName;.
7300: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 if( sqlite3Au
7310: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 thCheck(pParse,
7320: 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 SQLITE_INSERT, S
7330: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 CHEMA_TABLE(isTe
7340: 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a mp), 0, zDb) ){.
7350: 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e goto begin
7360: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 _table_error;.
7370: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56 }. if( !isV
7380: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65 irtual && sqlite
7390: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 3AuthCheck(pPars
73a0: 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b 69 73 e, (int)aCode[is
73b0: 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d 2c 0a Temp+2*isView],.
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
73e0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20 30 2c zName, 0,
73f0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 zDb) ){. g
7400: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f oto begin_table_
7410: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d error;. }. }
7420: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 .#endif.. /* Ma
7430: 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 ke sure the new
7440: 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 table name does
7450: 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 not collide with
7460: 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a an existing. *
7470: 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 * index or table
7480: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d name in the sam
7490: 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 73 73 e database. Iss
74a0: 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 ue an error mess
74b0: 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 age if. ** it d
74c0: 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70 74 69 oes. The excepti
74d0: 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73 74 61 on is if the sta
74e0: 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72 tement being par
74f0: 73 65 64 20 77 61 73 20 70 61 73 73 65 64 0a 20 sed was passed.
7500: 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 ** to an sqlite
7510: 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 3_declare_vtab()
7520: 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 call. In that c
7530: 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c ase only the col
7540: 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 umn names. ** a
7550: 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65 nd types will be
7560: 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20 used, so there
7570: 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 is no need to te
7580: 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 st for namespace
7590: 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 . ** collisions
75a0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e .. */. if( !IN
75b0: 5f 53 50 45 43 49 41 4c 5f 50 41 52 53 45 20 29 _SPECIAL_PARSE )
75c0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 {. char *zDb
75d0: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a = db->aDb[iDb].z
75e0: 44 62 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 DbSName;. if(
75f0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 SQLITE_OK!=sqli
7600: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 te3ReadSchema(pP
7610: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 arse) ){. g
7620: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f oto begin_table_
7630: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 error;. }.
7640: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 pTable = sqlite
7650: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 3FindTable(db, z
7660: 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 Name, zDb);.
7670: 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 if( pTable ){.
7680: 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 if( !noErr )
7690: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 {. sqlite
76a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 3ErrorMsg(pParse
76b0: 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 , "table %T alre
76c0: 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 ady exists", pNa
76d0: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 me);. }else
76e0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 {. assert
76f0: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 ( !db->init.busy
7700: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 || CORRUPT_DB )
7710: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 ;. sqlite
7720: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 3CodeVerifySchem
7730: 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a a(pParse, iDb);.
7740: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f }. go
7750: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 to begin_table_e
7760: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 rror;. }.
7770: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 if( sqlite3FindI
7780: 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 ndex(db, zName,
7790: 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 zDb)!=0 ){.
77a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 sqlite3ErrorMsg
77b0: 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 (pParse, "there
77c0: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e is already an in
77d0: 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a dex named %s", z
77e0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 Name);. got
77f0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 o begin_table_er
7800: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a ror;. }. }..
7810: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 pTable = sqlit
7820: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 e3DbMallocZero(d
7830: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 b, sizeof(Table)
7840: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d );. if( pTable=
7850: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 =0 ){. assert
7860: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c ( db->mallocFail
7870: 65 64 20 29 3b 0a 20 20 20 20 70 50 61 72 73 65 ed );. pParse
7880: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f ->rc = SQLITE_NO
7890: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 70 50 MEM_BKPT;. pP
78a0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 arse->nErr++;.
78b0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 goto begin_tab
78c0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 le_error;. }.
78d0: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 pTable->zName =
78e0: 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d zName;. pTable-
78f0: 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 >iPKey = -1;. p
7900: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d Table->pSchema =
7910: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 db->aDb[iDb].pS
7920: 63 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d chema;. pTable-
7930: 3e 6e 54 61 62 52 65 66 20 3d 20 31 3b 0a 23 69 >nTabRef = 1;.#i
7940: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 fdef SQLITE_DEFA
7950: 55 4c 54 5f 52 4f 57 45 53 54 0a 20 20 70 54 61 ULT_ROWEST. pTa
7960: 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 20 ble->nRowLogEst
7970: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 = sqlite3LogEst(
7980: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 SQLITE_DEFAULT_R
7990: 4f 57 45 53 54 29 3b 0a 23 65 6c 73 65 0a 20 20 OWEST);.#else.
79a0: 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 pTable->nRowLogE
79b0: 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74 st = 200; assert
79c0: 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f ( 200==sqlite3Lo
79d0: 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b gEst(1048576) );
79e0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 .#endif. assert
79f0: 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 ( pParse->pNewTa
7a00: 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61 72 ble==0 );. pPar
7a10: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 se->pNewTable =
7a20: 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 pTable;.. /* If
7a30: 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 67 this is the mag
7a40: 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e ic sqlite_sequen
7a50: 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62 79 ce table used by
7a60: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a autoincrement,.
7a70: 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64 ** then record
7a80: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 a pointer to th
7a90: 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 is table in the
7aa0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 main database st
7ab0: 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20 ructure. ** so
7ac0: 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20 that INSERT can
7ad0: 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65 find the table e
7ae0: 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e asily.. */.#ifn
7af0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
7b00: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 AUTOINCREMENT.
7b10: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73 if( !pParse->nes
7b20: 74 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a 4e ted && strcmp(zN
7b30: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 ame, "sqlite_seq
7b40: 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 uence")==0 ){.
7b50: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 assert( sqlite
7b60: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 3SchemaMutexHeld
7b70: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a (db, iDb, 0) );.
7b80: 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 pTable->pSch
7b90: 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20 70 ema->pSeqTab = p
7ba0: 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 Table;. }.#endi
7bb0: 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 f.. /* Begin ge
7bc0: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 nerating the cod
7bd0: 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 e that will inse
7be0: 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 rt the table rec
7bf0: 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 ord into. ** th
7c00: 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 e SQLITE_MASTER
7c10: 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 table. Note in
7c20: 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 particular that
7c30: 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 we must go ahead
7c40: 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 . ** and alloca
7c50: 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 te the record nu
7c60: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 mber for the tab
7c70: 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 le entry now. B
7c80: 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 efore any. ** P
7c90: 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e RIMARY KEY or UN
7ca0: 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 IQUE keywords ar
7cb0: 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 e parsed. Those
7cc0: 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 keywords will c
7cd0: 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 ause. ** indice
7ce0: 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 s to be created
7cf0: 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 and the table re
7d00: 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 cord must come b
7d10: 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 efore the . **
7d20: 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c indices. Hence,
7d30: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 the record numb
7d40: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 er for the table
7d50: 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 must be allocat
7d60: 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a ed. ** now.. *
7d70: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 /. if( !db->ini
7d80: 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73 t.busy && (v = s
7d90: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 qlite3GetVdbe(pP
7da0: 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 arse))!=0 ){.
7db0: 20 69 6e 74 20 61 64 64 72 31 3b 0a 20 20 20 20 int addr1;.
7dc0: 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a int fileFormat;.
7dd0: 20 20 20 20 69 6e 74 20 72 65 67 31 2c 20 72 65 int reg1, re
7de0: 67 32 2c 20 72 65 67 33 3b 0a 20 20 20 20 2f 2a g2, reg3;. /*
7df0: 20 6e 75 6c 6c 52 6f 77 5b 5d 20 69 73 20 61 6e nullRow[] is an
7e00: 20 4f 50 5f 52 65 63 6f 72 64 20 65 6e 63 6f 64 OP_Record encod
7e10: 69 6e 67 20 6f 66 20 61 20 72 6f 77 20 63 6f 6e ing of a row con
7e20: 74 61 69 6e 69 6e 67 20 35 20 4e 55 4c 4c 73 20 taining 5 NULLs
7e30: 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f */. static co
7e40: 6e 73 74 20 63 68 61 72 20 6e 75 6c 6c 52 6f 77 nst char nullRow
7e50: 5b 5d 20 3d 20 7b 20 36 2c 20 30 2c 20 30 2c 20 [] = { 6, 0, 0,
7e60: 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 73 0, 0, 0 };. s
7e70: 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 qlite3BeginWrite
7e80: 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 Operation(pParse
7e90: 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e , 1, iDb);..#ifn
7ea0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
7eb0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 VIRTUALTABLE.
7ec0: 20 69 66 28 20 69 73 56 69 72 74 75 61 6c 20 29 if( isVirtual )
7ed0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 {. sqlite3V
7ee0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f dbeAddOp0(v, OP_
7ef0: 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 VBegin);. }.#
7f00: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 endif.. /* If
7f10: 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 the file format
7f20: 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e and encoding in
7f30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 the database ha
7f40: 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c ve not been set,
7f50: 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 . ** set the
7f60: 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 m now.. */.
7f70: 20 20 72 65 67 31 20 3d 20 70 50 61 72 73 65 2d reg1 = pParse-
7f80: 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 >regRowid = ++pP
7f90: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 arse->nMem;.
7fa0: 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 reg2 = pParse->r
7fb0: 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 egRoot = ++pPars
7fc0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 e->nMem;. reg
7fd0: 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 3 = ++pParse->nM
7fe0: 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 em;. sqlite3V
7ff0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f dbeAddOp3(v, OP_
8000: 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c ReadCookie, iDb,
8010: 20 72 65 67 33 2c 20 42 54 52 45 45 5f 46 49 4c reg3, BTREE_FIL
8020: 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73 E_FORMAT);. s
8030: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 qlite3VdbeUsesBt
8040: 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 ree(v, iDb);.
8050: 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 addr1 = sqlite3
8060: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 VdbeAddOp1(v, OP
8070: 5f 49 66 2c 20 72 65 67 33 29 3b 20 56 64 62 65 _If, reg3); Vdbe
8080: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 Coverage(v);.
8090: 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 fileFormat = (d
80a0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 b->flags & SQLIT
80b0: 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 29 E_LegacyFileFmt)
80c0: 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 !=0 ?.
80d0: 20 20 20 20 20 20 20 20 31 20 3a 20 53 51 4c 49 1 : SQLI
80e0: 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d TE_MAX_FILE_FORM
80f0: 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 AT;. sqlite3V
8100: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f dbeAddOp3(v, OP_
8110: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 SetCookie, iDb,
8120: 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41 BTREE_FILE_FORMA
8130: 54 2c 20 66 69 6c 65 46 6f 72 6d 61 74 29 3b 0a T, fileFormat);.
8140: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 sqlite3VdbeA
8150: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 ddOp3(v, OP_SetC
8160: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 ookie, iDb, BTRE
8170: 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2c E_TEXT_ENCODING,
8180: 20 45 4e 43 28 64 62 29 29 3b 0a 20 20 20 20 73 ENC(db));. s
8190: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 qlite3VdbeJumpHe
81a0: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 re(v, addr1);..
81b0: 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 /* This just
81c0: 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d creates a place-
81d0: 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e holder record in
81e0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 the sqlite_mast
81f0: 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a er table.. **
8200: 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61 The record crea
8210: 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e ted does not con
8220: 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 tain anything ye
8230: 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72 t. It will be r
8240: 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 eplaced. ** b
8250: 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79 y the real entry
8260: 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74 in code generat
8270: 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64 ed at sqlite3End
8280: 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a Table().. **.
8290: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 ** The rowid
82a0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74 for the new ent
82b0: 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 ry is left in re
82c0: 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 gister pParse->r
82d0: 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 egRowid.. **
82e0: 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 The root page nu
82f0: 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 mber of the new
8300: 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e table is left in
8310: 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67 reg pParse->reg
8320: 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 Root.. ** The
8330: 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 rowid and root
8340: 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 page number valu
8350: 65 73 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 es are needed by
8360: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20 the code that.
8370: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 ** sqlite3End
8380: 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 Table will gener
8390: 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 ate.. */.#if
83a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f !defined(SQLITE_
83b0: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 OMIT_VIEW) || !d
83c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d efined(SQLITE_OM
83d0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 IT_VIRTUALTABLE)
83e0: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20 . if( isView
83f0: 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a || isVirtual ){.
8400: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 sqlite3Vdb
8410: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e eAddOp2(v, OP_In
8420: 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b teger, 0, reg2);
8430: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 . }else.#endi
8440: 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70 50 f. {. pP
8450: 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20 arse->addrCrTab
8460: 3d 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 =. sqlit
8470: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 e3VdbeAddOp3(v,
8480: 4f 50 5f 43 72 65 61 74 65 42 74 72 65 65 2c 20 OP_CreateBtree,
8490: 69 44 62 2c 20 72 65 67 32 2c 20 42 54 52 45 45 iDb, reg2, BTREE
84a0: 5f 49 4e 54 4b 45 59 29 3b 0a 20 20 20 20 7d 0a _INTKEY);. }.
84b0: 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d sqlite3OpenM
84c0: 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 72 73 asterTable(pPars
84d0: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c e, iDb);. sql
84e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 ite3VdbeAddOp2(v
84f0: 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 , OP_NewRowid, 0
8500: 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c , reg1);. sql
8510: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 ite3VdbeAddOp4(v
8520: 2c 20 4f 50 5f 42 6c 6f 62 2c 20 36 2c 20 72 65 , OP_Blob, 6, re
8530: 67 33 2c 20 30 2c 20 6e 75 6c 6c 52 6f 77 2c 20 g3, 0, nullRow,
8540: 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 P4_STATIC);.
8550: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 sqlite3VdbeAddOp
8560: 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 3(v, OP_Insert,
8570: 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 0, reg3, reg1);.
8580: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 sqlite3VdbeC
8590: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 hangeP5(v, OPFLA
85a0: 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 G_APPEND);. s
85b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 qlite3VdbeAddOp0
85c0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 (v, OP_Close);.
85d0: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 }.. /* Normal
85e0: 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 (non-error) retu
85f0: 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b rn. */. return;
8600: 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 .. /* If an err
8610: 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 or occurs, we ju
8620: 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e mp here */.begin
8630: 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 _table_error:.
8640: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 sqlite3DbFree(db
8650: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 , zName);. retu
8660: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 74 20 70 72 rn;.}../* Set pr
8670: 6f 70 65 72 74 69 65 73 20 6f 66 20 61 20 74 61 operties of a ta
8680: 62 6c 65 20 63 6f 6c 75 6d 6e 20 62 61 73 65 64 ble column based
8690: 20 6f 6e 20 74 68 65 20 28 6d 61 67 69 63 61 6c on the (magical
86a0: 29 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 ).** name of the
86b0: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 23 69 66 20 column..*/.#if
86c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 48 49 SQLITE_ENABLE_HI
86d0: 44 44 45 4e 5f 43 4f 4c 55 4d 4e 53 0a 76 6f 69 DDEN_COLUMNS.voi
86e0: 64 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 d sqlite3ColumnP
86f0: 72 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d ropertiesFromNam
8700: 65 28 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 43 e(Table *pTab, C
8710: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 29 7b 0a 20 20 olumn *pCol){.
8720: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e if( sqlite3_strn
8730: 69 63 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 icmp(pCol->zName
8740: 2c 20 22 5f 5f 68 69 64 64 65 6e 5f 5f 22 2c 20 , "__hidden__",
8750: 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 10)==0 ){. pC
8760: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 ol->colFlags |=
8770: 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45 4e 3b 0a COLFLAG_HIDDEN;.
8780: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 61 62 }else if( pTab
8790: 20 26 26 20 70 43 6f 6c 21 3d 70 54 61 62 2d 3e && pCol!=pTab->
87a0: 61 43 6f 6c 20 26 26 20 28 70 43 6f 6c 5b 2d 31 aCol && (pCol[-1
87b0: 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c ].colFlags & COL
87c0: 46 4c 41 47 5f 48 49 44 44 45 4e 29 20 29 7b 0a FLAG_HIDDEN) ){.
87d0: 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 pTab->tabFla
87e0: 67 73 20 7c 3d 20 54 46 5f 4f 4f 4f 48 69 64 64 gs |= TF_OOOHidd
87f0: 65 6e 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 en;. }.}.#endif
8800: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e .../*.** Add a n
8810: 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 ew column to the
8820: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 table currently
8830: 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 being construct
8840: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 ed..**.** The pa
8850: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 rser calls this
8860: 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f 72 routine once for
8870: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65 63 each column dec
8880: 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 laration.** in a
8890: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 CREATE TABLE st
88a0: 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74 65 atement. sqlite
88b0: 33 53 74 61 72 74 54 61 62 6c 65 28 29 20 67 65 3StartTable() ge
88c0: 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 ts called.** fir
88d0: 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67 73 st to get things
88e0: 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74 68 going. Then th
88f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 is routine is ca
8900: 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a lled for each.**
8910: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 column..*/.void
8920: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d sqlite3AddColum
8930: 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c n(Parse *pParse,
8940: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 54 Token *pName, T
8950: 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 oken *pType){.
8960: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 Table *p;. int
8970: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 i;. char *z;.
8980: 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 43 char *zType;. C
8990: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 olumn *pCol;. s
89a0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 qlite3 *db = pPa
89b0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 rse->db;. if( (
89c0: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 p = pParse->pNew
89d0: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 Table)==0 ) retu
89e0: 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f rn;. if( p->nCo
89f0: 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 l+1>db->aLimit[S
8a00: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 QLITE_LIMIT_COLU
8a10: 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 MN] ){. sqlit
8a20: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 e3ErrorMsg(pPars
8a30: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c e, "too many col
8a40: 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e umns on %s", p->
8a50: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 zName);. retu
8a60: 72 6e 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 rn;. }. z = sq
8a70: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 lite3DbMallocRaw
8a80: 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 6e 20 2b 20 (db, pName->n +
8a90: 70 54 79 70 65 2d 3e 6e 20 2b 20 32 29 3b 0a 20 pType->n + 2);.
8aa0: 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 if( z==0 ) retu
8ab0: 72 6e 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e rn;. if( IN_REN
8ac0: 41 4d 45 5f 4f 42 4a 45 43 54 20 29 20 73 71 6c AME_OBJECT ) sql
8ad0: 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d ite3RenameTokenM
8ae0: 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 ap(pParse, (void
8af0: 2a 29 7a 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 6d *)z, pName);. m
8b00: 65 6d 63 70 79 28 7a 2c 20 70 4e 61 6d 65 2d 3e emcpy(z, pName->
8b10: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20 z, pName->n);.
8b20: 7a 5b 70 4e 61 6d 65 2d 3e 6e 5d 20 3d 20 30 3b z[pName->n] = 0;
8b30: 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 . sqlite3Dequot
8b40: 65 28 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b e(z);. for(i=0;
8b50: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 i<p->nCol; i++)
8b60: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 {. if( sqlite
8b70: 33 5f 73 74 72 69 63 6d 70 28 7a 2c 20 70 2d 3e 3_stricmp(z, p->
8b80: 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d aCol[i].zName)==
8b90: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 0 ){. sqlit
8ba0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 e3ErrorMsg(pPars
8bb0: 65 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f e, "duplicate co
8bc0: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 lumn name: %s",
8bd0: 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 z);. sqlite
8be0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 3DbFree(db, z);.
8bf0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 return;.
8c00: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 }. }. if( (p
8c10: 2d 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 ->nCol & 0x7)==0
8c20: 20 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a ){. Column *
8c30: 61 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d aNew;. aNew =
8c40: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f sqlite3DbReallo
8c50: 63 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d c(db,p->aCol,(p-
8c60: 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 >nCol+8)*sizeof(
8c70: 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 p->aCol[0]));.
8c80: 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b if( aNew==0 ){
8c90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 . sqlite3Db
8ca0: 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 Free(db, z);.
8cb0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d return;. }
8cc0: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 . p->aCol = a
8cd0: 4e 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 New;. }. pCol
8ce0: 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 = &p->aCol[p->nC
8cf0: 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 ol];. memset(pC
8d00: 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d ol, 0, sizeof(p-
8d10: 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 >aCol[0]));. pC
8d20: 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 ol->zName = z;.
8d30: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 50 72 sqlite3ColumnPr
8d40: 6f 70 65 72 74 69 65 73 46 72 6f 6d 4e 61 6d 65 opertiesFromName
8d50: 28 70 2c 20 70 43 6f 6c 29 3b 0a 20 0a 20 20 69 (p, pCol);. . i
8d60: 66 28 20 70 54 79 70 65 2d 3e 6e 3d 3d 30 20 29 f( pType->n==0 )
8d70: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 {. /* If ther
8d80: 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65 e is no type spe
8d90: 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 cified, columns
8da0: 68 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 have the default
8db0: 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 2a 2a affinity. **
8dc0: 20 27 42 4c 4f 42 27 20 77 69 74 68 20 61 20 64 'BLOB' with a d
8dd0: 65 66 61 75 6c 74 20 73 69 7a 65 20 6f 66 20 34 efault size of 4
8de0: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 70 bytes. */. p
8df0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 Col->affinity =
8e00: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b SQLITE_AFF_BLOB;
8e10: 0a 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 . pCol->szEst
8e20: 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c = 1;.#ifdef SQL
8e30: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f 52 54 45 ITE_ENABLE_SORTE
8e40: 52 5f 52 45 46 45 52 45 4e 43 45 53 0a 20 20 20 R_REFERENCES.
8e50: 20 69 66 28 20 34 3e 3d 73 71 6c 69 74 65 33 47 if( 4>=sqlite3G
8e60: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 6f lobalConfig.szSo
8e70: 72 74 65 72 52 65 66 20 29 7b 0a 20 20 20 20 20 rterRef ){.
8e80: 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 pCol->colFlags
8e90: 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f 52 54 45 |= COLFLAG_SORTE
8ea0: 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 RREF;. }.#end
8eb0: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 if. }else{.
8ec0: 7a 54 79 70 65 20 3d 20 7a 20 2b 20 73 71 6c 69 zType = z + sqli
8ed0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2b te3Strlen30(z) +
8ee0: 20 31 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 1;. memcpy(z
8ef0: 54 79 70 65 2c 20 70 54 79 70 65 2d 3e 7a 2c 20 Type, pType->z,
8f00: 70 54 79 70 65 2d 3e 6e 29 3b 0a 20 20 20 20 7a pType->n);. z
8f10: 54 79 70 65 5b 70 54 79 70 65 2d 3e 6e 5d 20 3d Type[pType->n] =
8f20: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 0;. sqlite3D
8f30: 65 71 75 6f 74 65 28 7a 54 79 70 65 29 3b 0a 20 equote(zType);.
8f40: 20 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 pCol->affinit
8f50: 79 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e y = sqlite3Affin
8f60: 69 74 79 54 79 70 65 28 7a 54 79 70 65 2c 20 70 ityType(zType, p
8f70: 43 6f 6c 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e Col);. pCol->
8f80: 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 colFlags |= COLF
8f90: 4c 41 47 5f 48 41 53 54 59 50 45 3b 0a 20 20 7d LAG_HASTYPE;. }
8fa0: 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 20 20 . p->nCol++;.
8fb0: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 pParse->constrai
8fc0: 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b 0a 7d 0a ntName.n = 0;.}.
8fd0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 ./*.** This rout
8fe0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 ine is called by
8ff0: 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c the parser whil
9000: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 e in the middle
9010: 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 of.** parsing a
9020: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 CREATE TABLE sta
9030: 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 tement. A "NOT
9040: 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 NULL" constraint
9050: 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 has.** been see
9060: 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 n on a column.
9070: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 This routine set
9080: 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c s the notNull fl
9090: 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c ag on.** the col
90a0: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e umn currently un
90b0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e der construction
90c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
90d0: 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 3AddNotNull(Pars
90e0: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f e *pParse, int o
90f0: 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 nError){. Table
9100: 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 *p;. Column *p
9110: 43 6f 6c 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 Col;. p = pPars
9120: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 e->pNewTable;.
9130: 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 if( p==0 || NEVE
9140: 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 R(p->nCol<1) ) r
9150: 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 eturn;. pCol =
9160: 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c &p->aCol[p->nCol
9170: 2d 31 5d 3b 0a 20 20 70 43 6f 6c 2d 3e 6e 6f 74 -1];. pCol->not
9180: 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45 72 72 Null = (u8)onErr
9190: 6f 72 3b 0a 20 20 70 2d 3e 74 61 62 46 6c 61 67 or;. p->tabFlag
91a0: 73 20 7c 3d 20 54 46 5f 48 61 73 4e 6f 74 4e 75 s |= TF_HasNotNu
91b0: 6c 6c 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 ll;.. /* Set th
91c0: 65 20 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 66 6c e uniqNotNull fl
91d0: 61 67 20 6f 6e 20 61 6e 79 20 55 4e 49 51 55 45 ag on any UNIQUE
91e0: 20 6f 72 20 50 4b 20 69 6e 64 65 78 65 73 20 61 or PK indexes a
91f0: 6c 72 65 61 64 79 20 63 72 65 61 74 65 64 0a 20 lready created.
9200: 20 2a 2a 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 ** on this colu
9210: 6d 6e 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 mn. */. if( pC
9220: 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 ol->colFlags & C
9230: 4f 4c 46 4c 41 47 5f 55 4e 49 51 55 45 20 29 7b OLFLAG_UNIQUE ){
9240: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 . Index *pIdx
9250: 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 ;. for(pIdx=p
9260: 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 ->pIndex; pIdx;
9270: 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 pIdx=pIdx->pNext
9280: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 ){. assert(
9290: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d pIdx->nKeyCol==
92a0: 31 20 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72 1 && pIdx->onErr
92b0: 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 or!=OE_None );.
92c0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 if( pIdx->a
92d0: 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 70 2d 3e 6e iColumn[0]==p->n
92e0: 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 Col-1 ){.
92f0: 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 pIdx->uniqNotNu
9300: 6c 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a ll = 1;. }.
9310: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a }. }.}../*.
9320: 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 ** Scan the colu
9330: 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 mn type name zTy
9340: 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 pe (length nType
9350: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 ) and return the
9360: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 .** associated a
9370: 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a ffinity type..**
9380: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 .** This routine
9390: 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 does a case-ind
93a0: 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 ependent search
93b0: 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 of zType for the
93c0: 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 .** substrings
93d0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 in the following
93e0: 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f table. If one o
93f0: 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 f the substrings
9400: 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 is.** found, th
9410: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 e corresponding
9420: 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 affinity is retu
9430: 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 rned. If zType c
9440: 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 ontains.** more
9450: 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 than one of the
9460: 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 substrings, entr
9470: 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 ies toward the t
9480: 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 op of .** the ta
9490: 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 ble take priorit
94a0: 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 y. For example,
94b0: 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f if zType is 'BLO
94c0: 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 BINT', .** SQLIT
94d0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 E_AFF_INTEGER is
94e0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a returned..**.**
94f0: 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c Substring |
9500: 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d Affinity.** ---
9510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a -------------.**
9530: 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 'INT' |
9540: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 SQLITE_AFF_INTE
9550: 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 GER.** 'CHAR'
9560: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 | SQLITE_AF
9570: 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 F_TEXT.** 'CLOB'
9580: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 | SQLITE
9590: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 _AFF_TEXT.** 'TE
95a0: 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c XT' | SQL
95b0: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 ITE_AFF_TEXT.**
95c0: 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 'BLOB' |
95d0: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 0a SQLITE_AFF_BLOB.
95e0: 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 ** 'REAL'
95f0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 | SQLITE_AFF_RE
9600: 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 AL.** 'FLOA'
9610: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 | SQLITE_AFF
9620: 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 _REAL.** 'DOUB'
9630: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f | SQLITE_
9640: 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 AFF_REAL.**.** I
9650: 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 f none of the su
9660: 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 bstrings in the
9670: 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 above table are
9680: 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 found,.** SQLITE
9690: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 _AFF_NUMERIC is
96a0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 returned..*/.cha
96b0: 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 r sqlite3Affinit
96c0: 79 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 yType(const char
96d0: 20 2a 7a 49 6e 2c 20 43 6f 6c 75 6d 6e 20 2a 70 *zIn, Column *p
96e0: 43 6f 6c 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 Col){. u32 h =
96f0: 30 3b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 0;. char aff =
9700: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 SQLITE_AFF_NUMER
9710: 49 43 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 IC;. const char
9720: 20 2a 7a 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20 *zChar = 0;..
9730: 61 73 73 65 72 74 28 20 7a 49 6e 21 3d 30 20 29 assert( zIn!=0 )
9740: 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b 30 ;. while( zIn[0
9750: 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68 3c ] ){. h = (h<
9760: 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70 70 <8) + sqlite3Upp
9770: 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e 29 erToLower[(*zIn)
9780: 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e 2b &0xff];. zIn+
9790: 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 +;. if( h==((
97a0: 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 'c'<<24)+('h'<<1
97b0: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 6)+('a'<<8)+'r')
97c0: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 ){
97d0: 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 /* CHAR */.
97e0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 aff = SQLITE_AF
97f0: 46 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7a 43 F_TEXT;. zC
9800: 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20 7d har = zIn;. }
9810: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 else if( h==(('c
9820: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 '<<24)+('l'<<16)
9830: 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 +('o'<<8)+'b') )
9840: 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 { /* CLOB
9850: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 */. aff = S
9860: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a QLITE_AFF_TEXT;.
9870: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d }else if( h=
9880: 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 =(('t'<<24)+('e'
9890: 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 <<16)+('x'<<8)+'
98a0: 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 t') ){ /*
98b0: 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 TEXT */. af
98c0: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 f = SQLITE_AFF_T
98d0: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 EXT;. }else i
98e0: 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 f( h==(('b'<<24)
98f0: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c +('l'<<16)+('o'<
9900: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 <8)+'b')
9910: 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 /* BLOB */.
9920: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 && (aff==SQ
9930: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 LITE_AFF_NUMERIC
9940: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f || aff==SQLITE_
9950: 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 AFF_REAL) ){.
9960: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f aff = SQLITE_
9970: 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20 20 AFF_BLOB;.
9980: 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27 20 if( zIn[0]=='('
9990: 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 23 ) zChar = zIn;.#
99a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
99b0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e IT_FLOATING_POIN
99c0: 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 T. }else if(
99d0: 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28 27 h==(('r'<<24)+('
99e0: 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 e'<<16)+('a'<<8)
99f0: 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20 20 2f +'l') /
9a00: 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20 20 * REAL */.
9a10: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 && aff==SQLITE
9a20: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a _AFF_NUMERIC ){.
9a30: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 aff = SQLI
9a40: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 TE_AFF_REAL;.
9a50: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 }else if( h==((
9a60: 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 'f'<<24)+('l'<<1
9a70: 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27 29 6)+('o'<<8)+'a')
9a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c 4f /* FLO
9a90: 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 A */. &&
9aa0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f aff==SQLITE_AFF_
9ab0: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 NUMERIC ){.
9ac0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 aff = SQLITE_AF
9ad0: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 F_REAL;. }els
9ae0: 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c 3c e if( h==(('d'<<
9af0: 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28 27 24)+('o'<<16)+('
9b00: 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 u'<<8)+'b')
9b10: 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f 0a /* DOUB */.
9b20: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d && aff==
9b30: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 SQLITE_AFF_NUMER
9b40: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 IC ){. aff
9b50: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 = SQLITE_AFF_REA
9b60: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 L;.#endif. }e
9b70: 6c 73 65 20 69 66 28 20 28 68 26 30 78 30 30 46 lse if( (h&0x00F
9b80: 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c 31 FFFFF)==(('i'<<1
9b90: 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27 29 6)+('n'<<8)+'t')
9ba0: 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a 2f ){ /* INT */
9bb0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c . aff = SQL
9bc0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b ITE_AFF_INTEGER;
9bd0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 . break;.
9be0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 }. }.. /* If
9bf0: 20 70 43 6f 6c 20 69 73 20 6e 6f 74 20 4e 55 4c pCol is not NUL
9c00: 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65 73 74 69 L, store an esti
9c10: 6d 61 74 65 20 6f 66 20 74 68 65 20 66 69 65 6c mate of the fiel
9c20: 64 20 73 69 7a 65 2e 20 20 54 68 65 0a 20 20 2a d size. The. *
9c30: 2a 20 65 73 74 69 6d 61 74 65 20 69 73 20 73 63 * estimate is sc
9c40: 61 6c 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 aled so that the
9c50: 20 73 69 7a 65 20 6f 66 20 61 6e 20 69 6e 74 65 size of an inte
9c60: 67 65 72 20 69 73 20 31 2e 20 20 2a 2f 0a 20 20 ger is 1. */.
9c70: 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 if( pCol ){.
9c80: 69 6e 74 20 76 20 3d 20 30 3b 20 20 20 2f 2a 20 int v = 0; /*
9c90: 64 65 66 61 75 6c 74 20 73 69 7a 65 20 69 73 20 default size is
9ca0: 61 70 70 72 6f 78 20 34 20 62 79 74 65 73 20 2a approx 4 bytes *
9cb0: 2f 0a 20 20 20 20 69 66 28 20 61 66 66 3c 53 51 /. if( aff<SQ
9cc0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 LITE_AFF_NUMERIC
9cd0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 ){. if( zC
9ce0: 68 61 72 20 29 7b 0a 20 20 20 20 20 20 20 20 77 har ){. w
9cf0: 68 69 6c 65 28 20 7a 43 68 61 72 5b 30 5d 20 29 hile( zChar[0] )
9d00: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 {. if(
9d10: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a sqlite3Isdigit(z
9d20: 43 68 61 72 5b 30 5d 29 20 29 7b 0a 20 20 20 20 Char[0]) ){.
9d30: 20 20 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 28 /* BLOB(
9d40: 6b 29 2c 20 56 41 52 43 48 41 52 28 6b 29 2c 20 k), VARCHAR(k),
9d50: 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f CHAR(k) -> r=(k/
9d60: 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 4+1) */.
9d70: 20 20 20 20 73 71 6c 69 74 65 33 47 65 74 49 6e sqlite3GetIn
9d80: 74 33 32 28 7a 43 68 61 72 2c 20 26 76 29 3b 0a t32(zChar, &v);.
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 brea
9da0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 k;. }.
9db0: 20 20 20 20 20 20 20 20 20 7a 43 68 61 72 2b 2b zChar++
9dc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
9dd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
9de0: 20 76 20 3d 20 31 36 3b 20 20 20 2f 2a 20 42 4c v = 16; /* BL
9df0: 4f 42 2c 20 54 45 58 54 2c 20 43 4c 4f 42 20 2d OB, TEXT, CLOB -
9e00: 3e 20 72 3d 35 20 20 28 61 70 70 72 6f 78 20 32 > r=5 (approx 2
9e10: 30 20 62 79 74 65 73 29 2a 2f 0a 20 20 20 20 20 0 bytes)*/.
9e20: 20 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 }. }.#ifdef
9e30: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4f SQLITE_ENABLE_SO
9e40: 52 54 45 52 5f 52 45 46 45 52 45 4e 43 45 53 0a RTER_REFERENCES.
9e50: 20 20 20 20 69 66 28 20 76 3e 3d 73 71 6c 69 74 if( v>=sqlit
9e60: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 e3GlobalConfig.s
9e70: 7a 53 6f 72 74 65 72 52 65 66 20 29 7b 0a 20 20 zSorterRef ){.
9e80: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 pCol->colFla
9e90: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 53 4f gs |= COLFLAG_SO
9ea0: 52 54 45 52 52 45 46 3b 0a 20 20 20 20 7d 0a 23 RTERREF;. }.#
9eb0: 65 6e 64 69 66 0a 20 20 20 20 76 20 3d 20 76 2f endif. v = v/
9ec0: 34 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 76 4 + 1;. if( v
9ed0: 3e 32 35 35 20 29 20 76 20 3d 20 32 35 35 3b 0a >255 ) v = 255;.
9ee0: 20 20 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 pCol->szEst
9ef0: 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 = v;. }. retur
9f00: 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 n aff;.}../*.**
9f10: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 The expression i
9f20: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 s the default va
9f30: 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 lue for the most
9f40: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 recently added
9f50: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 column.** of the
9f60: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 table currently
9f70: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 under construct
9f80: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 ion..**.** Defau
9f90: 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73 73 lt value express
9fa0: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e ions must be con
9fb0: 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e stant. Raise an
9fc0: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 exception if th
9fd0: 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65 is.** is not the
9fe0: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 case..**.** Thi
9ff0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c s routine is cal
a000: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 led by the parse
a010: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d r while in the m
a020: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 iddle of.** pars
a030: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 ing a CREATE TAB
a040: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f LE statement..*/
a050: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 .void sqlite3Add
a060: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 0a 20 20 DefaultValue(.
a070: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 Parse *pParse,
a080: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 /* Pars
a090: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 ing context */.
a0a0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 Expr *pExpr,
a0b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 /* The
a0c0: 20 70 61 72 73 65 64 20 65 78 70 72 65 73 73 69 parsed expressi
a0d0: 6f 6e 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c on of the defaul
a0e0: 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 63 6f 6e t value */. con
a0f0: 73 74 20 63 68 61 72 20 2a 7a 53 74 61 72 74 2c st char *zStart,
a100: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f /* Start o
a110: 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 f the default va
a120: 6c 75 65 20 74 65 78 74 20 2a 2f 0a 20 20 63 6f lue text */. co
a130: 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 64 20 20 nst char *zEnd
a140: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 /* First
a150: 63 68 61 72 61 63 74 65 72 20 70 61 73 74 20 65 character past e
a160: 6e 64 20 6f 66 20 64 65 66 61 75 74 20 76 61 6c nd of defaut val
a170: 75 65 20 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 ue text */.){.
a180: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 Table *p;. Colu
a190: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 mn *pCol;. sqli
a1a0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 te3 *db = pParse
a1b0: 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50 61 72 ->db;. p = pPar
a1c0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 se->pNewTable;.
a1d0: 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20 20 20 if( p!=0 ){.
a1e0: 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f pCol = &(p->aCo
a1f0: 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 l[p->nCol-1]);.
a200: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 if( !sqlite3E
a210: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 xprIsConstantOrF
a220: 75 6e 63 74 69 6f 6e 28 70 45 78 70 72 2c 20 64 unction(pExpr, d
a230: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b b->init.busy) ){
a240: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 . sqlite3Er
a250: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 rorMsg(pParse, "
a260: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 default value of
a270: 20 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 column [%s] is
a280: 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 not constant",.
a290: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a pCol->z
a2a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 Name);. }else
a2b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 {. /* A cop
a2c0: 79 20 6f 66 20 70 45 78 70 72 20 69 73 20 75 73 y of pExpr is us
a2d0: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 ed instead of th
a2e0: 65 20 6f 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 e original, as p
a2f0: 45 78 70 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 Expr contains.
a300: 20 20 20 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 ** tokens th
a310: 61 74 20 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 at point to vola
a320: 74 69 6c 65 20 6d 65 6d 6f 72 79 2e 0a 20 20 20 tile memory..
a330: 20 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 */. Expr
a340: 20 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 x;. sqlite
a350: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 3ExprDelete(db,
a360: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 pCol->pDflt);.
a370: 20 20 20 20 6d 65 6d 73 65 74 28 26 78 2c 20 30 memset(&x, 0
a380: 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 , sizeof(x));.
a390: 20 20 20 20 78 2e 6f 70 20 3d 20 54 4b 5f 53 50 x.op = TK_SP
a3a0: 41 4e 3b 0a 20 20 20 20 20 20 78 2e 75 2e 7a 54 AN;. x.u.zT
a3b0: 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 oken = sqlite3Db
a3c0: 53 70 61 6e 44 75 70 28 64 62 2c 20 7a 53 74 61 SpanDup(db, zSta
a3d0: 72 74 2c 20 7a 45 6e 64 29 3b 0a 20 20 20 20 20 rt, zEnd);.
a3e0: 20 78 2e 70 4c 65 66 74 20 3d 20 70 45 78 70 72 x.pLeft = pExpr
a3f0: 3b 0a 20 20 20 20 20 20 78 2e 66 6c 61 67 73 20 ;. x.flags
a400: 3d 20 45 50 5f 53 6b 69 70 3b 0a 20 20 20 20 20 = EP_Skip;.
a410: 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 73 pCol->pDflt = s
a420: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 qlite3ExprDup(db
a430: 2c 20 26 78 2c 20 45 58 50 52 44 55 50 5f 52 45 , &x, EXPRDUP_RE
a440: 44 55 43 45 29 3b 0a 20 20 20 20 20 20 73 71 6c DUCE);. sql
a450: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 78 ite3DbFree(db, x
a460: 2e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 .u.zToken);.
a470: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 }. }. sqlite3E
a480: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 xprDelete(db, pE
a490: 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 xpr);.}../*.** B
a4a0: 61 63 6b 77 61 72 64 73 20 43 6f 6d 70 61 74 69 ackwards Compati
a4b0: 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a 2a 2a 20 bility Hack:.**
a4c0: 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 20 76 .** Historical v
a4d0: 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 ersions of SQLit
a4e0: 65 20 61 63 63 65 70 74 65 64 20 73 74 72 69 6e e accepted strin
a4f0: 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d gs as column nam
a500: 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65 78 65 73 es in.** indexes
a510: 20 61 6e 64 20 50 52 49 4d 41 52 59 20 4b 45 59 and PRIMARY KEY
a520: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e 64 constraints and
a530: 20 69 6e 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 in UNIQUE const
a540: 72 61 69 6e 74 73 2e 20 20 45 78 61 6d 70 6c 65 raints. Example
a550: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45 41 :.**.** CREA
a560: 54 45 20 54 41 42 4c 45 20 78 79 7a 28 61 2c 62 TE TABLE xyz(a,b
a570: 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52 59 20 4b ,c,d,e,PRIMARY K
a580: 45 59 28 27 61 27 29 2c 55 4e 49 51 55 45 28 27 EY('a'),UNIQUE('
a590: 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54 45 20 74 b','c' COLLATE t
a5a0: 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43 52 45 41 rim).** CREA
a5b0: 54 45 20 49 4e 44 45 58 20 61 62 63 20 4f 4e 20 TE INDEX abc ON
a5c0: 78 79 7a 28 27 63 27 2c 27 64 27 20 44 45 53 43 xyz('c','d' DESC
a5d0: 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 ,'e' COLLATE noc
a5e0: 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a 0a 2a 2a ase DESC);.**.**
a5f0: 20 54 68 69 73 20 69 73 20 67 6f 6f 66 79 2e 20 This is goofy.
a600: 20 42 75 74 20 74 6f 20 70 72 65 73 65 72 76 65 But to preserve
a610: 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 backwards compa
a620: 74 69 62 69 6c 69 74 79 20 77 65 20 63 6f 6e 74 tibility we cont
a630: 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63 63 65 70 inue to.** accep
a640: 74 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 t it. This rout
a650: 69 6e 65 20 64 6f 65 73 20 74 68 65 20 6e 65 63 ine does the nec
a660: 65 73 73 61 72 79 20 63 6f 6e 76 65 72 73 69 6f essary conversio
a670: 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72 74 73 0a n. It converts.
a680: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f ** the expressio
a690: 6e 20 67 69 76 65 6e 20 69 6e 20 69 74 73 20 61 n given in its a
a6a0: 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20 61 20 54 rgument from a T
a6b0: 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f 20 61 20 K_STRING into a
a6c0: 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74 68 65 20 TK_ID.** if the
a6d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6a 75 expression is ju
a6e0: 73 74 20 61 20 54 4b 5f 53 54 52 49 4e 47 20 77 st a TK_STRING w
a6f0: 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 ith an optional
a700: 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 2e 0a COLLATE clause..
a710: 2a 2a 20 49 66 20 74 68 65 20 65 70 78 72 65 73 ** If the epxres
a720: 73 69 6f 6e 20 69 73 20 61 6e 79 74 68 69 6e 67 sion is anything
a730: 20 6f 74 68 65 72 20 74 68 61 6e 20 54 4b 5f 53 other than TK_S
a740: 54 52 49 4e 47 2c 20 74 68 65 20 65 78 70 72 65 TRING, the expre
a750: 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e 63 68 ssion is.** unch
a760: 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 anged..*/.static
a770: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 72 void sqlite3Str
a780: 69 6e 67 54 6f 49 64 28 45 78 70 72 20 2a 70 29 ingToId(Expr *p)
a790: 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 {. if( p->op==T
a7a0: 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 K_STRING ){.
a7b0: 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a 20 p->op = TK_ID;.
a7c0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f 70 }else if( p->op
a7d0: 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26 20 ==TK_COLLATE &&
a7e0: 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b p->pLeft->op==TK
a7f0: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 70 _STRING ){. p
a800: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d 20 54 4b ->pLeft->op = TK
a810: 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a _ID;. }.}../*.*
a820: 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65 20 * Designate the
a830: 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72 20 PRIMARY KEY for
a840: 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69 73 the table. pLis
a850: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 6e t is a list of n
a860: 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c 75 ames .** of colu
a870: 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 mns that form th
a880: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 e primary key.
a890: 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c 4c If pList is NULL
a8a0: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d 6f , then the.** mo
a8b0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 st recently adde
a8c0: 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 d column of the
a8d0: 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72 69 table is the pri
a8e0: 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 mary key..**.**
a8f0: 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76 65 A table can have
a900: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72 69 at most one pri
a910: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74 68 mary key. If th
a920: 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 e table already
a930: 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72 79 has.** a primary
a940: 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20 69 key (and this i
a950: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72 69 s the second pri
a960: 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20 63 mary key) then c
a970: 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72 6f reate an.** erro
a980: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 r..**.** If the
a990: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20 6f PRIMARY KEY is o
a9a0: 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d n a single colum
a9b0: 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70 65 n whose datatype
a9c0: 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a 20 is INTEGER,.**
a9d0: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72 79 then we will try
a9e0: 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f 6c to use that col
a9f0: 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69 64 umn as the rowid
aa00: 2e 20 20 53 65 74 20 74 68 65 20 54 61 62 6c 65 . Set the Table
aa10: 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64 20 .iPKey.** field
aa20: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 of the table und
aa30: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 er construction
aa40: 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78 20 to be the index
aa50: 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 of the.** INTEGE
aa60: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f R PRIMARY KEY co
aa70: 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50 4b lumn. Table.iPK
aa80: 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 ey is set to -1
aa90: 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e if there is.** n
aaa0: 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 o INTEGER PRIMAR
aab0: 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 Y KEY..**.** If
aac0: 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20 61 the key is not a
aad0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 n INTEGER PRIMAR
aae0: 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65 61 Y KEY, then crea
aaf0: 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20 69 te a unique.** i
ab00: 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65 79 ndex for the key
ab10: 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20 63 . No index is c
ab20: 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45 47 reated for INTEG
ab30: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73 2e ER PRIMARY KEYs.
ab40: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
ab50: 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a 20 AddPrimaryKey(.
ab60: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 Parse *pParse,
ab70: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f /* Parsing co
ab80: 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c ntext */. ExprL
ab90: 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a 20 ist *pList, /*
aba0: 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e 61 List of field na
abb0: 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 mes to be indexe
abc0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 d */. int onErr
abd0: 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61 74 or, /* What
abe0: 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75 6e to do with a un
abf0: 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69 63 iqueness conflic
ac00: 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f 49 t */. int autoI
ac10: 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 nc, /* True
ac20: 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43 52 if the AUTOINCR
ac30: 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69 73 EMENT keyword is
ac40: 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69 6e present */. in
ac50: 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20 20 t sortOrder
ac60: 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 /* SQLITE_SO_ASC
ac70: 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 or SQLITE_SO_DE
ac80: 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 SC */.){. Table
ac90: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d *pTab = pParse-
aca0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 43 6f >pNewTable;. Co
acb0: 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a lumn *pCol = 0;.
acc0: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c int iCol = -1,
acd0: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b i;. int nTerm;
ace0: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 . if( pTab==0 )
acf0: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65 goto primary_ke
ad00: 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54 y_exit;. if( pT
ad10: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 ab->tabFlags & T
ad20: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20 F_HasPrimaryKey
ad30: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 ){. sqlite3Er
ad40: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a rorMsg(pParse, .
ad50: 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25 "table \"%
ad60: 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61 s\" has more tha
ad70: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 n one primary ke
ad80: 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 y", pTab->zName)
ad90: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61 ;. goto prima
ada0: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d ry_key_exit;. }
adb0: 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 . pTab->tabFlag
adc0: 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61 s |= TF_HasPrima
add0: 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69 ryKey;. if( pLi
ade0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f st==0 ){. iCo
adf0: 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d l = pTab->nCol -
ae00: 20 31 3b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 1;. pCol = &
ae10: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d pTab->aCol[iCol]
ae20: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 ;. pCol->colF
ae30: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f lags |= COLFLAG_
ae40: 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 6e 54 65 PRIMKEY;. nTe
ae50: 72 6d 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b rm = 1;. }else{
ae60: 0a 20 20 20 20 6e 54 65 72 6d 20 3d 20 70 4c 69 . nTerm = pLi
ae70: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 66 st->nExpr;. f
ae80: 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b or(i=0; i<nTerm;
ae90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 i++){. Exp
aea0: 72 20 2a 70 43 45 78 70 72 20 3d 20 73 71 6c 69 r *pCExpr = sqli
aeb0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 te3ExprSkipColla
aec0: 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 te(pList->a[i].p
aed0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 61 73 73 Expr);. ass
aee0: 65 72 74 28 20 70 43 45 78 70 72 21 3d 30 20 29 ert( pCExpr!=0 )
aef0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 ;. sqlite3S
af00: 74 72 69 6e 67 54 6f 49 64 28 70 43 45 78 70 72 tringToId(pCExpr
af10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 45 );. if( pCE
af20: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 xpr->op==TK_ID )
af30: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 {. const
af40: 63 68 61 72 20 2a 7a 43 4e 61 6d 65 20 3d 20 70 char *zCName = p
af50: 43 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b CExpr->u.zToken;
af60: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f . for(iCo
af70: 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e l=0; iCol<pTab->
af80: 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 nCol; iCol++){.
af90: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c if( sql
afa0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43 4e 61 ite3StrICmp(zCNa
afb0: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 me, pTab->aCol[i
afc0: 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 Col].zName)==0 )
afd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 {. pC
afe0: 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c ol = &pTab->aCol
aff0: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 [iCol];.
b000: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 pCol->colFla
b010: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 gs |= COLFLAG_PR
b020: 49 4d 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 20 IMKEY;.
b030: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 break;.
b040: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a }. }.
b050: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 }. }.
b060: 7d 0a 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 31 }. if( nTerm==1
b070: 0a 20 20 20 26 26 20 70 43 6f 6c 0a 20 20 20 26 . && pCol. &
b080: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 & sqlite3StrICmp
b090: 28 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 54 79 (sqlite3ColumnTy
b0a0: 70 65 28 70 43 6f 6c 2c 22 22 29 2c 20 22 49 4e pe(pCol,""), "IN
b0b0: 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 26 26 TEGER")==0. &&
b0c0: 20 73 6f 72 74 4f 72 64 65 72 21 3d 53 51 4c 49 sortOrder!=SQLI
b0d0: 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20 29 7b 0a TE_SO_DESC. ){.
b0e0: 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d if( IN_RENAM
b0f0: 45 5f 4f 42 4a 45 43 54 20 26 26 20 70 4c 69 73 E_OBJECT && pLis
b100: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 t ){. sqlit
b110: 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d e3RenameTokenRem
b120: 61 70 28 70 50 61 72 73 65 2c 20 26 70 54 61 62 ap(pParse, &pTab
b130: 2d 3e 69 50 4b 65 79 2c 20 70 4c 69 73 74 2d 3e ->iPKey, pList->
b140: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 a[0].pExpr);.
b150: 20 7d 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b }. pTab->iPK
b160: 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 ey = iCol;. p
b170: 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 Tab->keyConf = (
b180: 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 u8)onError;.
b190: 61 73 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d assert( autoInc=
b1a0: 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 =0 || autoInc==1
b1b0: 20 29 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 );. pTab->ta
b1c0: 62 46 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e bFlags |= autoIn
b1d0: 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 c*TF_Autoincreme
b1e0: 6e 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 nt;. if( pLis
b1f0: 74 20 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 t ) pParse->iPkS
b200: 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 ortOrder = pList
b210: 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 ->a[0].sortOrder
b220: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 ;. }else if( au
b230: 74 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 toInc ){.#ifndef
b240: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 SQLITE_OMIT_AUT
b250: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 OINCREMENT. s
b260: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 qlite3ErrorMsg(p
b270: 50 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 Parse, "AUTOINCR
b280: 45 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c EMENT is only al
b290: 6c 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 lowed on an ".
b2a0: 20 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 "INTEGER PR
b2b0: 49 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e IMARY KEY");.#en
b2c0: 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 dif. }else{.
b2d0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e sqlite3CreateIn
b2e0: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 dex(pParse, 0, 0
b2f0: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 , 0, pList, onEr
b300: 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 ror, 0,.
b310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b320: 20 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 0, sortOrder,
b330: 20 30 2c 20 53 51 4c 49 54 45 5f 49 44 58 54 59 0, SQLITE_IDXTY
b340: 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 3b 0a PE_PRIMARYKEY);.
b350: 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 pList = 0;.
b360: 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f }..primary_key_
b370: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 exit:. sqlite3E
b380: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 xprListDelete(pP
b390: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 arse->db, pList)
b3a0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f ;. return;.}../
b3b0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43 *.** Add a new C
b3c0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 HECK constraint
b3d0: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 to the table cur
b3e0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e rently under con
b3f0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f struction..*/.vo
b400: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65 id sqlite3AddChe
b410: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 ckConstraint(.
b420: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 Parse *pParse,
b430: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e /* Parsing con
b440: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a text */. Expr *
b450: 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 pCheckExpr /* T
b460: 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 he check express
b470: 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 ion */.){.#ifnde
b480: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 f SQLITE_OMIT_CH
b490: 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 ECK. Table *pTa
b4a0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 b = pParse->pNew
b4b0: 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 Table;. sqlite3
b4c0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 *db = pParse->d
b4d0: 62 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26 b;. if( pTab &&
b4e0: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 !IN_DECLARE_VTA
b4f0: 42 0a 20 20 20 26 26 20 21 73 71 6c 69 74 65 33 B. && !sqlite3
b500: 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28 BtreeIsReadonly(
b510: 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69 6e 69 74 db->aDb[db->init
b520: 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20 29 7b 0a .iDb].pBt). ){.
b530: 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b pTab->pCheck
b540: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 = sqlite3ExprLi
b550: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c stAppend(pParse,
b560: 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20 70 pTab->pCheck, p
b570: 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 20 20 CheckExpr);.
b580: 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73 if( pParse->cons
b590: 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 29 7b 0a traintName.n ){.
b5a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 sqlite3Exp
b5b0: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 rListSetName(pPa
b5c0: 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 rse, pTab->pChec
b5d0: 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63 6f 6e 73 k, &pParse->cons
b5e0: 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31 29 3b 0a traintName, 1);.
b5f0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 }. }else.#e
b600: 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c ndif. {. sql
b610: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 ite3ExprDelete(p
b620: 50 61 72 73 65 2d 3e 64 62 2c 20 70 43 68 65 63 Parse->db, pChec
b630: 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f kExpr);. }.}../
b640: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c *.** Set the col
b650: 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 lation function
b660: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 of the most rece
b670: 6e 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c ntly parsed tabl
b680: 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 e column.** to t
b690: 68 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e he CollSeq given
b6a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
b6b0: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 3AddCollateType(
b6c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 Parse *pParse, T
b6d0: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 oken *pToken){.
b6e0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 Table *p;. int
b6f0: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c i;. char *zCol
b700: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 l;
b710: 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 /* Dequoted name
b720: 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 of collation se
b730: 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 quence */. sqli
b740: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 te3 *db;.. if(
b750: 28 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 (p = pParse->pNe
b760: 77 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 wTable)==0 ) ret
b770: 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 urn;. i = p->nC
b780: 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 ol-1;. db = pPa
b790: 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c rse->db;. zColl
b7a0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 = sqlite3NameFr
b7b0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b omToken(db, pTok
b7c0: 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c en);. if( !zCol
b7d0: 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 l ) return;.. i
b7e0: 66 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 f( sqlite3Locate
b7f0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 CollSeq(pParse,
b800: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 49 6e zColl) ){. In
b810: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 73 dex *pIdx;. s
b820: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
b830: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c p->aCol[i].zCol
b840: 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b l);. p->aCol[
b850: 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c i].zColl = zColl
b860: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 ;. . /* If t
b870: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 he column is dec
b880: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e lared as "<name>
b890: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c PRIMARY KEY COL
b8a0: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 LATE <type>",.
b8b0: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 ** then an ind
b8c0: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e ex may have been
b8d0: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73 created on this
b8e0: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 column before t
b8f0: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 he. ** collat
b900: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64 ion type was add
b910: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73 ed. Correct this
b920: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61 if it is the ca
b930: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 se.. */. f
b940: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 or(pIdx=p->pInde
b950: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 x; pIdx; pIdx=pI
b960: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 dx->pNext){.
b970: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e assert( pIdx->
b980: 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b 0a 20 20 nKeyCol==1 );.
b990: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69 if( pIdx->ai
b9a0: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a Column[0]==i ){.
b9b0: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a pIdx->az
b9c0: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f Coll[0] = p->aCo
b9d0: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 l[i].zColl;.
b9e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 }. }. }els
b9f0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 e{. sqlite3Db
ba00: 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b Free(db, zColl);
ba10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 . }.}../*.** Th
ba20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 is function retu
ba30: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f rns the collatio
ba40: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64 n sequence for d
ba50: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74 atabase native t
ba60: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 ext.** encoding
ba70: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 identified by th
ba80: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 e string zName,
ba90: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a length nName..**
baa0: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 .** If the reque
bab0: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 sted collation s
bac0: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 equence is not a
bad0: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 vailable, or not
bae0: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e available.** in
baf0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 the database na
bb00: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 tive encoding, t
bb10: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 he collation fac
bb20: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 tory is invoked
bb30: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74 to.** request it
bb40: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 . If the collati
bb50: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20 on factory does
bb60: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20 not supply such
bb70: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 a sequence,.** a
bb80: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 nd the sequence
bb90: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 is available in
bba0: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63 another text enc
bbb0: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 oding, then that
bbc0: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 is.** returned
bbd0: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 instead..**.** I
bbe0: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 f no versions of
bbf0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 the requested c
bc00: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e ollations sequen
bc10: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 ce are available
bc20: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 , or.** another
bc30: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 error occurs, NU
bc40: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 LL is returned a
bc50: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 nd an error mess
bc60: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f age written into
bc70: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a .** pParse..**.*
bc80: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 * This routine i
bc90: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 s a wrapper arou
bca0: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f nd sqlite3FindCo
bcb0: 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72 llSeq(). This r
bcc0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 outine.** invoke
bcd0: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 s the collation
bce0: 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e factory if the n
bcf0: 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 amed collation c
bd00: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a annot be found.*
bd10: 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20 * and generates
bd20: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 an error message
bd30: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f ..**.** See also
bd40: 3a 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c : sqlite3FindCol
bd50: 6c 53 65 71 28 29 2c 20 73 71 6c 69 74 65 33 47 lSeq(), sqlite3G
bd60: 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 etCollSeq().*/.C
bd70: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c ollSeq *sqlite3L
bd80: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 ocateCollSeq(Par
bd90: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 se *pParse, cons
bda0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a t char *zName){.
bdb0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 sqlite3 *db =
bdc0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 pParse->db;. u8
bdd0: 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a enc = ENC(db);.
bde0: 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d 20 u8 initbusy =
bdf0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 db->init.busy;.
be00: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b CollSeq *pColl;
be10: 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 .. pColl = sqli
be20: 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 te3FindCollSeq(d
be30: 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 b, enc, zName, i
be40: 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66 28 20 nitbusy);. if(
be50: 21 69 6e 69 74 62 75 73 79 20 26 26 20 28 21 70 !initbusy && (!p
be60: 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e Coll || !pColl->
be70: 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70 43 6f xCmp) ){. pCo
be80: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 ll = sqlite3GetC
be90: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 65 ollSeq(pParse, e
bea0: 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 nc, pColl, zName
beb0: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e );. }.. return
bec0: 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a pColl;.}.../*.*
bed0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 * Generate code
bee0: 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d that will increm
bef0: 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 ent the schema c
bf00: 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 ookie..**.** The
bf10: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 schema cookie i
bf20: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d s used to determ
bf30: 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 ine when the sch
bf40: 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 ema for the.** d
bf50: 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e atabase changes.
bf60: 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 After each sch
bf70: 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 ema change, the
bf80: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 cookie value.**
bf90: 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 changes. When a
bfa0: 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 process first r
bfb0: 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 eads the schema
bfc0: 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a it records the.*
bfd0: 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 * cookie. There
bfe0: 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 after, whenever
bff0: 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 it goes to acces
c000: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a s the database,.
c010: 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 ** it checks the
c020: 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 cookie to make
c030: 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 sure the schema
c040: 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a has not changed.
c050: 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 ** since it was
c060: 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a last read..**.**
c070: 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f This plan is no
c080: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c t completely bul
c090: 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 let-proof. It i
c0a0: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a s possible for.*
c0b0: 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 * the schema to
c0c0: 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 change multiple
c0d0: 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 times and for th
c0e0: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a e cookie to be.*
c0f0: 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 * set back to pr
c100: 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 ior value. But
c110: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 schema changes a
c120: 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a re infrequent.**
c130: 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 and the probabi
c140: 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 lity of hitting
c150: 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 the same cookie
c160: 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a value is only.**
c170: 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 1 chance in 2^3
c180: 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 2. So we're saf
c190: 65 20 65 6e 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 e enough..**.**
c1a0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f IMPLEMENTATION-O
c1b0: 46 3a 20 52 2d 33 34 32 33 30 2d 35 36 30 34 39 F: R-34230-56049
c1c0: 20 53 51 4c 69 74 65 20 61 75 74 6f 6d 61 74 69 SQLite automati
c1d0: 63 61 6c 6c 79 20 69 6e 63 72 65 6d 65 6e 74 73 cally increments
c1e0: 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 2d 76 .** the schema-v
c1f0: 65 72 73 69 6f 6e 20 77 68 65 6e 65 76 65 72 20 ersion whenever
c200: 74 68 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 the schema chang
c210: 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 es..*/.void sqli
c220: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 te3ChangeCookie(
c230: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 Parse *pParse, i
c240: 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 nt iDb){. sqlit
c250: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d e3 *db = pParse-
c260: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d >db;. Vdbe *v =
c270: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a pParse->pVdbe;.
c280: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 assert( sqlite
c290: 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 3SchemaMutexHeld
c2a0: 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a (db, iDb, 0) );.
c2b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 sqlite3VdbeAdd
c2c0: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f Op3(v, OP_SetCoo
c2d0: 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f kie, iDb, BTREE_
c2e0: 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 SCHEMA_VERSION,
c2f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
c300: 20 20 20 20 28 69 6e 74 29 28 31 2b 28 75 6e 73 (int)(1+(uns
c310: 69 67 6e 65 64 29 64 62 2d 3e 61 44 62 5b 69 44 igned)db->aDb[iD
c320: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 b].pSchema->sche
c330: 6d 61 5f 63 6f 6f 6b 69 65 29 29 3b 0a 7d 0a 0a ma_cookie));.}..
c340: 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 /*.** Measure th
c350: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 e number of char
c360: 61 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f acters needed to
c370: 20 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 output the give
c380: 6e 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e n.** identifier.
c390: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 The number ret
c3a0: 75 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 urned includes a
c3b0: 6e 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a ny quotes used.*
c3c0: 2a 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 * but does not i
c3d0: 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 nclude the null
c3e0: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a terminator..**.*
c3f0: 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 * The estimate i
c400: 73 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 s conservative.
c410: 20 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 It might be lar
c420: 67 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73 ger that what is
c430: 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 .** really neede
c440: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 d..*/.static int
c450: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e identLength(con
c460: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 st char *z){. i
c470: 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b nt n;. for(n=0;
c480: 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a *z; n++, z++){.
c490: 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 if( *z=='"'
c4a0: 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 ){ n++; }. }.
c4b0: 72 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a return n + 2;.}.
c4c0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 ./*.** The first
c4d0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 parameter is a
c4e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 pointer to an ou
c4f0: 74 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65 tput buffer. The
c500: 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 second .** para
c510: 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 meter is a point
c520: 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 er to an integer
c530: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 that contains t
c540: 68 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 he offset at.**
c550: 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69 which to write i
c560: 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 nto the output b
c570: 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63 uffer. This func
c580: 74 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a tion copies the.
c590: 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 ** nul-terminate
c5a0: 64 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 d string pointed
c5b0: 20 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64 to by the third
c5c0: 20 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 parameter, zSig
c5d0: 6e 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 nedIdent,.** to
c5e0: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66 the specified of
c5f0: 66 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66 fset in the buff
c600: 65 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a er and updates *
c610: 70 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a pIdx to refer.**
c620: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 to the first by
c630: 74 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 te after the las
c640: 74 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62 t byte written b
c650: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e efore returning.
c660: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 .** .** If the s
c670: 74 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 tring zSignedIde
c680: 6e 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 nt consists enti
c690: 72 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 rely of alpha-nu
c6a0: 6d 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 meric.** charact
c6b0: 65 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 ers, does not be
c6c0: 67 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74 gin with a digit
c6d0: 20 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 and is not an S
c6e0: 51 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 QL keyword,.** t
c6f0: 68 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 hen it is copied
c700: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 to the output b
c710: 75 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73 uffer exactly as
c720: 20 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73 it is. Otherwis
c730: 65 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 e,.** it is quot
c740: 65 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d ed using double-
c750: 71 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 quotes..*/.stati
c760: 63 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 c void identPut(
c770: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 char *z, int *pI
c780: 64 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 dx, char *zSigne
c790: 64 49 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 dIdent){. unsig
c7a0: 6e 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 ned char *zIdent
c7b0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 = (unsigned cha
c7c0: 72 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b r*)zSignedIdent;
c7d0: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 . int i, j, nee
c7e0: 64 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 dQuote;. i = *p
c7f0: 49 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b Idx;.. for(j=0;
c800: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 zIdent[j]; j++)
c810: 7b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 {. if( !sqlit
c820: 65 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 e3Isalnum(zIdent
c830: 5b 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a [j]) && zIdent[j
c840: 5d 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a ]!='_' ) break;.
c850: 20 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 }. needQuote
c860: 3d 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 = sqlite3Isdigit
c870: 28 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 (zIdent[0]).
c880: 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 || sqlit
c890: 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 e3KeywordCode(zI
c8a0: 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a dent, j)!=TK_ID.
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a || z
c8c0: 49 64 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 Ident[j]!=0.
c8d0: 20 20 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b || j==0;
c8e0: 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 .. if( needQuot
c8f0: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 e ) z[i++] = '"'
c900: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 ;. for(j=0; zId
c910: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 ent[j]; j++){.
c920: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e z[i++] = zIden
c930: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 t[j];. if( zI
c940: 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a dent[j]=='"' ) z
c950: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d [i++] = '"';. }
c960: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 . if( needQuote
c970: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b ) z[i++] = '"';
c980: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a . z[i] = 0;. *
c990: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a pIdx = i;.}../*.
c9a0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 ** Generate a CR
c9b0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 EATE TABLE state
c9c0: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 ment appropriate
c9d0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a for the given.*
c9e0: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 * table. Memory
c9f0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 to hold the tex
ca00: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 t of the stateme
ca10: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a nt is obtained.*
ca20: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c * from sqliteMal
ca30: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 loc() and must b
ca40: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 e freed by the c
ca50: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e alling function.
ca60: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 .*/.static char
ca70: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 *createTableStmt
ca80: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 (sqlite3 *db, Ta
ca90: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 ble *p){. int i
caa0: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a , k, n;. char *
cab0: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a zStmt;. char *z
cac0: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 Sep, *zSep2, *zE
cad0: 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 nd;. Column *pC
cae0: 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 ol;. n = 0;. f
caf0: 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f or(pCol = p->aCo
cb00: 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f l, i=0; i<p->nCo
cb10: 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b l; i++, pCol++){
cb20: 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c . n += identL
cb30: 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d ength(pCol->zNam
cb40: 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 e) + 5;. }. n
cb50: 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 += identLength(p
cb60: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 ->zName);. if(
cb70: 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 n<50 ){ . zSe
cb80: 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 p = "";. zSep
cb90: 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 2 = ",";. zEn
cba0: 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 d = ")";. }else
cbb0: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e {. zSep = "\n
cbc0: 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d ";. zSep2 =
cbd0: 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 ",\n ";. zE
cbe0: 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a nd = "\n)";. }.
cbf0: 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d n += 35 + 6*p-
cc00: 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d >nCol;. zStmt =
cc10: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 sqlite3DbMalloc
cc20: 52 61 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 Raw(0, n);. if(
cc30: 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 zStmt==0 ){.
cc40: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 sqlite3OomFault
cc50: 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e (db);. return
cc60: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 0;. }. sqlite
cc70: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 3_snprintf(n, zS
cc80: 74 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 tmt, "CREATE TAB
cc90: 4c 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c LE ");. k = sql
cca0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 ite3Strlen30(zSt
ccb0: 6d 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 mt);. identPut(
ccc0: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e zStmt, &k, p->zN
ccd0: 61 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b ame);. zStmt[k+
cce0: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 +] = '(';. for(
ccf0: 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d pCol=p->aCol, i=
cd00: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 0; i<p->nCol; i+
cd10: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 +, pCol++){.
cd20: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
cd30: 72 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 r * const azType
cd40: 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f [] = {. /
cd50: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f * SQLITE_AFF_BLO
cd60: 42 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20 B */ "",.
cd70: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 /* SQLITE_AF
cd80: 46 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54 F_TEXT */ " T
cd90: 45 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a EXT",. /*
cda0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 SQLITE_AFF_NUME
cdb0: 52 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 RIC */ " NUM",.
cdc0: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 /* SQLITE
cdd0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 _AFF_INTEGER */
cde0: 22 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 " INT",.
cdf0: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 /* SQLITE_AFF_RE
ce00: 41 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 AL */ " REAL"
ce10: 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 . };. int
ce20: 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 len;. const c
ce30: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 har *zType;..
ce40: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 sqlite3_snprint
ce50: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d f(n-k, &zStmt[k]
ce60: 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b , zSep);. k +
ce70: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 = sqlite3Strlen3
ce80: 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 0(&zStmt[k]);.
ce90: 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a zSep = zSep2;.
cea0: 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 identPut(zSt
ceb0: 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e mt, &k, pCol->zN
cec0: 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 ame);. assert
ced0: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 ( pCol->affinity
cee0: 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 -SQLITE_AFF_BLOB
cef0: 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 >= 0 );. ass
cf00: 65 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e ert( pCol->affin
cf10: 69 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 ity-SQLITE_AFF_B
cf20: 4c 4f 42 20 3c 20 41 72 72 61 79 53 69 7a 65 28 LOB < ArraySize(
cf30: 61 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74 azType) );. t
cf40: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 estcase( pCol->a
cf50: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f ffinity==SQLITE_
cf60: 41 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 AFF_BLOB );.
cf70: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e testcase( pCol->
cf80: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 affinity==SQLITE
cf90: 5f 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 _AFF_TEXT );.
cfa0: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d testcase( pCol-
cfb0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 >affinity==SQLIT
cfc0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b E_AFF_NUMERIC );
cfd0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 . testcase( p
cfe0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 Col->affinity==S
cff0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 QLITE_AFF_INTEGE
d000: 52 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 R );. testcas
d010: 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 e( pCol->affinit
d020: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 y==SQLITE_AFF_RE
d030: 41 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a AL );. . z
d040: 54 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 Type = azType[pC
d050: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 ol->affinity - S
d060: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b QLITE_AFF_BLOB];
d070: 0a 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 . len = sqlit
d080: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 e3Strlen30(zType
d090: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 );. assert( p
d0a0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 Col->affinity==S
d0b0: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a QLITE_AFF_BLOB .
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 || p
d0d0: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 Col->affinity==s
d0e0: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 qlite3AffinityTy
d0f0: 70 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a pe(zType, 0) );.
d100: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d memcpy(&zStm
d110: 74 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e t[k], zType, len
d120: 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b );. k += len;
d130: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d . assert( k<=
d140: 6e 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 n );. }. sqlit
d150: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c e3_snprintf(n-k,
d160: 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 &zStmt[k], "%s"
d170: 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 , zEnd);. retur
d180: 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a n zStmt;.}../*.*
d190: 2a 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65 * Resize an Inde
d1a0: 78 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64 x object to hold
d1b0: 20 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c N columns total
d1c0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 . Return SQLITE
d1d0: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 _OK.** on succes
d1e0: 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d s and SQLITE_NOM
d1f0: 45 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 EM on an OOM err
d200: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e or..*/.static in
d210: 74 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a t resizeIndexObj
d220: 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c ect(sqlite3 *db,
d230: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e Index *pIdx, in
d240: 74 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 t N){. char *zE
d250: 78 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 xtra;. int nByt
d260: 65 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e e;. if( pIdx->n
d270: 43 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 Column>=N ) retu
d280: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 rn SQLITE_OK;.
d290: 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73 assert( pIdx->is
d2a0: 52 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 Resized==0 );.
d2b0: 6e 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28 nByte = (sizeof(
d2c0: 63 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 char*) + sizeof(
d2d0: 69 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a i16) + 1)*N;. z
d2e0: 45 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44 Extra = sqlite3D
d2f0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 bMallocZero(db,
d300: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45 nByte);. if( zE
d310: 78 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e xtra==0 ) return
d320: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b SQLITE_NOMEM_BK
d330: 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 78 PT;. memcpy(zEx
d340: 74 72 61 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c tra, pIdx->azCol
d350: 6c 2c 20 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 l, sizeof(char*)
d360: 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b *pIdx->nColumn);
d370: 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 . pIdx->azColl
d380: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 = (const char**)
d390: 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 zExtra;. zExtra
d3a0: 20 2b 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 2a += sizeof(char*
d3b0: 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45 )*N;. memcpy(zE
d3c0: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 69 43 6f xtra, pIdx->aiCo
d3d0: 6c 75 6d 6e 2c 20 73 69 7a 65 6f 66 28 69 31 36 lumn, sizeof(i16
d3e0: 29 2a 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 )*pIdx->nColumn)
d3f0: 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 ;. pIdx->aiColu
d400: 6d 6e 20 3d 20 28 69 31 36 2a 29 7a 45 78 74 72 mn = (i16*)zExtr
d410: 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 a;. zExtra += s
d420: 69 7a 65 6f 66 28 69 31 36 29 2a 4e 3b 0a 20 20 izeof(i16)*N;.
d430: 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 memcpy(zExtra, p
d440: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c Idx->aSortOrder,
d450: 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b pIdx->nColumn);
d460: 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 . pIdx->aSortOr
d470: 64 65 72 20 3d 20 28 75 38 2a 29 7a 45 78 74 72 der = (u8*)zExtr
d480: 61 3b 0a 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 a;. pIdx->nColu
d490: 6d 6e 20 3d 20 4e 3b 0a 20 20 70 49 64 78 2d 3e mn = N;. pIdx->
d4a0: 69 73 52 65 73 69 7a 65 64 20 3d 20 31 3b 0a 20 isResized = 1;.
d4b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
d4c0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 K;.}../*.** Esti
d4d0: 6d 61 74 65 20 74 68 65 20 74 6f 74 61 6c 20 72 mate the total r
d4e0: 6f 77 20 77 69 64 74 68 20 66 6f 72 20 61 20 74 ow width for a t
d4f0: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 able..*/.static
d500: 76 6f 69 64 20 65 73 74 69 6d 61 74 65 54 61 62 void estimateTab
d510: 6c 65 57 69 64 74 68 28 54 61 62 6c 65 20 2a 70 leWidth(Table *p
d520: 54 61 62 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 Tab){. unsigned
d530: 20 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 63 wTable = 0;. c
d540: 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 onst Column *pTa
d550: 62 43 6f 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 bCol;. int i;.
d560: 20 66 6f 72 28 69 3d 70 54 61 62 2d 3e 6e 43 6f for(i=pTab->nCo
d570: 6c 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d l, pTabCol=pTab-
d580: 3e 61 43 6f 6c 3b 20 69 3e 30 3b 20 69 2d 2d 2c >aCol; i>0; i--,
d590: 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 pTabCol++){.
d5a0: 20 77 54 61 62 6c 65 20 2b 3d 20 70 54 61 62 43 wTable += pTabC
d5b0: 6f 6c 2d 3e 73 7a 45 73 74 3b 0a 20 20 7d 0a 20 ol->szEst;. }.
d5c0: 20 69 66 28 20 70 54 61 62 2d 3e 69 50 4b 65 79 if( pTab->iPKey
d5d0: 3c 30 20 29 20 77 54 61 62 6c 65 2b 2b 3b 0a 20 <0 ) wTable++;.
d5e0: 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 20 pTab->szTabRow
d5f0: 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 = sqlite3LogEst(
d600: 77 54 61 62 6c 65 2a 34 29 3b 0a 7d 0a 0a 2f 2a wTable*4);.}../*
d610: 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 .** Estimate the
d620: 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f 66 average size of
d630: 20 61 20 72 6f 77 20 66 6f 72 20 61 6e 20 69 6e a row for an in
d640: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 dex..*/.static v
d650: 6f 69 64 20 65 73 74 69 6d 61 74 65 49 6e 64 65 oid estimateInde
d660: 78 57 69 64 74 68 28 49 6e 64 65 78 20 2a 70 49 xWidth(Index *pI
d670: 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 dx){. unsigned
d680: 77 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 69 6e wIndex = 0;. in
d690: 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c t i;. const Col
d6a0: 75 6d 6e 20 2a 61 43 6f 6c 20 3d 20 70 49 64 78 umn *aCol = pIdx
d6b0: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3b 0a ->pTable->aCol;.
d6c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 for(i=0; i<pId
d6d0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 x->nColumn; i++)
d6e0: 7b 0a 20 20 20 20 69 31 36 20 78 20 3d 20 70 49 {. i16 x = pI
d6f0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b dx->aiColumn[i];
d700: 0a 20 20 20 20 61 73 73 65 72 74 28 20 78 3c 70 . assert( x<p
d710: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 6e 43 6f Idx->pTable->nCo
d720: 6c 20 29 3b 0a 20 20 20 20 77 49 6e 64 65 78 20 l );. wIndex
d730: 2b 3d 20 78 3c 30 20 3f 20 31 20 3a 20 61 43 6f += x<0 ? 1 : aCo
d740: 6c 5b 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e l[pIdx->aiColumn
d750: 5b 69 5d 5d 2e 73 7a 45 73 74 3b 0a 20 20 7d 0a [i]].szEst;. }.
d760: 20 20 70 49 64 78 2d 3e 73 7a 49 64 78 52 6f 77 pIdx->szIdxRow
d770: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 = sqlite3LogEst
d780: 28 77 49 6e 64 65 78 2a 34 29 3b 0a 7d 0a 0a 2f (wIndex*4);.}../
d790: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 * Return true if
d7a0: 20 76 61 6c 75 65 20 78 20 69 73 20 66 6f 75 6e value x is foun
d7b0: 64 20 61 6e 79 20 6f 66 20 74 68 65 20 66 69 72 d any of the fir
d7c0: 73 74 20 6e 43 6f 6c 20 65 6e 74 72 69 65 73 20 st nCol entries
d7d0: 6f 66 20 61 69 43 6f 6c 5b 5d 0a 2a 2f 0a 73 74 of aiCol[].*/.st
d7e0: 61 74 69 63 20 69 6e 74 20 68 61 73 43 6f 6c 75 atic int hasColu
d7f0: 6d 6e 28 63 6f 6e 73 74 20 69 31 36 20 2a 61 69 mn(const i16 *ai
d800: 43 6f 6c 2c 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 Col, int nCol, i
d810: 6e 74 20 78 29 7b 0a 20 20 77 68 69 6c 65 28 20 nt x){. while(
d820: 6e 43 6f 6c 2d 2d 20 3e 20 30 20 29 20 69 66 28 nCol-- > 0 ) if(
d830: 20 78 3d 3d 2a 28 61 69 43 6f 6c 2b 2b 29 20 29 x==*(aiCol++) )
d840: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 return 1;. ret
d850: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 63 urn 0;.}../* Rec
d860: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 4e 6f ompute the colNo
d870: 74 49 64 78 65 64 20 66 69 65 6c 64 20 6f 66 20 tIdxed field of
d880: 74 68 65 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a the Index..**.**
d890: 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 69 73 20 colNotIdxed is
d8a0: 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 68 a bitmask that h
d8b0: 61 73 20 61 20 30 20 62 69 74 20 72 65 70 72 65 as a 0 bit repre
d8c0: 73 65 6e 74 69 6e 67 20 65 61 63 68 20 69 6e 64 senting each ind
d8d0: 65 78 65 64 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 exed.** columns
d8e0: 74 68 61 74 20 61 72 65 20 77 69 74 68 69 6e 20 that are within
d8f0: 74 68 65 20 66 69 72 73 74 20 36 33 20 63 6f 6c the first 63 col
d900: 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c umns of the tabl
d910: 65 2e 20 20 54 68 65 0a 2a 2a 20 68 69 67 68 2d e. The.** high-
d920: 6f 72 64 65 72 20 62 69 74 20 6f 66 20 63 6f 6c order bit of col
d930: 4e 6f 74 49 64 78 65 64 20 69 73 20 61 6c 77 61 NotIdxed is alwa
d940: 79 73 20 31 2e 20 20 41 6c 6c 20 75 6e 69 6e 64 ys 1. All unind
d950: 65 78 65 64 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 exed columns.**
d960: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 76 of the table hav
d970: 65 20 61 20 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 e a 1..**.** The
d980: 20 63 6f 6c 4e 6f 74 49 64 78 65 64 20 6d 61 73 colNotIdxed mas
d990: 6b 20 69 73 20 41 4e 44 2d 65 64 20 77 69 74 68 k is AND-ed with
d9a0: 20 74 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d the SrcList.a[]
d9b0: 2e 63 6f 6c 55 73 65 64 20 6d 61 73 6b 0a 2a 2a .colUsed mask.**
d9c0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 to determine if
d9d0: 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 63 6f the index is co
d9e0: 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2f vering index..*/
d9f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 63 .static void rec
da00: 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e 6f 74 omputeColumnsNot
da10: 49 6e 64 65 78 65 64 28 49 6e 64 65 78 20 2a 70 Indexed(Index *p
da20: 49 64 78 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 Idx){. Bitmask
da30: 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a m = 0;. int j;.
da40: 20 20 66 6f 72 28 6a 3d 70 49 64 78 2d 3e 6e 43 for(j=pIdx->nC
da50: 6f 6c 75 6d 6e 2d 31 3b 20 6a 3e 3d 30 3b 20 6a olumn-1; j>=0; j
da60: 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d --){. int x =
da70: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b pIdx->aiColumn[
da80: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 78 3e 3d 30 j];. if( x>=0
da90: 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 ){. testca
daa0: 73 65 28 20 78 3d 3d 42 4d 53 2d 31 20 29 3b 0a se( x==BMS-1 );.
dab0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 testcase(
dac0: 78 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 20 20 x==BMS-2 );.
dad0: 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29 20 if( x<BMS-1 )
dae0: 6d 20 7c 3d 20 4d 41 53 4b 42 49 54 28 78 29 3b m |= MASKBIT(x);
daf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 64 . }. }. pId
db00: 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 64 20 3d x->colNotIdxed =
db10: 20 7e 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 28 ~m;. assert( (
db20: 70 49 64 78 2d 3e 63 6f 6c 4e 6f 74 49 64 78 65 pIdx->colNotIdxe
db30: 64 3e 3e 36 33 29 3d 3d 31 20 29 3b 0a 7d 0a 0a d>>63)==1 );.}..
db40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 /*.** This routi
db50: 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65 20 65 ne runs at the e
db60: 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20 61 20 nd of parsing a
db70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 CREATE TABLE sta
db80: 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 68 tement that.** h
db90: 61 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 as a WITHOUT ROW
dba0: 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 ID clause. The
dbb0: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 job of this rout
dbc0: 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76 65 72 ine is to conver
dbd0: 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72 6e t both.** intern
dbe0: 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61 20 73 al schema data s
dbf0: 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 74 68 tructures and th
dc00: 65 20 67 65 6e 65 72 61 74 65 64 20 56 44 42 45 e generated VDBE
dc10: 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20 74 68 code so that th
dc20: 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f 70 ey.** are approp
dc30: 72 69 61 74 65 20 66 6f 72 20 61 20 57 49 54 48 riate for a WITH
dc40: 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 20 OUT ROWID table
dc50: 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72 6f 77 instead of a row
dc60: 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68 61 id table..** Cha
dc70: 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a nges include:.**
dc80: 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 53 65 74 .** (1) Set
dc90: 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 all columns of
dca0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 the PRIMARY KEY
dcb0: 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 74 6f schema object to
dcc0: 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 2a 2a be NOT NULL..**
dcd0: 20 20 20 20 20 28 32 29 20 20 43 6f 6e 76 65 72 (2) Conver
dce0: 74 20 50 33 20 70 61 72 61 6d 65 74 65 72 20 6f t P3 parameter o
dcf0: 66 20 74 68 65 20 4f 50 5f 43 72 65 61 74 65 42 f the OP_CreateB
dd00: 74 72 65 65 20 66 72 6f 6d 20 42 54 52 45 45 5f tree from BTREE_
dd10: 49 4e 54 4b 45 59 20 0a 2a 2a 20 20 20 20 20 20 INTKEY .**
dd20: 20 20 20 20 69 6e 74 6f 20 42 54 52 45 45 5f 42 into BTREE_B
dd30: 4c 4f 42 4b 45 59 2e 0a 2a 2a 20 20 20 20 20 28 LOBKEY..** (
dd40: 33 29 20 20 42 79 70 61 73 73 20 74 68 65 20 63 3) Bypass the c
dd50: 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 reation of the s
dd60: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 qlite_master tab
dd70: 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20 le entry.**
dd80: 20 20 20 20 20 66 6f 72 20 74 68 65 20 50 52 49 for the PRI
dd90: 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68 65 20 MARY KEY as the
dda0: 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 primary key inde
ddb0: 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 x is now.**
ddc0: 20 20 20 20 20 69 64 65 6e 74 69 66 69 65 64 20 identified
ddd0: 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 by the sqlite_ma
dde0: 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79 ster table entry
ddf0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 of the table it
de00: 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 34 29 self..** (4)
de10: 20 20 53 65 74 20 74 68 65 20 49 6e 64 65 78 2e Set the Index.
de20: 74 6e 75 6d 20 6f 66 20 74 68 65 20 50 52 49 4d tnum of the PRIM
de30: 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 ARY KEY Index ob
de40: 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 ject in the.**
de50: 20 20 20 20 20 20 20 20 73 63 68 65 6d 61 20 74 schema t
de60: 6f 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 o the rootpage f
de70: 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61 62 rom the main tab
de80: 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 35 29 20 20 le..** (5)
de90: 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f Add all table co
dea0: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49 lumns to the PRI
deb0: 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f MARY KEY Index o
dec0: 62 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20 20 20 bject.**
ded0: 20 20 73 6f 20 74 68 61 74 20 74 68 65 20 50 52 so that the PR
dee0: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 61 20 63 IMARY KEY is a c
def0: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 overing index.
df00: 54 68 65 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20 The surplus.**
df10: 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 columns
df20: 61 72 65 20 70 61 72 74 20 6f 66 20 4b 65 79 49 are part of KeyI
df30: 6e 66 6f 2e 6e 41 6c 6c 46 69 65 6c 64 20 61 6e nfo.nAllField an
df40: 64 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 66 d are not used f
df50: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 or.** s
df60: 6f 72 74 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70 orting or lookup
df70: 20 6f 72 20 75 6e 69 71 75 65 6e 65 73 73 20 63 or uniqueness c
df80: 68 65 63 6b 73 2e 0a 2a 2a 20 20 20 20 20 28 36 hecks..** (6
df90: 29 20 20 52 65 70 6c 61 63 65 20 74 68 65 20 72 ) Replace the r
dfa0: 6f 77 69 64 20 74 61 69 6c 20 6f 6e 20 61 6c 6c owid tail on all
dfb0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 automatically g
dfc0: 65 6e 65 72 61 74 65 64 20 55 4e 49 51 55 45 0a enerated UNIQUE.
dfd0: 2a 2a 20 20 20 20 20 20 20 20 20 20 69 6e 64 69 ** indi
dfe0: 63 65 73 20 77 69 74 68 20 74 68 65 20 50 52 49 ces with the PRI
dff0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 MARY KEY columns
e000: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 76 69 72 74 ..**.** For virt
e010: 75 61 6c 20 74 61 62 6c 65 73 2c 20 6f 6e 6c 79 ual tables, only
e020: 20 28 31 29 20 69 73 20 70 65 72 66 6f 72 6d 65 (1) is performe
e030: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 d..*/.static voi
e040: 64 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f d convertToWitho
e050: 75 74 52 6f 77 69 64 54 61 62 6c 65 28 50 61 72 utRowidTable(Par
e060: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c se *pParse, Tabl
e070: 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 e *pTab){. Inde
e080: 78 20 2a 70 49 64 78 3b 0a 20 20 49 6e 64 65 78 x *pIdx;. Index
e090: 20 2a 70 50 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b *pPk;. int nPk
e0a0: 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 ;. int i, j;.
e0b0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 sqlite3 *db = pP
e0c0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 arse->db;. Vdbe
e0d0: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 *v = pParse->pV
e0e0: 64 62 65 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 dbe;.. /* Mark
e0f0: 65 76 65 72 79 20 50 52 49 4d 41 52 59 20 4b 45 every PRIMARY KE
e100: 59 20 63 6f 6c 75 6d 6e 20 61 73 20 4e 4f 54 20 Y column as NOT
e110: 4e 55 4c 4c 20 28 65 78 63 65 70 74 20 66 6f 72 NULL (except for
e120: 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 73 imposter tables
e130: 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 ). */. if( !db
e140: 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74 65 72 54 ->init.imposterT
e150: 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 able ){. for(
e160: 69 3d 30 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f i=0; i<pTab->nCo
e170: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 l; i++){. i
e180: 66 28 20 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 f( (pTab->aCol[i
e190: 5d 2e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c ].colFlags & COL
e1a0: 46 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 FLAG_PRIMKEY)!=0
e1b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 ){. pTab
e1c0: 2d 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c ->aCol[i].notNul
e1d0: 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 l = OE_Abort;.
e1e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a }. }. }.
e1f0: 0a 20 20 2f 2a 20 54 68 65 20 72 65 6d 61 69 6e . /* The remain
e200: 69 6e 67 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 ing transformati
e210: 6f 6e 73 20 6f 6e 6c 79 20 61 70 70 6c 79 20 74 ons only apply t
e220: 6f 20 62 2d 74 72 65 65 20 74 61 62 6c 65 73 2c o b-tree tables,
e230: 20 6e 6f 74 20 74 6f 0a 20 20 2a 2a 20 76 69 72 not to. ** vir
e240: 74 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 tual tables */.
e250: 20 69 66 28 20 49 4e 5f 44 45 43 4c 41 52 45 5f if( IN_DECLARE_
e260: 56 54 41 42 20 29 20 72 65 74 75 72 6e 3b 0a 0a VTAB ) return;..
e270: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 /* Convert the
e280: 20 50 33 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 P3 operand of t
e290: 68 65 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 he OP_CreateBtre
e2a0: 65 20 6f 70 63 6f 64 65 20 66 72 6f 6d 20 42 54 e opcode from BT
e2b0: 52 45 45 5f 49 4e 54 4b 45 59 0a 20 20 2a 2a 20 REE_INTKEY. **
e2c0: 69 6e 74 6f 20 42 54 52 45 45 5f 42 4c 4f 42 4b into BTREE_BLOBK
e2d0: 45 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 EY.. */. if( p
e2e0: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 Parse->addrCrTab
e2f0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 ){. assert(
e300: 76 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 v );. sqlite3
e310: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 VdbeChangeP3(v,
e320: 70 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 pParse->addrCrTa
e330: 62 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 b, BTREE_BLOBKEY
e340: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 );. }.. /* Loc
e350: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 ate the PRIMARY
e360: 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 KEY index. Or,
e370: 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 77 61 if this table wa
e380: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a s originally. *
e390: 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 * an INTEGER PRI
e3a0: 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 MARY KEY table,
e3b0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 52 49 create a new PRI
e3c0: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 MARY KEY index.
e3d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 . */. if( pTab
e3e0: 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 ->iPKey>=0 ){.
e3f0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 ExprList *pLis
e400: 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b t;. Token ipk
e410: 54 6f 6b 65 6e 3b 0a 20 20 20 20 73 71 6c 69 74 Token;. sqlit
e420: 65 33 54 6f 6b 65 6e 49 6e 69 74 28 26 69 70 6b e3TokenInit(&ipk
e430: 54 6f 6b 65 6e 2c 20 70 54 61 62 2d 3e 61 43 6f Token, pTab->aCo
e440: 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a l[pTab->iPKey].z
e450: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 73 74 Name);. pList
e460: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 = sqlite3ExprLi
e470: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c stAppend(pParse,
e480: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 0, .
e490: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 sqlite3Ex
e4a0: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 prAlloc(db, TK_I
e4b0: 44 2c 20 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29 D, &ipkToken, 0)
e4c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 );. if( pList
e4d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 ==0 ) return;.
e4e0: 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f pList->a[0].so
e4f0: 72 74 4f 72 64 65 72 20 3d 20 70 50 61 72 73 65 rtOrder = pParse
e500: 2d 3e 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a ->iPkSortOrder;.
e510: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 assert( pPar
e520: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 se->pNewTable==p
e530: 54 61 62 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 Tab );. sqlit
e540: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 e3CreateIndex(pP
e550: 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 arse, 0, 0, 0, p
e560: 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79 43 List, pTab->keyC
e570: 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c onf, 0, 0, 0, 0,
e580: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
e590: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 SQLITE_I
e5a0: 44 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 DXTYPE_PRIMARYKE
e5b0: 59 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e Y);. if( db->
e5c0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 mallocFailed ||
e5d0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 pParse->nErr ) r
e5e0: 65 74 75 72 6e 3b 0a 20 20 20 20 70 50 6b 20 3d eturn;. pPk =
e5f0: 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79 4b sqlite3PrimaryK
e600: 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 eyIndex(pTab);.
e610: 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d pTab->iPKey =
e620: 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 -1;. }else{.
e630: 20 20 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 pPk = sqlite3P
e640: 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 rimaryKeyIndex(p
e650: 54 61 62 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 Tab);.. /*.
e660: 20 20 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 ** Remove all
e670: 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e redundant column
e680: 73 20 66 72 6f 6d 20 74 68 65 20 50 52 49 4d 41 s from the PRIMA
e690: 52 59 20 4b 45 59 2e 20 20 46 6f 72 20 65 78 61 RY KEY. For exa
e6a0: 6d 70 6c 65 2c 20 63 68 61 6e 67 65 0a 20 20 20 mple, change.
e6b0: 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b 45 59 ** "PRIMARY KEY
e6c0: 28 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63 2c 64 (a,b,a,b,c,b,c,d
e6d0: 29 22 20 69 6e 74 6f 20 6a 75 73 74 20 22 50 52 )" into just "PR
e6e0: 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 63 2c IMARY KEY(a,b,c,
e6f0: 64 29 22 2e 20 20 4c 61 74 65 72 0a 20 20 20 20 d)". Later.
e700: 2a 2a 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 ** code assumes
e710: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 the PRIMARY KEY
e720: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 65 70 65 contains no repe
e730: 61 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 ated columns..
e740: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6a */. for(i=j
e750: 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 =1; i<pPk->nKeyC
e760: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 ol; i++){.
e770: 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 50 if( hasColumn(pP
e780: 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 k->aiColumn, j,
e790: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d pPk->aiColumn[i]
e7a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 6b ) ){. pPk
e7b0: 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20 ->nColumn--;.
e7c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
e7d0: 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b pPk->aiColumn[
e7e0: 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f j++] = pPk->aiCo
e7f0: 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 7d lumn[i];. }
e800: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e . }. pPk->
e810: 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b 0a 20 20 7d nKeyCol = j;. }
e820: 0a 20 20 61 73 73 65 72 74 28 20 70 50 6b 21 3d . assert( pPk!=
e830: 30 20 29 3b 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 0 );. pPk->isCo
e840: 76 65 72 69 6e 67 20 3d 20 31 3b 0a 20 20 69 66 vering = 1;. if
e850: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f ( !db->init.impo
e860: 73 74 65 72 54 61 62 6c 65 20 29 20 70 50 6b 2d sterTable ) pPk-
e870: 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 >uniqNotNull = 1
e880: 3b 0a 20 20 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e ;. nPk = pPk->n
e890: 4b 65 79 43 6f 6c 3b 0a 0a 20 20 2f 2a 20 42 79 KeyCol;.. /* By
e8a0: 70 61 73 73 20 74 68 65 20 63 72 65 61 74 69 6f pass the creatio
e8b0: 6e 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 n of the PRIMARY
e8c0: 20 4b 45 59 20 62 74 72 65 65 20 61 6e 64 20 74 KEY btree and t
e8d0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 he sqlite_master
e8e0: 0a 20 20 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 . ** table entr
e8f0: 79 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 y. This is only
e900: 72 65 71 75 69 72 65 64 20 69 66 20 63 75 72 72 required if curr
e910: 65 6e 74 6c 79 20 67 65 6e 65 72 61 74 69 6e 67 ently generating
e920: 20 56 44 42 45 0a 20 20 2a 2a 20 63 6f 64 65 20 VDBE. ** code
e930: 66 6f 72 20 61 20 43 52 45 41 54 45 20 54 41 42 for a CREATE TAB
e940: 4c 45 20 28 6e 6f 74 20 77 68 65 6e 20 70 61 72 LE (not when par
e950: 73 69 6e 67 20 6f 6e 65 20 61 73 20 70 61 72 74 sing one as part
e960: 20 6f 66 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a of reading. **
e970: 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68 65 a database sche
e980: 6d 61 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 76 ma). */. if( v
e990: 20 26 26 20 70 50 6b 2d 3e 74 6e 75 6d 3e 30 20 && pPk->tnum>0
e9a0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 ){. assert( d
e9b0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 b->init.busy==0
e9c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 );. sqlite3Vd
e9d0: 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 beChangeOpcode(v
e9e0: 2c 20 70 50 6b 2d 3e 74 6e 75 6d 2c 20 4f 50 5f , pPk->tnum, OP_
e9f0: 47 6f 74 6f 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a Goto);. }.. /*
ea00: 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f The root page o
ea10: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 f the PRIMARY KE
ea20: 59 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 72 Y is the table r
ea30: 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 70 50 oot page */. pP
ea40: 6b 2d 3e 74 6e 75 6d 20 3d 20 70 54 61 62 2d 3e k->tnum = pTab->
ea50: 74 6e 75 6d 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 tnum;.. /* Upda
ea60: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 te the in-memory
ea70: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 representation
ea80: 6f 66 20 61 6c 6c 20 55 4e 49 51 55 45 20 69 6e of all UNIQUE in
ea90: 64 69 63 65 73 20 62 79 20 63 6f 6e 76 65 72 74 dices by convert
eaa0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e ing. ** the fin
eab0: 61 6c 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 20 al rowid column
eac0: 69 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 into one or more
ead0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 columns of the
eae0: 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 20 20 2a PRIMARY KEY.. *
eaf0: 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 /. for(pIdx=pTa
eb00: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b b->pIndex; pIdx;
eb10: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 pIdx=pIdx->pNex
eb20: 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 t){. int n;.
eb30: 20 20 20 69 66 28 20 49 73 50 72 69 6d 61 72 79 if( IsPrimary
eb40: 4b 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 29 KeyIndex(pIdx) )
eb50: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 continue;. f
eb60: 6f 72 28 69 3d 6e 3d 30 3b 20 69 3c 6e 50 6b 3b or(i=n=0; i<nPk;
eb70: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 i++){. if(
eb80: 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 !hasColumn(pIdx
eb90: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 ->aiColumn, pIdx
eba0: 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e ->nKeyCol, pPk->
ebb0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 20 6e aiColumn[i]) ) n
ebc0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 ++;. }. if
ebd0: 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 ( n==0 ){.
ebe0: 2f 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 73 /* This index is
ebf0: 20 61 20 73 75 70 65 72 73 65 74 20 6f 66 20 74 a superset of t
ec00: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a he primary key *
ec10: 2f 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 6e 43 /. pIdx->nC
ec20: 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 6e 4b olumn = pIdx->nK
ec30: 65 79 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e eyCol;. con
ec40: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 tinue;. }.
ec50: 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78 if( resizeIndex
ec60: 4f 62 6a 65 63 74 28 64 62 2c 20 70 49 64 78 2c Object(db, pIdx,
ec70: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e pIdx->nKeyCol+n
ec80: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 ) ) return;.
ec90: 66 6f 72 28 69 3d 30 2c 20 6a 3d 70 49 64 78 2d for(i=0, j=pIdx-
eca0: 3e 6e 4b 65 79 43 6f 6c 3b 20 69 3c 6e 50 6b 3b >nKeyCol; i<nPk;
ecb0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 i++){. if(
ecc0: 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 49 64 78 !hasColumn(pIdx
ecd0: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 70 49 64 78 ->aiColumn, pIdx
ece0: 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 70 50 6b 2d 3e ->nKeyCol, pPk->
ecf0: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29 20 29 7b 0a aiColumn[i]) ){.
ed00: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 pIdx->ai
ed10: 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d 20 70 50 6b 2d Column[j] = pPk-
ed20: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 >aiColumn[i];.
ed30: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f pIdx->azCo
ed40: 6c 6c 5b 6a 5d 20 3d 20 70 50 6b 2d 3e 61 7a 43 ll[j] = pPk->azC
ed50: 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 oll[i];.
ed60: 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 j++;. }.
ed70: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 }. assert( p
ed80: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 70 49 Idx->nColumn>=pI
ed90: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2b 6e 20 29 3b dx->nKeyCol+n );
eda0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 . assert( pId
edb0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6a 20 29 3b x->nColumn>=j );
edc0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 61 . }.. /* Add a
edd0: 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 ll table columns
ede0: 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59 20 to the PRIMARY
edf0: 4b 45 59 20 69 6e 64 65 78 0a 20 20 2a 2f 0a 20 KEY index. */.
ee00: 20 69 66 28 20 6e 50 6b 3c 70 54 61 62 2d 3e 6e if( nPk<pTab->n
ee10: 43 6f 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 72 Col ){. if( r
ee20: 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 esizeIndexObject
ee30: 28 64 62 2c 20 70 50 6b 2c 20 70 54 61 62 2d 3e (db, pPk, pTab->
ee40: 6e 43 6f 6c 29 20 29 20 72 65 74 75 72 6e 3b 0a nCol) ) return;.
ee50: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d 6e for(i=0, j=n
ee60: 50 6b 3b 20 69 3c 70 54 61 62 2d 3e 6e 43 6f 6c Pk; i<pTab->nCol
ee70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 ; i++){. if
ee80: 28 20 21 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b ( !hasColumn(pPk
ee90: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 69 ->aiColumn, j, i
eea0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 ) ){. ass
eeb0: 65 72 74 28 20 6a 3c 70 50 6b 2d 3e 6e 43 6f 6c ert( j<pPk->nCol
eec0: 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 umn );. p
eed0: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 Pk->aiColumn[j]
eee0: 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 70 50 6b = i;. pPk
eef0: 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 73 71 ->azColl[j] = sq
ef00: 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a lite3StrBINARY;.
ef10: 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 j++;.
ef20: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 }. }. a
ef30: 73 73 65 72 74 28 20 70 50 6b 2d 3e 6e 43 6f 6c ssert( pPk->nCol
ef40: 75 6d 6e 3d 3d 6a 20 29 3b 0a 20 20 20 20 61 73 umn==j );. as
ef50: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c sert( pTab->nCol
ef60: 3d 3d 6a 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a ==j );. }else{.
ef70: 20 20 20 20 70 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e pPk->nColumn
ef80: 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 = pTab->nCol;.
ef90: 20 7d 0a 20 20 72 65 63 6f 6d 70 75 74 65 43 6f }. recomputeCo
efa0: 6c 75 6d 6e 73 4e 6f 74 49 6e 64 65 78 65 64 28 lumnsNotIndexed(
efb0: 70 50 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 pPk);.}../*.** T
efc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 his routine is c
efd0: 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 alled to report
efe0: 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 the final ")" th
eff0: 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a at terminates.**
f000: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 a CREATE TABLE
f010: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a statement..**.**
f020: 20 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 The table struc
f030: 74 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 ture that other
f040: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 action routines
f050: 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 have been buildi
f060: 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 ng.** is added t
f070: 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 o the internal h
f080: 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 ash tables, assu
f090: 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 ming no errors h
f0a0: 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e ave.** occurred.
f0b0: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 .**.** An entry
f0c0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 for the table is
f0d0: 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 made in the mas
f0e0: 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 ter table on dis
f0f0: 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 k, unless.** thi
f100: 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 s is a temporary
f110: 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e table or db->in
f120: 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 it.busy==1. Whe
f130: 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d n db->init.busy=
f140: 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 =1.** it means w
f150: 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 e are reading th
f160: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 e sqlite_master
f170: 74 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 table because we
f180: 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 just.** connect
f190: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 ed to the databa
f1a0: 73 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 se or because th
f1b0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 e sqlite_master
f1c0: 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 table has.** rec
f1d0: 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 ently changed, s
f1e0: 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 o the entry for
f1f0: 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 this table alrea
f200: 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 dy exists in.**
f210: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 the sqlite_maste
f220: 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 r table. We do
f230: 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 not want to crea
f240: 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a te it again..**.
f250: 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 ** If the pSelec
f260: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f t argument is no
f270: 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 t NULL, it means
f280: 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 that this routi
f290: 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 ne.** was called
f2a0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 to create a tab
f2b0: 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f le generated fro
f2c0: 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 m a .** "CREATE
f2d0: 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c TABLE ... AS SEL
f2e0: 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 ECT ..." stateme
f2f0: 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 nt. The column
f300: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 names of.** the
f310: 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d new table will m
f320: 61 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 atch the result
f330: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 set of the SELEC
f340: 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 T..*/.void sqlit
f350: 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 e3EndTable(. Pa
f360: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 rse *pParse,
f370: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 /* Parse c
f380: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 ontext */. Toke
f390: 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 n *pCons,
f3a0: 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 /* The ',' t
f3b0: 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c oken after the l
f3c0: 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e ast column defn.
f3d0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e */. Token *pEn
f3e0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a d, /*
f3f0: 20 54 68 65 20 27 29 27 20 62 65 66 6f 72 65 20 The ')' before
f400: 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 43 options in the C
f410: 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f 0a 20 REATE TABLE */.
f420: 20 75 38 20 74 61 62 4f 70 74 73 2c 20 20 20 20 u8 tabOpts,
f430: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 /* Extr
f440: 61 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 73 2e a table options.
f450: 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f 0a 20 Usually 0. */.
f460: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 Select *pSelect
f470: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 6c 65 /* Sele
f480: 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45 41 54 ct from a "CREAT
f490: 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54 22 E ... AS SELECT"
f4a0: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a */.){. Table *
f4b0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 p;
f4c0: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 74 61 /* The new ta
f4d0: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 ble */. sqlite3
f4e0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 *db = pParse->d
f4f0: 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 b; /* The databa
f500: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f se connection */
f510: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 . int iDb;
f520: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
f530: 44 61 74 61 62 61 73 65 20 69 6e 20 77 68 69 63 Database in whic
f540: 68 20 74 68 65 20 74 61 62 6c 65 20 6c 69 76 65 h the table live
f550: 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 s */. Index *pI
f560: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 dx;
f570: 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64 20 69 /* An implied i
f580: 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c ndex of the tabl
f590: 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 6e 64 e */.. if( pEnd
f5a0: 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d ==0 && pSelect==
f5b0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0 ){. return;
f5c0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 . }. assert( !
f5d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 db->mallocFailed
f5e0: 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 );. p = pParse
f5f0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 ->pNewTable;. i
f600: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e f( p==0 ) return
f610: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 ;.. /* If the d
f620: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 b->init.busy is
f630: 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 1 it means we ar
f640: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 e reading the SQ
f650: 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 L off the. ** "
f660: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f sqlite_master" o
f670: 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d r "sqlite_temp_m
f680: 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 aster" table on
f690: 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 the disk.. ** S
f6a0: 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 o do not write t
f6b0: 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e o the disk again
f6c0: 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20 72 . Extract the r
f6d0: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a oot page number.
f6e0: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 ** for the tab
f6f0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e le from the db->
f700: 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 init.newTnum fie
f710: 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e ld. (The page n
f720: 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c umber. ** shoul
f730: 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 d have been put
f740: 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71 6c there by the sql
f750: 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e iteOpenCb routin
f760: 65 2e 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 e.). **. ** If
f770: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e the root page n
f780: 75 6d 62 65 72 20 69 73 20 31 2c 20 74 68 61 74 umber is 1, that
f790: 20 6d 65 61 6e 73 20 74 68 69 73 20 69 73 20 74 means this is t
f7a0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 he sqlite_master
f7b0: 0a 20 20 2a 2a 20 74 61 62 6c 65 20 69 74 73 65 . ** table itse
f7c0: 6c 66 2e 20 20 53 6f 20 6d 61 72 6b 20 69 74 20 lf. So mark it
f7d0: 72 65 61 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a read-only.. */.
f7e0: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 if( db->init.b
f7f0: 75 73 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 usy ){. if( p
f800: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 Select ){.
f810: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 sqlite3ErrorMsg(
f820: 70 50 61 72 73 65 2c 20 22 22 29 3b 0a 20 20 20 pParse, "");.
f830: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d return;. }
f840: 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64 . p->tnum = d
f850: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b b->init.newTnum;
f860: 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 6e 75 6d . if( p->tnum
f870: 3d 3d 31 20 29 20 70 2d 3e 74 61 62 46 6c 61 67 ==1 ) p->tabFlag
f880: 73 20 7c 3d 20 54 46 5f 52 65 61 64 6f 6e 6c 79 s |= TF_Readonly
f890: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65 63 ;. }.. /* Spec
f8a0: 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20 66 ial processing f
f8b0: 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 or WITHOUT ROWID
f8c0: 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66 28 Tables */. if(
f8d0: 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f 57 69 tabOpts & TF_Wi
f8e0: 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20 20 thoutRowid ){.
f8f0: 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 if( (p->tabFla
f900: 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 gs & TF_Autoincr
f910: 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 ement) ){.
f920: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 sqlite3ErrorMsg(
f930: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 pParse,.
f940: 20 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 "AUTOINCREMENT
f950: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 not allowed on
f960: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 WITHOUT ROWID ta
f970: 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 72 65 bles");. re
f980: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 turn;. }.
f990: 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 if( (p->tabFlags
f9a0: 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 & TF_HasPrimary
f9b0: 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 Key)==0 ){.
f9c0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 sqlite3ErrorMsg
f9d0: 28 70 50 61 72 73 65 2c 20 22 50 52 49 4d 41 52 (pParse, "PRIMAR
f9e0: 59 20 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f 6e Y KEY missing on
f9f0: 20 74 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e 7a table %s", p->z
fa00: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 Name);. }else
fa10: 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61 62 46 6c {. p->tabFl
fa20: 61 67 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f 75 ags |= TF_Withou
fa30: 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e 6f 56 69 tRowid | TF_NoVi
fa40: 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20 20 sibleRowid;.
fa50: 20 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68 6f convertToWitho
fa60: 75 74 52 6f 77 69 64 54 61 62 6c 65 28 70 50 61 utRowidTable(pPa
fa70: 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 rse, p);. }.
fa80: 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 }.. iDb = sqli
fa90: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 te3SchemaToIndex
faa0: 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 (db, p->pSchema)
fab0: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 ;..#ifndef SQLIT
fac0: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 2f E_OMIT_CHECK. /
fad0: 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 * Resolve names
fae0: 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f 6e in all CHECK con
faf0: 73 74 72 61 69 6e 74 20 65 78 70 72 65 73 73 69 straint expressi
fb00: 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 ons.. */. if(
fb10: 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 p->pCheck ){.
fb20: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 sqlite3ResolveS
fb30: 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 elfReference(pPa
fb40: 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68 65 rse, p, NC_IsChe
fb50: 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63 6b ck, 0, p->pCheck
fb60: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a );. }.#endif /*
fb70: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 !defined(SQLITE
fb80: 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a _OMIT_CHECK) */.
fb90: 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20 74 . /* Estimate t
fba0: 68 65 20 61 76 65 72 61 67 65 20 72 6f 77 20 73 he average row s
fbb0: 69 7a 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c ize for the tabl
fbc0: 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69 6d e and for all im
fbd0: 70 6c 69 65 64 20 69 6e 64 69 63 65 73 20 2a 2f plied indices */
fbe0: 0a 20 20 65 73 74 69 6d 61 74 65 54 61 62 6c 65 . estimateTable
fbf0: 57 69 64 74 68 28 70 29 3b 0a 20 20 66 6f 72 28 Width(p);. for(
fc00: 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 pIdx=p->pIndex;
fc10: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d pIdx; pIdx=pIdx-
fc20: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 65 73 74 >pNext){. est
fc30: 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 imateIndexWidth(
fc40: 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a pIdx);. }.. /*
fc50: 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 If not initiali
fc60: 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 zing, then creat
fc70: 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 e a record for t
fc80: 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a he new table. *
fc90: 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f * in the SQLITE_
fca0: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 MASTER table of
fcb0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 the database..
fcc0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 **. ** If this
fcd0: 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 is a TEMPORARY t
fce0: 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 able, write the
fcf0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 entry into the a
fd00: 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 uxiliary. ** fi
fd10: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e le instead of in
fd20: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 to the main data
fd30: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a base file.. */.
fd40: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e if( !db->init.
fd50: 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 busy ){. int
fd60: 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a n;. Vdbe *v;.
fd70: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b char *zType;
fd80: 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 /* "view" or
fd90: 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 "table" */.
fda0: 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 char *zType2;
fdb0: 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 /* "VIEW" or "TA
fdc0: 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 BLE" */. char
fdd0: 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 *zStmt; /* T
fde0: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 ext of the CREAT
fdf0: 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 E TABLE or CREAT
fe00: 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 E VIEW statement
fe10: 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c */.. v = sql
fe20: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 ite3GetVdbe(pPar
fe30: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 se);. if( NEV
fe40: 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 ER(v==0) ) retur
fe50: 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 n;.. sqlite3V
fe60: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f dbeAddOp1(v, OP_
fe70: 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 Close, 0);..
fe80: 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 /* . ** Initi
fe90: 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 alize zType for
fea0: 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20 the new view or
feb0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 table.. */.
fec0: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 if( p->pSelect
fed0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 ==0 ){. /*
fee0: 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 A regular table
fef0: 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d */. zType =
ff00: 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 "table";.
ff10: 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 zType2 = "TABLE"
ff20: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 ;.#ifndef SQLITE
ff30: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d _OMIT_VIEW. }
ff40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 else{. /* A
ff50: 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a view */. z
ff60: 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 Type = "view";.
ff70: 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 zType2 = "V
ff80: 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 IEW";.#endif.
ff90: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 }.. /* If th
ffa0: 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54 is is a CREATE T
ffb0: 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 ABLE xx AS SELEC
ffc0: 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 T ..., execute t
ffd0: 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a he SELECT. **
ffe0: 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f statement to po
fff0: 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 pulate the new t
10000 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 able. The root-p
10010 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 age number for t
10020 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 he. ** new ta
10030 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69 73 74 ble is in regist
10040 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f er pParse->regRo
10050 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a ot.. **. *
10060 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 * Once the SELEC
10070 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 T has been coded
10080 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 by sqlite3Selec
10090 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a t(), it is in a.
100a0 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 ** suitable
100b0 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 state to query f
100c0 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 or the column na
100d0 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f mes and types to
100e0 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 be used. **
100f0 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 by the new table
10100 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 .. **. **
10110 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77 A shared-cache w
10120 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 rite-lock is not
10130 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 required to wri
10140 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61 te to the new ta
10150 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 ble,. ** as a
10160 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 schema-lock mus
10170 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 t have already b
10180 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 een obtained to
10190 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65 create it. Since
101a0 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 . ** a schema
101b0 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61 -lock excludes a
101c0 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 ll other databas
101d0 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69 e users, the wri
101e0 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 te-lock would.
101f0 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e ** be redundan
10200 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 t.. */. if
10210 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 ( pSelect ){.
10220 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 SelectDest de
10230 73 74 3b 20 20 20 20 2f 2a 20 57 68 65 72 65 20 st; /* Where
10240 74 68 65 20 53 45 4c 45 43 54 20 73 68 6f 75 6c the SELECT shoul
10250 64 20 73 74 6f 72 65 20 72 65 73 75 6c 74 73 20 d store results
10260 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 */. int reg
10270 59 69 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20 Yield; /*
10280 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 Register holding
10290 20 63 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74 72 co-routine entr
102a0 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 y-point */.
102b0 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 int addrTop;
102c0 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 /* Top of t
102d0 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a 2f he co-routine */
102e0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52 65 . int regRe
102f0 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 c; /* A
10300 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e 73 record to be ins
10310 65 72 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 ert into the new
10320 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 table */.
10330 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20 20 20 int regRowid;
10340 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66 20 /* Rowid of
10350 74 68 65 20 6e 65 78 74 20 72 6f 77 20 74 6f 20 the next row to
10360 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 20 20 insert */.
10370 69 6e 74 20 61 64 64 72 49 6e 73 4c 6f 6f 70 3b int addrInsLoop;
10380 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 /* Top of th
10390 65 20 6c 6f 6f 70 20 66 6f 72 20 69 6e 73 65 72 e loop for inser
103a0 74 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20 20 ting rows */.
103b0 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 Table *pSelTa
103c0 62 3b 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c b; /* A tabl
103d0 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 e that describes
103e0 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73 75 the SELECT resu
103f0 6c 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72 65 lts */.. re
10400 67 59 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72 73 gYield = ++pPars
10410 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 e->nMem;. r
10420 65 67 52 65 63 20 3d 20 2b 2b 70 50 61 72 73 65 egRec = ++pParse
10430 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 ->nMem;. re
10440 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 gRowid = ++pPars
10450 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 61 e->nMem;. a
10460 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 ssert(pParse->nT
10470 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 ab==1);. sq
10480 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 lite3MayAbort(pP
10490 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c arse);. sql
104a0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 ite3VdbeAddOp3(v
104b0 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 , OP_OpenWrite,
104c0 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 1, pParse->regRo
104d0 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 ot, iDb);.
104e0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 sqlite3VdbeChang
104f0 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50 32 eP5(v, OPFLAG_P2
10500 49 53 52 45 47 29 3b 0a 20 20 20 20 20 20 70 50 ISREG);. pP
10510 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b 0a arse->nTab = 2;.
10520 20 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20 addrTop =
10530 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 sqlite3VdbeCurre
10540 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a 20 ntAddr(v) + 1;.
10550 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 sqlite3Vdbe
10560 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 69 AddOp3(v, OP_Ini
10570 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 tCoroutine, regY
10580 69 65 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f 70 ield, 0, addrTop
10590 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 );. if( pPa
105a0 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 rse->nErr ) retu
105b0 72 6e 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 rn;. pSelTa
105c0 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c b = sqlite3Resul
105d0 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 tSetOfSelect(pPa
105e0 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 rse, pSelect);.
105f0 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 if( pSelTab
10600 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 ==0 ) return;.
10610 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 assert( p->a
10620 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 Col==0 );.
10630 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 p->nCol = pSelTa
10640 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 b->nCol;. p
10650 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 ->aCol = pSelTab
10660 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 ->aCol;. pS
10670 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b elTab->nCol = 0;
10680 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e . pSelTab->
10690 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 aCol = 0;.
106a0 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 sqlite3DeleteTab
106b0 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b le(db, pSelTab);
106c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 . sqlite3Se
106d0 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 lectDestInit(&de
106e0 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75 74 69 6e st, SRT_Coroutin
106f0 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 e, regYield);.
10700 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 sqlite3Selec
10710 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 t(pParse, pSelec
10720 74 2c 20 26 64 65 73 74 29 3b 0a 20 20 20 20 20 t, &dest);.
10730 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 if( pParse->nEr
10740 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 r ) return;.
10750 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 sqlite3VdbeEnd
10760 43 6f 72 6f 75 74 69 6e 65 28 76 2c 20 72 65 67 Coroutine(v, reg
10770 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 Yield);. sq
10780 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 lite3VdbeJumpHer
10790 65 28 76 2c 20 61 64 64 72 54 6f 70 20 2d 20 31 e(v, addrTop - 1
107a0 29 3b 0a 20 20 20 20 20 20 61 64 64 72 49 6e 73 );. addrIns
107b0 4c 6f 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 Loop = sqlite3Vd
107c0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 beAddOp1(v, OP_Y
107d0 69 65 6c 64 2c 20 64 65 73 74 2e 69 53 44 50 61 ield, dest.iSDPa
107e0 72 6d 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 rm);. VdbeC
107f0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 overage(v);.
10800 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 sqlite3VdbeAdd
10810 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 Op3(v, OP_MakeRe
10820 63 6f 72 64 2c 20 64 65 73 74 2e 69 53 64 73 74 cord, dest.iSdst
10830 2c 20 64 65 73 74 2e 6e 53 64 73 74 2c 20 72 65 , dest.nSdst, re
10840 67 52 65 63 29 3b 0a 20 20 20 20 20 20 73 71 6c gRec);. sql
10850 69 74 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 ite3TableAffinit
10860 79 28 76 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 y(v, p, 0);.
10870 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 sqlite3VdbeAdd
10880 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 Op2(v, OP_NewRow
10890 69 64 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29 id, 1, regRowid)
108a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 ;. sqlite3V
108b0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f dbeAddOp3(v, OP_
108c0 49 6e 73 65 72 74 2c 20 31 2c 20 72 65 67 52 65 Insert, 1, regRe
108d0 63 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 c, regRowid);.
108e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 sqlite3VdbeG
108f0 6f 74 6f 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f oto(v, addrInsLo
10900 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 op);. sqlit
10910 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 e3VdbeJumpHere(v
10920 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a , addrInsLoop);.
10930 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 sqlite3Vdb
10940 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c eAddOp1(v, OP_Cl
10950 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a ose, 1);. }..
10960 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 /* Compute t
10970 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 he complete text
10980 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73 of the CREATE s
10990 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 tatement */.
109a0 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 if( pSelect ){.
109b0 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 zStmt = cre
109c0 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c ateTableStmt(db,
109d0 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a p);. }else{.
109e0 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e Token *pEn
109f0 64 32 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26 d2 = tabOpts ? &
10a00 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b pParse->sLastTok
10a10 65 6e 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20 en : pEnd;.
10a20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32 n = (int)(pEnd2
10a30 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e ->z - pParse->sN
10a40 61 6d 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 ameToken.z);.
10a50 20 20 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b if( pEnd2->z[
10a60 30 5d 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70 0]!=';' ) n += p
10a70 45 6e 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a End2->n;. z
10a80 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 Stmt = sqlite3MP
10a90 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 rintf(db, .
10aa0 20 20 20 20 20 22 43 52 45 41 54 45 20 25 73 20 "CREATE %s
10ab0 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e %.*s", zType2, n
10ac0 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 , pParse->sNameT
10ad0 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a oken.z. );.
10ae0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 }.. /* A
10af0 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 slot for the rec
10b00 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 ord has already
10b10 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 been allocated i
10b20 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 n the . ** SQ
10b30 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c LITE_MASTER tabl
10b40 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 e. We just need
10b50 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 to update that
10b60 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 slot with all.
10b70 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 ** the informa
10b80 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 tion we've colle
10b90 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 cted.. */.
10ba0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 sqlite3NestedPa
10bb0 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 rse(pParse,.
10bc0 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 "UPDATE %Q.%s
10bd0 22 0a 20 20 20 20 20 20 20 20 20 22 53 45 54 20 ". "SET
10be0 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d type='%s', name=
10bf0 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c %Q, tbl_name=%Q,
10c00 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 rootpage=#%d, s
10c10 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 ql=%Q ". "
10c20 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 WHERE rowid=#%d"
10c30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b ,. db->aDb[
10c40 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 2c 20 4d iDb].zDbSName, M
10c50 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 20 20 20 ASTER_NAME,.
10c60 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 zType,. p
10c70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 ->zName,. p
10c80 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 ->zName,. p
10c90 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a Parse->regRoot,.
10ca0 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 zStmt,.
10cb0 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f pParse->regRo
10cc0 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 wid. );. s
10cd0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
10ce0 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c zStmt);. sql
10cf0 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 ite3ChangeCookie
10d00 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a (pParse, iDb);..
10d10 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
10d20 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e MIT_AUTOINCREMEN
10d30 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 T. /* Check t
10d40 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 o see if we need
10d50 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 to create an sq
10d60 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 lite_sequence ta
10d70 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b ble for. ** k
10d80 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 eeping track of
10d90 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 autoincrement ke
10da0 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 ys.. */. i
10db0 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67 73 20 f( (p->tabFlags
10dc0 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 & TF_Autoincreme
10dd0 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 nt)!=0 ){.
10de0 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 Db *pDb = &db->a
10df0 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 61 Db[iDb];. a
10e00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 ssert( sqlite3Sc
10e10 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 hemaMutexHeld(db
10e20 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 , iDb, 0) );.
10e30 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 if( pDb->pSch
10e40 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 ema->pSeqTab==0
10e50 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 ){. sqlit
10e60 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 e3NestedParse(pP
10e70 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 arse,.
10e80 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 "CREATE TABLE %Q
10e90 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 .sqlite_sequence
10ea0 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 (name,seq)",.
10eb0 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 62 53 pDb->zDbS
10ec0 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a Name. );.
10ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 }. }.#e
10ee0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 ndif.. /* Rep
10ef0 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 arse everything
10f00 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e to update our in
10f10 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 ternal data stru
10f20 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 ctures */. sq
10f30 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 lite3VdbeAddPars
10f40 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 44 62 eSchemaOp(v, iDb
10f50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73 71 6c ,. sql
10f60 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 ite3MPrintf(db,
10f70 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 20 41 "tbl_name='%q' A
10f80 4e 44 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 ND type!='trigge
10f90 72 27 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29 29 3b r'", p->zName));
10fa0 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 . }... /* Add
10fb0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 the table to the
10fc0 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 in-memory repre
10fd0 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 sentation of the
10fe0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a database.. */.
10ff0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 if( db->init.b
11000 75 73 79 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 usy ){. Table
11010 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65 *pOld;. Sche
11020 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d ma *pSchema = p-
11030 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 >pSchema;. as
11040 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 sert( sqlite3Sch
11050 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c emaMutexHeld(db,
11060 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 iDb, 0) );.
11070 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 pOld = sqlite3Ha
11080 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d shInsert(&pSchem
11090 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a a->tblHash, p->z
110a0 4e 61 6d 65 2c 20 70 29 3b 0a 20 20 20 20 69 66 Name, p);. if
110b0 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 ( pOld ){.
110c0 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 assert( p==pOld
110d0 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 ); /* Malloc mu
110e0 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 69 st have failed i
110f0 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72 74 nside HashInsert
11100 28 29 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 () */. sqli
11110 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b te3OomFault(db);
11120 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 . return;.
11130 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d }. pParse-
11140 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a >pNewTable = 0;.
11150 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 db->mDbFlags
11160 20 7c 3d 20 44 42 46 4c 41 47 5f 53 63 68 65 6d |= DBFLAG_Schem
11170 61 43 68 61 6e 67 65 3b 0a 0a 23 69 66 6e 64 65 aChange;..#ifnde
11180 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c f SQLITE_OMIT_AL
11190 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69 66 28 TERTABLE. if(
111a0 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a !p->pSelect ){.
111b0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 const char
111c0 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 *zName = (const
111d0 20 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e char *)pParse->
111e0 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 sNameToken.z;.
111f0 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 int nName;.
11200 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 assert( !pS
11210 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73 20 26 elect && pCons &
11220 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 & pEnd );.
11230 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 if( pCons->z==0
11240 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6e 73 ){. pCons
11250 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d = pEnd;. }
11260 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 . nName = (
11270 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68 61 72 int)((const char
11280 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e *)pCons->z - zN
11290 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 ame);. p->a
112a0 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 ddColOffset = 13
112b0 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 + sqlite3Utf8Ch
112c0 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 arLen(zName, nNa
112d0 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 me);. }.#endi
112e0 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 f. }.}..#ifndef
112f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 SQLITE_OMIT_VIE
11300 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 W./*.** The pars
11310 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f er calls this ro
11320 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 utine in order t
11330 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 56 o create a new V
11340 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 IEW.*/.void sqli
11350 74 65 33 43 72 65 61 74 65 56 69 65 77 28 0a 20 te3CreateView(.
11360 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 Parse *pParse,
11370 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 /* The parsi
11380 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 ng context */.
11390 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 Token *pBegin,
113a0 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41 54 45 /* The CREATE
113b0 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65 67 69 token that begi
113c0 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 ns the statement
113d0 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 */. Token *pNa
113e0 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 me1, /* The
113f0 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 token that holds
11400 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 the name of the
11410 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e view */. Token
11420 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a *pName2, /*
11430 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 The token that
11440 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f holds the name o
11450 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 f the view */.
11460 45 78 70 72 4c 69 73 74 20 2a 70 43 4e 61 6d 65 ExprList *pCName
11470 73 2c 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 6c s, /* Optional l
11480 69 73 74 20 6f 66 20 76 69 65 77 20 63 6f 6c 75 ist of view colu
11490 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 53 65 mn names */. Se
114a0 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 lect *pSelect,
114b0 20 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 /* A SELECT sta
114c0 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c tement that will
114d0 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 become the new
114e0 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 view */. int is
114f0 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 Temp, /*
11500 54 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f TRUE for a TEMPO
11510 52 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 RARY view */. i
11520 6e 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 nt noErr
11530 20 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 /* Suppress er
11540 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 ror messages if
11550 56 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 VIEW already exi
11560 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c sts */.){. Tabl
11570 65 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 e *p;. int n;.
11580 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a const char *z;.
11590 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 Token sEnd;.
115a0 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20 DbFixer sFix;.
115b0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 Token *pName = 0
115c0 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 ;. int iDb;. s
115d0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 qlite3 *db = pPa
115e0 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 rse->db;.. if(
115f0 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 pParse->nVar>0 )
11600 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 {. sqlite3Err
11610 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 orMsg(pParse, "p
11620 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e 6f arameters are no
11630 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 t allowed in vie
11640 77 73 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 63 ws");. goto c
11650 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b reate_view_fail;
11660 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 . }. sqlite3St
11670 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c artTable(pParse,
11680 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c pName1, pName2,
11690 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e isTemp, 1, 0, n
116a0 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 oErr);. p = pPa
116b0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a rse->pNewTable;.
116c0 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 if( p==0 || pP
116d0 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 arse->nErr ) got
116e0 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 o create_view_fa
116f0 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 54 77 6f il;. sqlite3Two
11700 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c PartName(pParse,
11710 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c pName1, pName2,
11720 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 &pName);. iDb
11730 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 = sqlite3SchemaT
11740 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 oIndex(db, p->pS
11750 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 chema);. sqlite
11760 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 3FixInit(&sFix,
11770 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 pParse, iDb, "vi
11780 65 77 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 ew", pName);. i
11790 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c f( sqlite3FixSel
117a0 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 ect(&sFix, pSele
117b0 63 74 29 20 29 20 67 6f 74 6f 20 63 72 65 61 74 ct) ) goto creat
117c0 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 e_view_fail;..
117d0 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f /* Make a copy o
117e0 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c f the entire SEL
117f0 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 ECT statement th
11800 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 at defines the v
11810 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 iew.. ** This w
11820 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 ill force all th
11830 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 e Expr.token.z v
11840 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 alues to be dyna
11850 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c mically. ** all
11860 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68 ocated rather th
11870 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 an point to the
11880 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 input string - w
11890 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a hich means that.
118a0 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 ** they will p
118b0 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65 ersist after the
118c0 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 current sqlite3
118d0 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 _exec() call ret
118e0 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 urns.. */. if(
118f0 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 IN_RENAME_OBJEC
11900 54 20 29 7b 0a 20 20 20 20 70 2d 3e 70 53 65 6c T ){. p->pSel
11910 65 63 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 ect = pSelect;.
11920 20 20 20 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a pSelect = 0;.
11930 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e }else{. p->
11940 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 pSelect = sqlite
11950 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 3SelectDup(db, p
11960 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f Select, EXPRDUP_
11970 52 45 44 55 43 45 29 3b 0a 20 20 7d 0a 20 20 70 REDUCE);. }. p
11980 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 ->pCheck = sqlit
11990 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 e3ExprListDup(db
119a0 2c 20 70 43 4e 61 6d 65 73 2c 20 45 58 50 52 44 , pCNames, EXPRD
119b0 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 69 66 UP_REDUCE);. if
119c0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c ( db->mallocFail
119d0 65 64 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65 ed ) goto create
119e0 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20 2f _view_fail;.. /
119f0 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 * Locate the end
11a00 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56 of the CREATE V
11a10 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 IEW statement.
11a20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 Make sEnd point
11a30 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e to. ** the end.
11a40 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 . */. sEnd = p
11a50 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 Parse->sLastToke
11a60 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 45 6e n;. assert( sEn
11a70 64 2e 7a 5b 30 5d 21 3d 30 20 7c 7c 20 73 45 6e d.z[0]!=0 || sEn
11a80 64 2e 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 d.n==0 );. if(
11a90 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29 sEnd.z[0]!=';' )
11aa0 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20 {. sEnd.z +=
11ab0 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45 sEnd.n;. }. sE
11ac0 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20 nd.n = 0;. n =
11ad0 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70 (int)(sEnd.z - p
11ae0 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 61 73 73 Begin->z);. ass
11af0 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 7a 20 ert( n>0 );. z
11b00 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 = pBegin->z;. w
11b10 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 hile( sqlite3Iss
11b20 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 pace(z[n-1]) ){
11b30 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 n--; }. sEnd.z
11b40 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e = &z[n-1];. sEn
11b50 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 d.n = 1;.. /* U
11b60 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 se sqlite3EndTab
11b70 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68 65 20 le() to add the
11b80 76 69 65 77 20 74 6f 20 74 68 65 20 53 51 4c 49 view to the SQLI
11b90 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 TE_MASTER table
11ba0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 */. sqlite3EndT
11bb0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20 able(pParse, 0,
11bc0 26 73 45 6e 64 2c 20 30 2c 20 30 29 3b 0a 0a 63 &sEnd, 0, 0);..c
11bd0 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3a reate_view_fail:
11be0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 . sqlite3Select
11bf0 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 Delete(db, pSele
11c00 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 ct);. sqlite3Ex
11c10 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c prListDelete(db,
11c20 20 70 43 4e 61 6d 65 73 29 3b 0a 20 20 72 65 74 pCNames);. ret
11c30 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a urn;.}.#endif /*
11c40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 SQLITE_OMIT_VIE
11c50 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e W */..#if !defin
11c60 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 ed(SQLITE_OMIT_V
11c70 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 IEW) || !defined
11c80 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 (SQLITE_OMIT_VIR
11c90 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a TUALTABLE)./*.**
11ca0 20 54 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 The Table struc
11cb0 74 75 72 65 20 70 54 61 62 6c 65 20 69 73 20 72 ture pTable is r
11cc0 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20 20 46 eally a VIEW. F
11cd0 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 ill in the names
11ce0 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d of.** the colum
11cf0 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77 20 69 ns of the view i
11d00 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73 74 72 n the pTable str
11d10 75 63 74 75 72 65 2e 20 20 52 65 74 75 72 6e 20 ucture. Return
11d20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 the number.** of
11d30 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 errors. If an
11d40 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 error is seen le
11d50 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 ave an error mes
11d60 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e sage in pParse->
11d70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 zErrMsg..*/.int
11d80 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f sqlite3ViewGetCo
11d90 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 lumnNames(Parse
11da0 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a *pParse, Table *
11db0 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 pTable){. Table
11dc0 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 *pSelTab; /*
11dd0 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66 72 6f A fake table fro
11de0 6d 20 77 68 69 63 68 20 77 65 20 67 65 74 20 74 m which we get t
11df0 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f he result set */
11e00 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b . Select *pSel;
11e10 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 /* Copy of
11e20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61 74 20 the SELECT that
11e30 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 implements the v
11e40 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 iew */. int nEr
11e50 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 r = 0; /* Nu
11e60 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 65 mber of errors e
11e70 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 ncountered */.
11e80 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 int n;
11e90 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 /* Temporarily
11ea0 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 holds the numbe
11eb0 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61 73 73 r of cursors ass
11ec0 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 igned */. sqlit
11ed0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d e3 *db = pParse-
11ee0 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 >db; /* Databas
11ef0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 e connection for
11f00 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a malloc errors *
11f10 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 /.#ifndef SQLITE
11f20 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 _OMIT_VIRTUALTAB
11f30 4c 45 0a 20 20 69 6e 74 20 72 63 3b 0a 23 65 6e LE. int rc;.#en
11f40 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 dif.#ifndef SQLI
11f50 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a TE_OMIT_AUTHORIZ
11f60 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f ATION. sqlite3_
11f70 78 61 75 74 68 20 78 41 75 74 68 3b 20 20 20 20 xauth xAuth;
11f80 20 20 20 2f 2a 20 53 61 76 65 64 20 78 41 75 74 /* Saved xAut
11f90 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 23 65 6e h pointer */.#en
11fa0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 dif.. assert( p
11fb0 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 Table );..#ifnde
11fc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 f SQLITE_OMIT_VI
11fd0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 64 62 2d RTUALTABLE. db-
11fe0 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b 2b 2b 3b 0a >nSchemaLock++;.
11ff0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 rc = sqlite3Vt
12000 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 abCallConnect(pP
12010 61 72 73 65 2c 20 70 54 61 62 6c 65 29 3b 0a 20 arse, pTable);.
12020 20 64 62 2d 3e 6e 53 63 68 65 6d 61 4c 6f 63 6b db->nSchemaLock
12030 2d 2d 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a --;. if( rc ){.
12040 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 return 1;.
12050 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 }. if( IsVirtua
12060 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65 74 75 l(pTable) ) retu
12070 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 rn 0;.#endif..#i
12080 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 fndef SQLITE_OMI
12090 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70 6f T_VIEW. /* A po
120a0 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61 6e sitive nCol mean
120b0 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 s the columns na
120c0 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69 65 mes for this vie
120d0 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65 61 w are. ** alrea
120e0 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 dy known.. */.
120f0 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f if( pTable->nCo
12100 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a l>0 ) return 0;.
12110 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76 65 . /* A negative
12120 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63 69 nCol is a speci
12130 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69 6e al marker meanin
12140 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63 75 g that we are cu
12150 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72 79 rrently. ** try
12160 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 ing to compute t
12170 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e he column names.
12180 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74 68 If we enter th
12190 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 0a is routine with.
121a0 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65 20 ** a negative
121b0 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74 nCol, it means t
121c0 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77 73 wo or more views
121d0 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 form a loop, li
121e0 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 ke this:. **.
121f0 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 ** CREATE VI
12200 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43 54 EW one AS SELECT
12210 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a * FROM two;. *
12220 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49 45 * CREATE VIE
12230 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54 20 W two AS SELECT
12240 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a * FROM one;. **
12250 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c 20 . ** Actually,
12260 74 68 65 20 65 72 72 6f 72 20 61 62 6f 76 65 20 the error above
12270 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 70 72 is now caught pr
12280 69 6f 72 20 74 6f 20 72 65 61 63 68 69 6e 67 20 ior to reaching
12290 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20 2a 2a this point.. **
122a0 20 42 75 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 But the followi
122b0 6e 67 20 74 65 73 74 20 69 73 20 73 74 69 6c 6c ng test is still
122c0 20 69 6d 70 6f 72 74 61 6e 74 20 61 73 20 69 74 important as it
122d0 20 64 6f 65 73 20 63 6f 6d 65 20 75 70 0a 20 20 does come up.
122e0 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 ** in the follow
122f0 69 6e 67 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 ing:. ** . **
12300 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 CREATE TABLE
12310 20 6d 61 69 6e 2e 65 78 31 28 61 29 3b 0a 20 20 main.ex1(a);.
12320 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 45 ** CREATE TE
12330 4d 50 20 56 49 45 57 20 65 78 31 20 41 53 20 53 MP VIEW ex1 AS S
12340 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 65 78 31 ELECT a FROM ex1
12350 3b 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 ;. ** SELEC
12360 54 20 2a 20 46 52 4f 4d 20 74 65 6d 70 2e 65 78 T * FROM temp.ex
12370 31 3b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 1;. */. if( pT
12380 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a able->nCol<0 ){.
12390 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 sqlite3Error
123a0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 Msg(pParse, "vie
123b0 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61 72 w %s is circular
123c0 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54 61 ly defined", pTa
123d0 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 ble->zName);.
123e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 return 1;. }.
123f0 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d assert( pTable-
12400 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f >nCol>=0 );.. /
12410 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 * If we get this
12420 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 77 far, it means w
12430 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75 74 e need to comput
12440 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 e the table name
12450 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 s.. ** Note tha
12460 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 t the call to sq
12470 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 lite3ResultSetOf
12480 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65 78 Select() will ex
12490 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22 2a pand any. ** "*
124a0 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 " elements in th
124b0 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f 66 e results set of
124c0 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77 69 the view and wi
124d0 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f 72 ll assign cursor
124e0 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65 6c s. ** to the el
124f0 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46 52 ements of the FR
12500 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74 20 OM clause. But
12510 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 we do not want t
12520 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20 2a hese changes. *
12530 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65 6e * to be permanen
12540 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70 75 t. So the compu
12550 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20 6f tation is done o
12560 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 n a copy of the
12570 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61 74 SELECT. ** stat
12580 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e ement that defin
12590 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a es the view.. *
125a0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 /. assert( pTab
125b0 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a 20 le->pSelect );.
125c0 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33 53 pSel = sqlite3S
125d0 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54 61 electDup(db, pTa
125e0 62 6c 65 2d 3e 70 53 65 6c 65 63 74 2c 20 30 29 ble->pSelect, 0)
125f0 3b 0a 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a ;. if( pSel ){.
12600 20 20 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e n = pParse->
12610 6e 54 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 nTab;. sqlite
12620 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 3SrcListAssignCu
12630 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 rsors(pParse, pS
12640 65 6c 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 el->pSrc);. p
12650 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 Table->nCol = -1
12660 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 ;. db->lookas
12670 69 64 65 2e 62 44 69 73 61 62 6c 65 2b 2b 3b 0a ide.bDisable++;.
12680 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
12690 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f MIT_AUTHORIZATIO
126a0 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64 62 N. xAuth = db
126b0 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d ->xAuth;. db-
126c0 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 >xAuth = 0;.
126d0 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 pSelTab = sqlite
126e0 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 3ResultSetOfSele
126f0 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 ct(pParse, pSel)
12700 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 ;. db->xAuth
12710 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 = xAuth;.#else.
12720 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c pSelTab = sql
12730 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 ite3ResultSetOfS
12740 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 elect(pParse, pS
12750 65 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 el);.#endif.
12760 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e pParse->nTab = n
12770 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 ;. if( pTable
12780 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 ->pCheck ){.
12790 20 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45 57 /* CREATE VIEW
127a0 20 6e 61 6d 65 28 61 72 67 6c 69 73 74 29 20 41 name(arglist) A
127b0 53 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 54 S .... ** T
127c0 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 he names of the
127d0 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 columns in the t
127e0 61 62 6c 65 20 61 72 65 20 74 61 6b 65 6e 20 66 able are taken f
127f0 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 61 72 67 rom. ** arg
12800 6c 69 73 74 20 77 68 69 63 68 20 69 73 20 73 74 list which is st
12810 6f 72 65 64 20 69 6e 20 70 54 61 62 6c 65 2d 3e ored in pTable->
12820 70 43 68 65 63 6b 2e 20 20 54 68 65 20 70 43 68 pCheck. The pCh
12830 65 63 6b 20 66 69 65 6c 64 0a 20 20 20 20 20 20 eck field.
12840 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 68 6f 6c 64 ** normally hold
12850 73 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 s CHECK constrai
12860 6e 74 73 20 6f 6e 20 61 6e 20 6f 72 64 69 6e 61 nts on an ordina
12870 72 79 20 74 61 62 6c 65 2c 20 62 75 74 20 66 6f ry table, but fo
12880 72 0a 20 20 20 20 20 20 2a 2a 20 61 20 56 49 45 r. ** a VIE
12890 57 20 69 74 20 68 6f 6c 64 73 20 74 68 65 20 6c W it holds the l
128a0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 20 6e 61 ist of column na
128b0 6d 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 mes.. */.
128c0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d sqlite3Colum
128d0 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73 74 28 70 nsFromExprList(p
128e0 50 61 72 73 65 2c 20 70 54 61 62 6c 65 2d 3e 70 Parse, pTable->p
128f0 43 68 65 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 Check, .
12900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12910 20 20 20 20 20 20 20 20 20 26 70 54 61 62 6c 65 &pTable
12920 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 6c 65 2d ->nCol, &pTable-
12930 3e 61 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 >aCol);. if
12940 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c ( db->mallocFail
12950 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 ed==0 . &&
12960 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 pParse->nErr==0
12970 0a 20 20 20 20 20 20 20 26 26 20 70 54 61 62 6c . && pTabl
12980 65 2d 3e 6e 43 6f 6c 3d 3d 70 53 65 6c 2d 3e 70 e->nCol==pSel->p
12990 45 4c 69 73 74 2d 3e 6e 45 78 70 72 0a 20 20 20 EList->nExpr.
129a0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 ){. sq
129b0 6c 69 74 65 33 53 65 6c 65 63 74 41 64 64 43 6f lite3SelectAddCo
129c0 6c 75 6d 6e 54 79 70 65 41 6e 64 43 6f 6c 6c 61 lumnTypeAndColla
129d0 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 54 61 tion(pParse, pTa
129e0 62 6c 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 ble, pSel);.
129f0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 }. }else if
12a00 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 ( pSelTab ){.
12a10 20 20 20 2f 2a 20 43 52 45 41 54 45 20 56 49 45 /* CREATE VIE
12a20 57 20 6e 61 6d 65 20 41 53 2e 2e 2e 20 20 77 69 W name AS... wi
12a30 74 68 6f 75 74 20 61 6e 20 61 72 67 75 6d 65 6e thout an argumen
12a40 74 20 6c 69 73 74 2e 20 20 43 6f 6e 73 74 72 75 t list. Constru
12a50 63 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 ct. ** the
12a60 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f column names fro
12a70 6d 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 m the SELECT sta
12a80 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 tement that defi
12a90 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 nes the view..
12aa0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 */. ass
12ab0 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f ert( pTable->aCo
12ac0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 l==0 );. pT
12ad0 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 able->nCol = pSe
12ae0 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 lTab->nCol;.
12af0 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d pTable->aCol =
12b00 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a pSelTab->aCol;.
12b10 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e pSelTab->n
12b20 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 Col = 0;. p
12b30 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 SelTab->aCol = 0
12b40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 ;. assert(
12b50 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 sqlite3SchemaMut
12b60 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 54 exHeld(db, 0, pT
12b70 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29 20 29 able->pSchema) )
12b80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ;. }else{.
12b90 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 pTable->nCol
12ba0 3d 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b = 0;. nErr+
12bb0 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c +;. }. sql
12bc0 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 ite3DeleteTable(
12bd0 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20 db, pSelTab);.
12be0 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 sqlite3SelectD
12bf0 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 29 3b elete(db, pSel);
12c00 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 . db->lookasi
12c10 64 65 2e 62 44 69 73 61 62 6c 65 2d 2d 3b 0a 20 de.bDisable--;.
12c20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e 45 } else {. nE
12c30 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 70 54 61 62 rr++;. }. pTab
12c40 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 le->pSchema->sch
12c50 65 6d 61 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 emaFlags |= DB_U
12c60 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 69 nresetViews;. i
12c70 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 f( db->mallocFai
12c80 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 led ){. sqlit
12c90 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 e3DeleteColumnNa
12ca0 6d 65 73 28 64 62 2c 20 70 54 61 62 6c 65 29 3b mes(db, pTable);
12cb0 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f . pTable->aCo
12cc0 6c 20 3d 20 30 3b 0a 20 20 20 20 70 54 61 62 6c l = 0;. pTabl
12cd0 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 7d e->nCol = 0;. }
12ce0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 .#endif /* SQLIT
12cf0 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 E_OMIT_VIEW */.
12d00 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a return nErr; .
12d10 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 }.#endif /* !def
12d20 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 ined(SQLITE_OMIT
12d30 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e _VIEW) || !defin
12d40 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 ed(SQLITE_OMIT_V
12d50 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a IRTUALTABLE) */.
12d60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
12d70 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 OMIT_VIEW./*.**
12d80 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e Clear the column
12d90 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 names from ever
12da0 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 y VIEW in databa
12db0 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 se idx..*/.stati
12dc0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 c void sqliteVie
12dd0 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 wResetAll(sqlite
12de0 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 3 *db, int idx){
12df0 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a . HashElem *i;.
12e00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 assert( sqlite
12e10 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 3SchemaMutexHeld
12e20 28 64 62 2c 20 69 64 78 2c 20 30 29 20 29 3b 0a (db, idx, 0) );.
12e30 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 if( !DbHasProp
12e40 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 erty(db, idx, DB
12e50 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 _UnresetViews) )
12e60 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 return;. for(i
12e70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 =sqliteHashFirst
12e80 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 (&db->aDb[idx].p
12e90 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 Schema->tblHash)
12ea0 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 ; i;i=sqliteHash
12eb0 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 Next(i)){. Ta
12ec0 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 ble *pTab = sqli
12ed0 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 teHashData(i);.
12ee0 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 if( pTab->pSe
12ef0 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 lect ){. sq
12f00 6c 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d lite3DeleteColum
12f10 6e 4e 61 6d 65 73 28 64 62 2c 20 70 54 61 62 29 nNames(db, pTab)
12f20 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 ;. pTab->aC
12f30 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 54 ol = 0;. pT
12f40 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 ab->nCol = 0;.
12f50 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 }. }. DbClea
12f60 72 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 rProperty(db, id
12f70 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 x, DB_UnresetVie
12f80 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 ws);.}.#else.# d
12f90 65 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 efine sqliteView
12fa0 52 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 ResetAll(A,B).#e
12fb0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f ndif /* SQLITE_O
12fc0 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a MIT_VIEW */../*.
12fd0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e ** This function
12fe0 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 is called by th
12ff0 65 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 e VDBE to adjust
13000 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 the internal sc
13010 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 hema.** used by
13020 53 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 SQLite when the
13030 62 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 btree layer move
13040 73 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 s a table root p
13050 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 age. The.** root
13060 2d 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 -page of a table
13070 20 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 or index in dat
13080 61 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68 abase iDb has ch
13090 61 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d anged from iFrom
130a0 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a .** to iTo..**.*
130b0 2a 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 * Ticket #1728:
130c0 20 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c The symbol tabl
130d0 65 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f e might still co
130e0 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f ntain informatio
130f0 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 n.** on tables a
13100 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 nd/or indices th
13110 61 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 at are the proce
13120 73 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 ss of being dele
13130 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 ted..** If you a
13140 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 re unlucky, one
13150 6f 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 of those deleted
13160 20 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c indices or tabl
13170 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 es might.** have
13180 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 the same rootpa
13190 67 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 ge number as the
131a0 20 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 real table or i
131b0 6e 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 ndex that is.**
131c0 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f being moved. So
131d0 20 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 we cannot stop
131e0 73 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 searching after
131f0 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 the first match
13200 0a 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 .** because the
13210 66 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 first match migh
13220 74 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 t be for one of
13230 74 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 the deleted indi
13240 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 ces.** or tables
13250 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 and not the tab
13260 6c 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 le/index that is
13270 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 actually being
13280 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 moved..** We mus
13290 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 t continue loopi
132a0 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 ng until all tab
132b0 6c 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 les and indices
132c0 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 with.** rootpage
132d0 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 ==iFrom have bee
132e0 6e 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 n converted to h
132f0 61 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f ave a rootpage o
13300 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 f iTo.** in orde
13310 72 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 r to be certain
13320 74 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 that we got the
13330 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 right one..*/.#i
13340 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 fndef SQLITE_OMI
13350 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 T_AUTOVACUUM.voi
13360 64 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 d sqlite3RootPag
13370 65 4d 6f 76 65 64 28 73 71 6c 69 74 65 33 20 2a eMoved(sqlite3 *
13380 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 db, int iDb, int
13390 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 iFrom, int iTo)
133a0 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 {. HashElem *pE
133b0 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 lem;. Hash *pHa
133c0 73 68 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a sh;. Db *pDb;..
133d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 assert( sqlite
133e0 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 3SchemaMutexHeld
133f0 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a (db, iDb, 0) );.
13400 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 pDb = &db->aDb
13410 5b 69 44 62 5d 3b 0a 20 20 70 48 61 73 68 20 3d [iDb];. pHash =
13420 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e &pDb->pSchema->
13430 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 tblHash;. for(p
13440 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 Elem=sqliteHashF
13450 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c irst(pHash); pEl
13460 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 em; pElem=sqlite
13470 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 HashNext(pElem))
13480 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 {. Table *pTa
13490 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 b = sqliteHashDa
134a0 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 ta(pElem);. i
134b0 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 f( pTab->tnum==i
134c0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 From ){. pT
134d0 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a ab->tnum = iTo;.
134e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 }. }. pHas
134f0 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d h = &pDb->pSchem
13500 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f a->idxHash;. fo
13510 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 r(pElem=sqliteHa
13520 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 shFirst(pHash);
13530 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c pElem; pElem=sql
13540 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 iteHashNext(pEle
13550 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a m)){. Index *
13560 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 pIdx = sqliteHas
13570 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 hData(pElem);.
13580 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d if( pIdx->tnum
13590 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 ==iFrom ){.
135a0 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 pIdx->tnum = iT
135b0 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 o;. }. }.}.#
135c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 endif../*.** Wri
135d0 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 te code to erase
135e0 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 the table with
135f0 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 root-page iTable
13600 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 from database i
13610 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 Db..** Also writ
13620 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 e code to modify
13630 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 the sqlite_mast
13640 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 er table and int
13650 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 ernal schema.**
13660 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f if a root-page o
13670 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 f another table
13680 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 is moved by the
13690 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c btree-layer whil
136a0 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 st.** erasing iT
136b0 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 able (this can h
136c0 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 appen with an au
136d0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 to-vacuum databa
136e0 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 se)..*/ .static
136f0 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 void destroyRoot
13700 50 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 Page(Parse *pPar
13710 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 se, int iTable,
13720 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 int iDb){. Vdbe
13730 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 *v = sqlite3Get
13740 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 Vdbe(pParse);.
13750 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 int r1 = sqlite3
13760 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 GetTempReg(pPars
13770 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 54 e);. assert( iT
13780 61 62 6c 65 3e 31 20 29 3b 0a 20 20 73 71 6c 69 able>1 );. sqli
13790 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c te3VdbeAddOp3(v,
137a0 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 OP_Destroy, iTa
137b0 62 6c 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 20 ble, r1, iDb);.
137c0 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 sqlite3MayAbort
137d0 28 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 (pParse);.#ifnde
137e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 f SQLITE_OMIT_AU
137f0 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 TOVACUUM. /* OP
13800 5f 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20 _Destroy stores
13810 61 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 an in integer r1
13820 2e 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 . If this intege
13830 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 r. ** is non-ze
13840 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 ro, then it is t
13850 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d he root page num
13860 62 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d ber of a table m
13870 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 oved to. ** loc
13880 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 ation iTable. Th
13890 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 e following code
138a0 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 modifies the sq
138b0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c lite_master tabl
138c0 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 e to. ** reflec
138d0 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a t this.. **. *
138e0 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 * The "#NNN" in
138f0 74 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 the SQL is a spe
13900 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 cial constant th
13910 61 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 at means whateve
13920 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 r value. ** is
13930 69 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e in register NNN.
13940 20 20 53 65 65 20 67 72 61 6d 6d 61 72 20 72 75 See grammar ru
13950 6c 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 les associated w
13960 69 74 68 20 74 68 65 20 54 4b 5f 52 45 47 49 53 ith the TK_REGIS
13970 54 45 52 0a 20 20 2a 2a 20 74 6f 6b 65 6e 20 66 TER. ** token f
13980 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e or additional in
13990 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a formation.. */.
139a0 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 sqlite3NestedP
139b0 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 arse(pParse, .
139c0 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 "UPDATE %Q.%s
139d0 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 SET rootpage=%d
139e0 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72 WHERE #%d AND r
139f0 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 ootpage=#%d",.
13a00 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 pParse->db->a
13a10 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 Db[iDb].zDbSName
13a20 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 69 , MASTER_NAME, i
13a30 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a Table, r1, r1);.
13a40 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 #endif. sqlite3
13a50 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 ReleaseTempReg(p
13a60 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f Parse, r1);.}../
13a70 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20 *.** Write VDBE
13a80 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61 code to erase ta
13a90 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c ble pTab and all
13aa0 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69 associated indi
13ab0 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 ces on disk..**
13ac0 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74 Code to update t
13ad0 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 he sqlite_master
13ae0 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65 tables and inte
13af0 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69 rnal schema defi
13b00 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 nitions.** in ca
13b10 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62 se a root-page b
13b20 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74 elonging to anot
13b30 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 her table is mov
13b40 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 ed by the btree
13b50 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f layer.** is also
13b60 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e added (this can
13b70 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 happen with an
13b80 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 auto-vacuum data
13b90 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 base)..*/.static
13ba0 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62 void destroyTab
13bb0 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 le(Parse *pParse
13bc0 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a , Table *pTab){.
13bd0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 /* If the data
13be0 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f base may be auto
13bf0 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20 -vacuum capable
13c00 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f (if SQLITE_OMIT_
13c10 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20 AUTOVACUUM. **
13c20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c is not defined),
13c30 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f then it is impo
13c40 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50 rtant to call OP
13c50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a _Destroy on the.
13c60 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69 ** table and i
13c70 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20 ndex root-pages
13c80 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69 in order, starti
13c90 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65 ng with the nume
13ca0 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 rically . ** la
13cb0 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 rgest root-page
13cc0 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61 number. This gua
13cd0 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e rantees that non
13ce0 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61 e of the root-pa
13cf0 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64 ges. ** to be d
13d00 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f estroyed is relo
13d10 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c cated by an earl
13d20 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20 ier OP_Destroy.
13d30 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a i.e. if the. **
13d40 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20 following were
13d50 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a coded:. **. **
13d60 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a OP_Destroy 4 0.
13d70 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 ** .... ** OP
13d80 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a _Destroy 5 0. *
13d90 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 *. ** and root
13da0 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20 page 5 happened
13db0 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73 to be the larges
13dc0 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 t root-page numb
13dd0 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 er in the. ** d
13de0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f atabase, then ro
13df0 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20 ot page 5 would
13e00 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65 be moved to page
13e10 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20 4 by the . **
13e20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22 "OP_Destroy 4 0"
13e30 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62 opcode. The sub
13e40 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74 sequent "OP_Dest
13e50 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68 roy 5 0" would h
13e60 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c it. ** a free-l
13e70 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 ist page.. */.
13e80 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62 int iTab = pTab
13e90 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44 ->tnum;. int iD
13ea0 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 estroyed = 0;..
13eb0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 while( 1 ){.
13ec0 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 Index *pIdx;.
13ed0 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d int iLargest =
13ee0 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65 0;.. if( iDe
13ef0 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54 stroyed==0 || iT
13f00 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b ab<iDestroyed ){
13f10 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20 . iLargest
13f20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20 = iTab;. }.
13f30 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d for(pIdx=pTab-
13f40 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 >pIndex; pIdx; p
13f50 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 Idx=pIdx->pNext)
13f60 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 {. int iIdx
13f70 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 = pIdx->tnum;.
13f80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 assert( pId
13f90 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 x->pSchema==pTab
13fa0 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 ->pSchema );.
13fb0 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79 if( (iDestroy
13fc0 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69 ed==0 || (iIdx<i
13fd0 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69 Destroyed)) && i
13fe0 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a Idx>iLargest ){.
13ff0 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 iLargest
14000 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d = iIdx;. }
14010 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 . }. if( i
14020 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20 Largest==0 ){.
14030 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 return;.
14040 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 }else{. int
14050 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 iDb = sqlite3Sc
14060 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 hemaToIndex(pPar
14070 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 se->db, pTab->pS
14080 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 61 73 chema);. as
14090 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 sert( iDb>=0 &&
140a0 69 44 62 3c 70 50 61 72 73 65 2d 3e 64 62 2d 3e iDb<pParse->db->
140b0 6e 44 62 20 29 3b 0a 20 20 20 20 20 20 64 65 73 nDb );. des
140c0 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 troyRootPage(pPa
140d0 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20 69 rse, iLargest, i
140e0 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73 74 Db);. iDest
140f0 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73 74 royed = iLargest
14100 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f ;. }. }.}../
14110 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72 *.** Remove entr
14120 69 65 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c ies from the sql
14130 69 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73 ite_statN tables
14140 20 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c (for N in (1,2,
14150 33 29 29 0a 2a 2a 20 61 66 74 65 72 20 61 20 44 3)).** after a D
14160 52 4f 50 20 49 4e 44 45 58 20 6f 72 20 44 52 4f ROP INDEX or DRO
14170 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e P TABLE command.
14180 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
14190 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 sqlite3ClearStat
141a0 54 61 62 6c 65 73 28 0a 20 20 50 61 72 73 65 20 Tables(. Parse
141b0 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 *pParse,
141c0 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 /* The parsing
141d0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 context */. int
141e0 20 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 iDb,
141f0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 /* The datab
14200 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 ase number */.
14210 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 const char *zTyp
14220 65 2c 20 20 20 20 20 2f 2a 20 22 69 64 78 22 20 e, /* "idx"
14230 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f or "tbl" */. co
14240 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 nst char *zName
14250 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 /* Name of
14260 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 2a index or table *
14270 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 /.){. int i;.
14280 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e const char *zDbN
14290 61 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 ame = pParse->db
142a0 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e ->aDb[iDb].zDbSN
142b0 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 ame;. for(i=1;
142c0 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 i<=4; i++){.
142d0 63 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 char zTab[24];.
142e0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 sqlite3_snpri
142f0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62 29 ntf(sizeof(zTab)
14300 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73 74 ,zTab,"sqlite_st
14310 61 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69 66 at%d",i);. if
14320 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 ( sqlite3FindTab
14330 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a le(pParse->db, z
14340 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b Tab, zDbName) ){
14350 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 . sqlite3Ne
14360 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 stedParse(pParse
14370 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 ,. "DELET
14380 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 E FROM %Q.%s WHE
14390 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20 20 RE %s=%Q",.
143a0 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62 zDbName, zTab
143b0 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 , zType, zName.
143c0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 );. }.
143d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 }.}../*.** Gener
143e0 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f 70 ate code to drop
143f0 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 a table..*/.voi
14400 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f d sqlite3CodeDro
14410 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 pTable(Parse *pP
14420 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 arse, Table *pTa
14430 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 b, int iDb, int
14440 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65 20 isView){. Vdbe
14450 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 *v;. sqlite3 *d
14460 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a b = pParse->db;.
14470 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67 Trigger *pTrig
14480 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d ger;. Db *pDb =
14490 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a &db->aDb[iDb];.
144a0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 . v = sqlite3Ge
144b0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 tVdbe(pParse);.
144c0 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b assert( v!=0 );
144d0 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 . sqlite3BeginW
144e0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 riteOperation(pP
144f0 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a arse, 1, iDb);..
14500 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
14510 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 MIT_VIRTUALTABLE
14520 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c . if( IsVirtual
14530 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 (pTab) ){. sq
14540 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 lite3VdbeAddOp0(
14550 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 v, OP_VBegin);.
14560 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 }.#endif.. /*
14570 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72 Drop all trigger
14580 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 s associated wit
14590 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e h the table bein
145a0 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a g dropped. Code.
145b0 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 ** is generate
145c0 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 d to remove entr
145d0 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f ies from sqlite_
145e0 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 master and/or.
145f0 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d ** sqlite_temp_m
14600 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65 aster if require
14610 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67 67 d.. */. pTrigg
14620 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 er = sqlite3Trig
14630 67 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 gerList(pParse,
14640 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 pTab);. while(
14650 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 pTrigger ){.
14660 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 assert( pTrigger
14670 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d ->pSchema==pTab-
14680 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 >pSchema || .
14690 20 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70 pTrigger->p
146a0 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b Schema==db->aDb[
146b0 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 1].pSchema );.
146c0 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 sqlite3DropTri
146d0 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20 ggerPtr(pParse,
146e0 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 70 pTrigger);. p
146f0 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 Trigger = pTrigg
14700 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a er->pNext;. }..
14710 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
14720 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e MIT_AUTOINCREMEN
14730 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e T. /* Remove an
14740 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65 y entries of the
14750 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 sqlite_sequence
14760 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 table associate
14770 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 d with. ** the
14780 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 table being drop
14790 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e ped. This is don
147a0 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 e before the tab
147b0 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 le is dropped.
147c0 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20 ** at the btree
147d0 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 level, in case t
147e0 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e he sqlite_sequen
147f0 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 ce table needs t
14800 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 o. ** move as a
14810 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64 result of the d
14820 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20 rop (can happen
14830 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d in auto-vacuum m
14840 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 ode).. */. if(
14850 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 pTab->tabFlags
14860 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 & TF_Autoincreme
14870 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 nt ){. sqlite
14880 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 3NestedParse(pPa
14890 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c 45 rse,. "DELE
148a0 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 TE FROM %Q.sqlit
148b0 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45 e_sequence WHERE
148c0 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 name=%Q",.
148d0 20 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 pDb->zDbSName,
148e0 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 pTab->zName.
148f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 );. }.#endif..
14900 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c /* Drop all SQL
14910 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 ITE_MASTER table
14920 20 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 and index entri
14930 65 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f es that refer to
14940 20 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e the. ** table.
14950 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d The program nam
14960 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 e loops through
14970 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 the master table
14980 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 2a and deletes. *
14990 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 * every row that
149a0 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 refers to a tab
149b0 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e le of the same n
149c0 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 ame as the one b
149d0 65 69 6e 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65 eing. ** droppe
149e0 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65 20 d. Triggers are
149f0 68 61 6e 64 6c 65 64 20 73 65 70 61 72 61 74 65 handled separate
14a00 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72 69 ly because a tri
14a10 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a gger can be. **
14a20 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 created in the
14a30 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 74 68 temp database th
14a40 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 at refers to a t
14a50 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a able in another.
14a60 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 ** database..
14a70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 */. sqlite3Nes
14a80 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c tedParse(pParse,
14a90 20 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 . "DELETE
14aa0 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 FROM %Q.%s WHERE
14ab0 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 tbl_name=%Q and
14ac0 20 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 type!='trigger'
14ad0 22 2c 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 44 ",. pDb->zD
14ae0 62 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e bSName, MASTER_N
14af0 41 4d 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 AME, pTab->zName
14b00 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 );. if( !isView
14b10 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 && !IsVirtual(p
14b20 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73 74 Tab) ){. dest
14b30 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c royTable(pParse,
14b40 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f pTab);. }.. /
14b50 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62 * Remove the tab
14b60 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 le entry from SQ
14b70 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 Lite's internal
14b80 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 schema and modif
14b90 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d y. ** the schem
14ba0 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 a cookie.. */.
14bb0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 if( IsVirtual(p
14bc0 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 Tab) ){. sqli
14bd0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c te3VdbeAddOp4(v,
14be0 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 OP_VDestroy, iD
14bf0 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a b, 0, 0, pTab->z
14c00 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 Name, 0);. }.
14c10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 sqlite3VdbeAddOp
14c20 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 4(v, OP_DropTabl
14c30 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 e, iDb, 0, 0, pT
14c40 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 ab->zName, 0);.
14c50 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f sqlite3ChangeCo
14c60 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 okie(pParse, iDb
14c70 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 );. sqliteViewR
14c80 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 esetAll(db, iDb)
14c90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 ;.}../*.** This
14ca0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 routine is calle
14cb0 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b d to do the work
14cc0 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45 of a DROP TABLE
14cd0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 statement..** p
14ce0 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 Name is the name
14cf0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f of the table to
14d00 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a be dropped..*/.
14d10 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70 void sqlite3Drop
14d20 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 Table(Parse *pPa
14d30 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e rse, SrcList *pN
14d40 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c ame, int isView,
14d50 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 int noErr){. T
14d60 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 able *pTab;. Vd
14d70 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 be *v;. sqlite3
14d80 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 *db = pParse->d
14d90 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 b;. int iDb;..
14da0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 if( db->mallocF
14db0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 ailed ){. got
14dc0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c o exit_drop_tabl
14dd0 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 e;. }. assert(
14de0 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 pParse->nErr==0
14df0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e );. assert( pN
14e00 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a ame->nSrc==1 );.
14e10 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61 if( sqlite3Rea
14e20 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 dSchema(pParse)
14e30 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 ) goto exit_drop
14e40 5f 74 61 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f _table;. if( no
14e50 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 Err ) db->suppre
14e60 73 73 45 72 72 2b 2b 3b 0a 20 20 61 73 73 65 72 ssErr++;. asser
14e70 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 t( isView==0 ||
14e80 69 73 56 69 65 77 3d 3d 4c 4f 43 41 54 45 5f 56 isView==LOCATE_V
14e90 49 45 57 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 IEW );. pTab =
14ea0 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 sqlite3LocateTab
14eb0 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 69 leItem(pParse, i
14ec0 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 sView, &pName->a
14ed0 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 [0]);. if( noEr
14ee0 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 r ) db->suppress
14ef0 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 Err--;.. if( pT
14f00 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 ab==0 ){. if(
14f10 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65 33 noErr ) sqlite3
14f20 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 CodeVerifyNamedS
14f30 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e chema(pParse, pN
14f40 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 ame->a[0].zDatab
14f50 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 ase);. goto e
14f60 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a xit_drop_table;.
14f70 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 }. iDb = sqli
14f80 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 te3SchemaToIndex
14f90 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 (db, pTab->pSche
14fa0 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 ma);. assert( i
14fb0 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d Db>=0 && iDb<db-
14fc0 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 >nDb );.. /* If
14fd0 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74 75 pTab is a virtu
14fe0 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 al table, call V
14ff0 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 iewGetColumnName
15000 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 s() to ensure.
15010 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c ** it is initial
15020 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 ized.. */. if(
15030 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 IsVirtual(pTab)
15040 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77 47 && sqlite3ViewG
15050 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 etColumnNames(pP
15060 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 arse, pTab) ){.
15070 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f goto exit_dro
15080 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 p_table;. }.#if
15090 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
150a0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 _AUTHORIZATION.
150b0 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b {. int code;
150c0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
150d0 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 *zTab = SCHEMA_T
150e0 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63 ABLE(iDb);. c
150f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d onst char *zDb =
15100 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 db->aDb[iDb].zD
15110 62 53 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 bSName;. cons
15120 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 t char *zArg2 =
15130 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 0;. if( sqlit
15140 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 e3AuthCheck(pPar
15150 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 se, SQLITE_DELET
15160 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 E, zTab, 0, zDb)
15170 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 ){. goto ex
15180 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 it_drop_table;.
15190 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 }. if( isV
151a0 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 iew ){. if(
151b0 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 !OMIT_TEMPDB &&
151c0 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 iDb==1 ){.
151d0 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 code = SQLITE
151e0 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b _DROP_TEMP_VIEW;
151f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 . }else{.
15200 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c code = SQL
15210 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 ITE_DROP_VIEW;.
15220 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 }.#ifndef S
15230 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 QLITE_OMIT_VIRTU
15240 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 ALTABLE. }els
15250 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 e if( IsVirtual(
15260 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 pTab) ){. c
15270 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f ode = SQLITE_DRO
15280 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 P_VTABLE;.
15290 7a 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47 zArg2 = sqlite3G
152a0 65 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 etVTable(db, pTa
152b0 62 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b b)->pMod->zName;
152c0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 .#endif. }els
152d0 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d e{. if( !OM
152e0 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 IT_TEMPDB && iDb
152f0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 ==1 ){. c
15300 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f ode = SQLITE_DRO
15310 50 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 P_TEMP_TABLE;.
15320 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
15330 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 code = SQLITE
15340 5f 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 _DROP_TABLE;.
15350 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 }. }. i
15360 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 f( sqlite3AuthCh
15370 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 eck(pParse, code
15380 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a , pTab->zName, z
15390 41 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 Arg2, zDb) ){.
153a0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 goto exit_dr
153b0 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a op_table;. }.
153c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 if( sqlite3A
153d0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c uthCheck(pParse,
153e0 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 SQLITE_DELETE,
153f0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 pTab->zName, 0,
15400 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f zDb) ){. go
15410 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 to exit_drop_tab
15420 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 le;. }. }.#e
15430 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 ndif. if( sqlit
15440 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d e3StrNICmp(pTab-
15450 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f >zName, "sqlite_
15460 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 ", 7)==0 . &&
15470 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 sqlite3StrNICmp
15480 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 (pTab->zName, "s
15490 71 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29 qlite_stat", 11)
154a0 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 !=0 ){. sqlit
154b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 e3ErrorMsg(pPars
154c0 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 e, "table %s may
154d0 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 not be dropped"
154e0 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a , pTab->zName);.
154f0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 goto exit_dr
15500 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 op_table;. }..#
15510 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
15520 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 IT_VIEW. /* Ens
15530 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 ure DROP TABLE i
15540 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 s not used on a
15550 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 view, and DROP V
15560 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a IEW is not used.
15570 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e ** on a table.
15580 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 . */. if( isVi
15590 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c ew && pTab->pSel
155a0 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 ect==0 ){. sq
155b0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 lite3ErrorMsg(pP
155c0 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 arse, "use DROP
155d0 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 TABLE to delete
155e0 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d table %s", pTab-
155f0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 >zName);. got
15600 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c o exit_drop_tabl
15610 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 e;. }. if( !is
15620 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 View && pTab->pS
15630 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c elect ){. sql
15640 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 ite3ErrorMsg(pPa
15650 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 rse, "use DROP V
15660 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 IEW to delete vi
15670 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e ew %s", pTab->zN
15680 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 ame);. goto e
15690 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a xit_drop_table;.
156a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a }.#endif.. /*
156b0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 Generate code t
156c0 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 o remove the tab
156d0 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 le from the mast
156e0 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e er table. ** on
156f0 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 disk.. */. v
15700 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 = sqlite3GetVdbe
15710 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 (pParse);. if(
15720 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 v ){. sqlite3
15730 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 BeginWriteOperat
15740 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 ion(pParse, 1, i
15750 44 62 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 Db);. if( !is
15760 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 73 71 View ){. sq
15770 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 lite3ClearStatTa
15780 62 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 bles(pParse, iDb
15790 2c 20 22 74 62 6c 22 2c 20 70 54 61 62 2d 3e 7a , "tbl", pTab->z
157a0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c Name);. sql
157b0 69 74 65 33 46 6b 44 72 6f 70 54 61 62 6c 65 28 ite3FkDropTable(
157c0 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2c 20 70 pParse, pName, p
157d0 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 Tab);. }.
157e0 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 sqlite3CodeDropT
157f0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 able(pParse, pTa
15800 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77 29 3b b, iDb, isView);
15810 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f . }..exit_drop_
15820 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 table:. sqlite3
15830 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 SrcListDelete(db
15840 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a , pName);.}../*.
15850 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 ** This routine
15860 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 is called to cre
15870 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 ate a new foreig
15880 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 n key on the tab
15890 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 le.** currently
158a0 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 under constructi
158b0 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 on. pFromCol de
158c0 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 termines which c
158d0 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 olumns.** in the
158e0 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 current table p
158f0 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 oint to the fore
15900 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 ign key. If pFr
15910 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a omCol==0 then.**
15920 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 connect the key
15930 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c to the last col
15940 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 umn inserted. p
15950 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f To is the name o
15960 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 f.** the table r
15970 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e 6b 2e eferred to (a.k.
15980 61 20 74 68 65 20 22 70 61 72 65 6e 74 22 20 74 a the "parent" t
15990 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c 20 69 able). pToCol i
159a0 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 s a list.** of t
159b0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 61 72 ables in the par
159c0 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e 20 20 ent pTo table.
159d0 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 flags contains a
159e0 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f ll.** informatio
159f0 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 n about the conf
15a00 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 lict resolution
15a10 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 algorithms speci
15a20 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f fied.** in the O
15a30 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 N DELETE, ON UPD
15a40 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 ATE and ON INSER
15a50 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a T clauses..**.**
15a60 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 An FKey structu
15a70 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e re is created an
15a80 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 d added to the t
15a90 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a able currently.*
15aa0 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 * under construc
15ab0 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 tion in the pPar
15ac0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 se->pNewTable fi
15ad0 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 eld..**.** The f
15ae0 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 oreign key is se
15af0 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 t for IMMEDIATE
15b00 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 processing. A s
15b10 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a ubsequent call.*
15b20 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 * to sqlite3Defe
15b30 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 rForeignKey() mi
15b40 67 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 ght change this
15b50 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a to DEFERRED..*/.
15b60 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 void sqlite3Crea
15b70 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 teForeignKey(.
15b80 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 Parse *pParse,
15b90 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 /* Parsing
15ba0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 context */. Exp
15bb0 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c rList *pFromCol,
15bc0 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 /* Columns in
15bd0 74 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 this table that
15be0 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 point to other t
15bf0 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 able */. Token
15c00 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f *pTo, /
15c10 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 * Name of the ot
15c20 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 her table */. E
15c30 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c xprList *pToCol,
15c40 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 /* Columns i
15c50 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c n the other tabl
15c60 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 e */. int flags
15c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 /* C
15c80 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 onflict resoluti
15c90 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a on algorithms. *
15ca0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a /.){. sqlite3 *
15cb0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b db = pParse->db;
15cc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
15cd0 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 OMIT_FOREIGN_KEY
15ce0 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d . FKey *pFKey =
15cf0 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 0;. FKey *pNex
15d00 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 tTo;. Table *p
15d10 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 = pParse->pNewTa
15d20 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 ble;. int nByte
15d30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 ;. int i;. int
15d40 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a nCol;. char *z
15d50 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f ;.. assert( pTo
15d60 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d !=0 );. if( p==
15d70 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 0 || IN_DECLARE_
15d80 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 VTAB ) goto fk_e
15d90 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 nd;. if( pFromC
15da0 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 ol==0 ){. int
15db0 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d iCol = p->nCol-
15dc0 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 1;. if( NEVER
15dd0 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20 (iCol<0) ) goto
15de0 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 fk_end;. if(
15df0 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c pToCol && pToCol
15e00 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 ->nExpr!=1 ){.
15e10 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 sqlite3Error
15e20 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 Msg(pParse, "for
15e30 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a eign key on %s".
15e40 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c " shoul
15e50 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 d reference only
15e60 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 one column of t
15e70 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 able %T",.
15e80 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d p->aCol[iCol]
15e90 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 .zName, pTo);.
15ea0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b goto fk_end;
15eb0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 . }. nCol
15ec0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 = 1;. }else if(
15ed0 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f pToCol && pToCo
15ee0 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 l->nExpr!=pFromC
15ef0 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 ol->nExpr ){.
15f00 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 sqlite3ErrorMsg
15f10 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 (pParse,.
15f20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 "number of colu
15f30 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b mns in foreign k
15f40 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 ey does not matc
15f50 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 h the number of
15f60 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d ". "colum
15f70 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 ns in the refere
15f80 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 nced table");.
15f90 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 goto fk_end;.
15fa0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c }else{. nCol
15fb0 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 = pFromCol->nEx
15fc0 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 pr;. }. nByte
15fd0 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 = sizeof(*pFKey)
15fe0 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 + (nCol-1)*size
15ff0 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 of(pFKey->aCol[0
16000 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b ]) + pTo->n + 1;
16010 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b . if( pToCol ){
16020 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c . for(i=0; i<
16030 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 pToCol->nExpr; i
16040 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 ++){. nByte
16050 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 += sqlite3Strle
16060 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d n30(pToCol->a[i]
16070 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 .zName) + 1;.
16080 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d }. }. pFKey =
16090 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 sqlite3DbMalloc
160a0 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 Zero(db, nByte )
160b0 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 ;. if( pFKey==0
160c0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f ){. goto fk_
160d0 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 end;. }. pFKey
160e0 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 ->pFrom = p;. p
160f0 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 FKey->pNextFrom
16100 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 = p->pFKey;. z
16110 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d = (char*)&pFKey-
16120 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 >aCol[nCol];. p
16130 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 FKey->zTo = z;.
16140 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f if( IN_RENAME_O
16150 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c BJECT ){. sql
16160 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d ite3RenameTokenM
16170 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 ap(pParse, (void
16180 2a 29 7a 2c 20 70 54 6f 29 3b 0a 20 20 7d 0a 20 *)z, pTo);. }.
16190 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e memcpy(z, pTo->
161a0 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b z, pTo->n);. z[
161b0 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 pTo->n] = 0;. s
161c0 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 qlite3Dequote(z)
161d0 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b ;. z += pTo->n+
161e0 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 1;. pFKey->nCol
161f0 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 = nCol;. if( p
16200 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 FromCol==0 ){.
16210 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d pFKey->aCol[0]
16220 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c .iFrom = p->nCol
16230 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 -1;. }else{.
16240 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c for(i=0; i<nCol
16250 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e ; i++){. in
16260 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a t j;. for(j
16270 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a =0; j<p->nCol; j
16280 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 ++){. if(
16290 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 sqlite3StrICmp(
162a0 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 p->aCol[j].zName
162b0 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d , pFromCol->a[i]
162c0 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 .zName)==0 ){.
162d0 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 pFKey->a
162e0 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a Col[i].iFrom = j
162f0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 ;. brea
16300 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 k;. }.
16310 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a }. if( j
16320 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 >=p->nCol ){.
16330 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f sqlite3Erro
16340 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 rMsg(pParse, .
16350 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e "unknown
16360 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 column \"%s\" i
16370 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 n foreign key de
16380 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 finition", .
16390 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e pFromCol->
163a0 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 a[i].zName);.
163b0 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 goto fk_end
163c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
163d0 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 if( IN_RENAME_OB
163e0 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 JECT ){.
163f0 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b sqlite3RenameTok
16400 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 enRemap(pParse,
16410 26 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2c &pFKey->aCol[i],
16420 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e pFromCol->a[i].
16430 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a zName);. }.
16440 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 }. }. if(
16450 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f pToCol ){. fo
16460 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 r(i=0; i<nCol; i
16470 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e ++){. int n
16480 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e = sqlite3Strlen
16490 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 30(pToCol->a[i].
164a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 zName);. pF
164b0 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f Key->aCol[i].zCo
164c0 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 69 66 28 l = z;. if(
164d0 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 IN_RENAME_OBJEC
164e0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c T ){. sql
164f0 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 ite3RenameTokenR
16500 65 6d 61 70 28 70 50 61 72 73 65 2c 20 7a 2c 20 emap(pParse, z,
16510 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 pToCol->a[i].zNa
16520 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 me);. }.
16530 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f memcpy(z, pTo
16540 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c Col->a[i].zName,
16550 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20 n);. z[n]
16560 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 = 0;. z +=
16570 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 n+1;. }. }.
16580 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 pFKey->isDeferr
16590 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65 79 2d ed = 0;. pFKey-
165a0 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d 20 28 75 >aAction[0] = (u
165b0 38 29 28 66 6c 61 67 73 20 26 20 30 78 66 66 29 8)(flags & 0xff)
165c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ; /*
165d0 4f 4e 20 44 45 4c 45 54 45 20 61 63 74 69 6f 6e ON DELETE action
165e0 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 61 41 63 */. pFKey->aAc
165f0 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38 29 28 28 tion[1] = (u8)((
16600 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30 flags >> 8 ) & 0
16610 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f 4e 20 55 xff); /* ON U
16620 50 44 41 54 45 20 61 63 74 69 6f 6e 20 2a 2f 0a PDATE action */.
16630 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 . assert( sqlit
16640 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c e3SchemaMutexHel
16650 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70 53 63 68 d(db, 0, p->pSch
16660 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65 78 74 54 ema) );. pNextT
16670 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73 71 6c 69 o = (FKey *)sqli
16680 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 te3HashInsert(&p
16690 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b 65 79 48 ->pSchema->fkeyH
166a0 61 73 68 2c 20 0a 20 20 20 20 20 20 70 46 4b 65 ash, . pFKe
166b0 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64 20 2a 29 y->zTo, (void *)
166c0 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20 69 66 28 pFKey. );. if(
166d0 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b 65 79 20 pNextTo==pFKey
166e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f ){. sqlite3Oo
166f0 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 mFault(db);.
16700 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d goto fk_end;. }
16710 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 20 29 . if( pNextTo )
16720 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e {. assert( pN
16730 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 3d 3d extTo->pPrevTo==
16740 30 20 29 3b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 0 );. pFKey->
16750 70 4e 65 78 74 54 6f 20 3d 20 70 4e 65 78 74 54 pNextTo = pNextT
16760 6f 3b 0a 20 20 20 20 70 4e 65 78 74 54 6f 2d 3e o;. pNextTo->
16770 70 50 72 65 76 54 6f 20 3d 20 70 46 4b 65 79 3b pPrevTo = pFKey;
16780 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 . }.. /* Link
16790 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 the foreign key
167a0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 61 73 20 to the table as
167b0 74 68 65 20 6c 61 73 74 20 73 74 65 70 2e 0a 20 the last step..
167c0 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b 65 79 20 3d */. p->pFKey =
167d0 20 70 46 4b 65 79 3b 0a 20 20 70 46 4b 65 79 20 pFKey;. pFKey
167e0 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 = 0;..fk_end:.
167f0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 sqlite3DbFree(db
16800 2c 20 70 46 4b 65 79 29 3b 0a 23 65 6e 64 69 66 , pFKey);.#endif
16810 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c /* !defined(SQL
16820 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e ITE_OMIT_FOREIGN
16830 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c 69 74 _KEY) */. sqlit
16840 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 e3ExprListDelete
16850 28 64 62 2c 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a (db, pFromCol);.
16860 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 sqlite3ExprLis
16870 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 6f 43 tDelete(db, pToC
16880 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 ol);.}../*.** Th
16890 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 is routine is ca
168a0 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 49 4e 49 lled when an INI
168b0 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 TIALLY IMMEDIATE
168c0 20 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 or INITIALLY DE
168d0 46 45 52 52 45 44 0a 2a 2a 20 63 6c 61 75 73 65 FERRED.** clause
168e0 20 69 73 20 73 65 65 6e 20 61 73 20 70 61 72 74 is seen as part
168f0 20 6f 66 20 61 20 66 6f 72 65 69 67 6e 20 6b 65 of a foreign ke
16900 79 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 20 54 y definition. T
16910 68 65 20 69 73 44 65 66 65 72 72 65 64 0a 2a 2a he isDeferred.**
16920 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 31 20 parameter is 1
16930 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 for INITIALLY DE
16940 46 45 52 52 45 44 20 61 6e 64 20 30 20 66 6f 72 FERRED and 0 for
16950 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 INITIALLY IMMED
16960 49 41 54 45 2e 0a 2a 2a 20 54 68 65 20 62 65 68 IATE..** The beh
16970 61 76 69 6f 72 20 6f 66 20 74 68 65 20 6d 6f 73 avior of the mos
16980 74 20 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 t recently creat
16990 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 ed foreign key i
169a0 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 63 s adjusted.** ac
169b0 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f cordingly..*/.vo
169c0 69 64 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 id sqlite3DeferF
169d0 6f 72 65 69 67 6e 4b 65 79 28 50 61 72 73 65 20 oreignKey(Parse
169e0 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 73 44 *pParse, int isD
169f0 65 66 65 72 72 65 64 29 7b 0a 23 69 66 6e 64 65 eferred){.#ifnde
16a00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f f SQLITE_OMIT_FO
16a10 52 45 49 47 4e 5f 4b 45 59 0a 20 20 54 61 62 6c REIGN_KEY. Tabl
16a20 65 20 2a 70 54 61 62 3b 0a 20 20 46 4b 65 79 20 e *pTab;. FKey
16a30 2a 70 46 4b 65 79 3b 0a 20 20 69 66 28 20 28 70 *pFKey;. if( (p
16a40 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e Tab = pParse->pN
16a50 65 77 54 61 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 ewTable)==0 || (
16a60 70 46 4b 65 79 20 3d 20 70 54 61 62 2d 3e 70 46 pFKey = pTab->pF
16a70 4b 65 79 29 3d 3d 30 20 29 20 72 65 74 75 72 6e Key)==0 ) return
16a80 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 44 65 ;. assert( isDe
16a90 66 65 72 72 65 64 3d 3d 30 20 7c 7c 20 69 73 44 ferred==0 || isD
16aa0 65 66 65 72 72 65 64 3d 3d 31 20 29 3b 20 2f 2a eferred==1 ); /*
16ab0 20 45 56 3a 20 52 2d 33 30 33 32 33 2d 32 31 39 EV: R-30323-219
16ac0 31 37 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e 69 17 */. pFKey->i
16ad0 73 44 65 66 65 72 72 65 64 20 3d 20 28 75 38 29 sDeferred = (u8)
16ae0 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 isDeferred;.#end
16af0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 if.}../*.** Gene
16b00 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 rate code that w
16b10 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 ill erase and re
16b20 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 fill index *pIdx
16b30 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 . This is.** us
16b40 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 ed to initialize
16b50 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 a newly created
16b60 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 index or to rec
16b70 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f ompute the.** co
16b80 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 ntent of an inde
16b90 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f x in response to
16ba0 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 a REINDEX comma
16bb0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d nd..**.** if mem
16bc0 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 RootPage is not
16bd0 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 negative, it mea
16be0 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 ns that the inde
16bf0 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 x is newly.** cr
16c00 65 61 74 65 64 2e 20 20 54 68 65 20 72 65 67 69 eated. The regi
16c10 73 74 65 72 20 73 70 65 63 69 66 69 65 64 20 62 ster specified b
16c20 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f y memRootPage co
16c30 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f ntains the.** ro
16c40 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f ot page number o
16c50 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 f the index. If
16c60 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 memRootPage is
16c70 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a negative, then.*
16c80 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 * the index alre
16c90 61 64 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d ady exists and m
16ca0 75 73 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 ust be cleared b
16cb0 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 efore being refi
16cc0 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 lled and.** the
16cd0 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 root page number
16ce0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 of the index is
16cf0 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 taken from pInd
16d00 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 ex->tnum..*/.sta
16d10 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 tic void sqlite3
16d20 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 RefillIndex(Pars
16d30 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 e *pParse, Index
16d40 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 *pIndex, int me
16d50 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 mRootPage){. Ta
16d60 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 ble *pTab = pInd
16d70 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 ex->pTable; /*
16d80 54 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 The table that i
16d90 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 s indexed */. i
16da0 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 nt iTab = pParse
16db0 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a ->nTab++; /*
16dc0 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 Btree cursor us
16dd0 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 ed for pTab */.
16de0 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 int iIdx = pPar
16df0 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 se->nTab++;
16e00 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 /* Btree cursor
16e10 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 used for pIndex
16e20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f 72 74 65 72 */. int iSorter
16e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
16e40 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 /* Cursor op
16e50 65 6e 65 64 20 62 79 20 4f 70 65 6e 53 6f 72 74 ened by OpenSort
16e60 65 72 20 28 69 66 20 69 6e 20 75 73 65 29 20 2a er (if in use) *
16e70 2f 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 /. int addr1;
16e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16e90 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 /* Address of
16ea0 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a top of loop */.
16eb0 20 20 69 6e 74 20 61 64 64 72 32 3b 20 20 20 20 int addr2;
16ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16ed0 20 2f 2a 20 41 64 64 72 65 73 73 20 74 6f 20 6a /* Address to j
16ee0 75 6d 70 20 74 6f 20 66 6f 72 20 6e 65 78 74 20 ump to for next
16ef0 69 74 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 iteration */. i
16f00 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20 nt tnum;
16f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
16f20 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e Root page of in
16f30 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 dex */. int iPa
16f40 72 74 49 64 78 4c 61 62 65 6c 3b 20 20 20 20 20 rtIdxLabel;
16f50 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 /* Jump
16f60 74 6f 20 74 68 69 73 20 6c 61 62 65 6c 20 74 6f to this label to
16f70 20 73 6b 69 70 20 61 20 72 6f 77 20 2a 2f 0a 20 skip a row */.
16f80 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 Vdbe *v;
16f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16fa0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 /* Generate code
16fb0 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 into this virtu
16fc0 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 al machine */.
16fd0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 KeyInfo *pKey;
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
16ff0 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e * KeyInfo for in
17000 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 dex */. int reg
17010 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20 20 20 Record;
17020 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 /* Regis
17030 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73 73 65 ter holding asse
17040 6d 62 6c 65 64 20 69 6e 64 65 78 20 72 65 63 6f mbled index reco
17050 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 rd */. sqlite3
17060 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 *db = pParse->db
17070 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 ; /* The da
17080 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
17090 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d n */. int iDb =
170a0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f sqlite3SchemaTo
170b0 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 Index(db, pIndex
170c0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 ->pSchema);..#if
170d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
170e0 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 _AUTHORIZATION.
170f0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 if( sqlite3Auth
17100 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 Check(pParse, SQ
17110 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c 20 70 49 LITE_REINDEX, pI
17120 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 0a ndex->zName, 0,.
17130 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 db->aDb[iD
17140 62 5d 2e 7a 44 62 53 4e 61 6d 65 20 29 20 29 7b b].zDbSName ) ){
17150 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d . return;. }
17160 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 .#endif.. /* Re
17170 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f quire a write-lo
17180 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 ck on the table
17190 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20 to perform this
171a0 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 operation */. s
171b0 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 qlite3TableLock(
171c0 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 pParse, iDb, pTa
171d0 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62 b->tnum, 1, pTab
171e0 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d ->zName);.. v =
171f0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 sqlite3GetVdbe(
17200 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 pParse);. if( v
17210 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 ==0 ) return;.
17220 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e if( memRootPage>
17230 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d =0 ){. tnum =
17240 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20 memRootPage;.
17250 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20 }else{. tnum
17260 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a = pIndex->tnum;.
17270 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c }. pKey = sql
17280 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 ite3KeyInfoOfInd
17290 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 ex(pParse, pInde
172a0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b x);. assert( pK
172b0 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c ey!=0 || db->mal
172c0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61 locFailed || pPa
172d0 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 0a 20 20 rse->nErr );..
172e0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 6f 72 74 /* Open the sort
172f0 65 72 20 63 75 72 73 6f 72 20 69 66 20 77 65 20 er cursor if we
17300 61 72 65 20 74 6f 20 75 73 65 20 6f 6e 65 2e 20 are to use one.
17310 2a 2f 0a 20 20 69 53 6f 72 74 65 72 20 3d 20 70 */. iSorter = p
17320 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 Parse->nTab++;.
17330 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f sqlite3VdbeAddO
17340 70 34 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 4f p4(v, OP_SorterO
17350 70 65 6e 2c 20 69 53 6f 72 74 65 72 2c 20 30 2c pen, iSorter, 0,
17360 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c pIndex->nKeyCol
17370 2c 20 28 63 68 61 72 2a 29 0a 20 20 20 20 20 20 , (char*).
17380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 sq
17390 6c 69 74 65 33 4b 65 79 49 6e 66 6f 52 65 66 28 lite3KeyInfoRef(
173a0 70 4b 65 79 29 2c 20 50 34 5f 4b 45 59 49 4e 46 pKey), P4_KEYINF
173b0 4f 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 O);.. /* Open t
173c0 68 65 20 74 61 62 6c 65 2e 20 4c 6f 6f 70 20 74 he table. Loop t
173d0 68 72 6f 75 67 68 20 61 6c 6c 20 72 6f 77 73 20 hrough all rows
173e0 6f 66 20 74 68 65 20 74 61 62 6c 65 2c 20 69 6e of the table, in
173f0 73 65 72 74 69 6e 67 20 69 6e 64 65 78 0a 20 20 serting index.
17400 2a 2a 20 72 65 63 6f 72 64 73 20 69 6e 74 6f 20 ** records into
17410 74 68 65 20 73 6f 72 74 65 72 2e 20 2a 2f 0a 20 the sorter. */.
17420 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c sqlite3OpenTabl
17430 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c 20 e(pParse, iTab,
17440 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 iDb, pTab, OP_Op
17450 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72 31 enRead);. addr1
17460 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 = sqlite3VdbeAd
17470 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e dOp2(v, OP_Rewin
17480 64 2c 20 69 54 61 62 2c 20 30 29 3b 20 56 64 62 d, iTab, 0); Vdb
17490 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 eCoverage(v);.
174a0 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69 regRecord = sqli
174b0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 te3GetTempReg(pP
174c0 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 arse);. sqlite3
174d0 4d 75 6c 74 69 57 72 69 74 65 28 70 50 61 72 73 MultiWrite(pPars
174e0 65 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 e);.. sqlite3Ge
174f0 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 nerateIndexKey(p
17500 50 61 72 73 65 2c 70 49 6e 64 65 78 2c 69 54 61 Parse,pIndex,iTa
17510 62 2c 72 65 67 52 65 63 6f 72 64 2c 30 2c 26 69 b,regRecord,0,&i
17520 50 61 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30 PartIdxLabel,0,0
17530 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 );. sqlite3Vdbe
17540 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 AddOp2(v, OP_Sor
17550 74 65 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74 terInsert, iSort
17560 65 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a er, regRecord);.
17570 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 sqlite3Resolve
17580 50 61 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61 PartIdxLabel(pPa
17590 72 73 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62 rse, iPartIdxLab
175a0 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 el);. sqlite3Vd
175b0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e beAddOp2(v, OP_N
175c0 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 ext, iTab, addr1
175d0 2b 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 +1); VdbeCoverag
175e0 65 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 e(v);. sqlite3V
175f0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 dbeJumpHere(v, a
17600 64 64 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d ddr1);. if( mem
17610 52 6f 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c RootPage<0 ) sql
17620 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 ite3VdbeAddOp2(v
17630 2c 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d , OP_Clear, tnum
17640 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 , iDb);. sqlite
17650 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 3VdbeAddOp4(v, O
17660 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 P_OpenWrite, iId
17670 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 x, tnum, iDb, .
17680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17690 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c (char *)pKey,
176a0 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 P4_KEYINFO);.
176b0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 sqlite3VdbeChang
176c0 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 eP5(v, OPFLAG_BU
176d0 4c 4b 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 LKCSR|((memRootP
176e0 61 67 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 age>=0)?OPFLAG_P
176f0 32 49 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61 2ISREG:0));.. a
17700 64 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 ddr1 = sqlite3Vd
17710 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 beAddOp2(v, OP_S
17720 6f 72 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74 orterSort, iSort
17730 65 72 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 er, 0); VdbeCove
17740 72 61 67 65 28 76 29 3b 0a 20 20 69 66 28 20 49 rage(v);. if( I
17750 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 6e sUniqueIndex(pIn
17760 64 65 78 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 dex) ){. int
17770 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 j2 = sqlite3Vdbe
17780 47 6f 74 6f 28 76 2c 20 31 29 3b 0a 20 20 20 20 Goto(v, 1);.
17790 61 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 addr2 = sqlite3V
177a0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 dbeCurrentAddr(v
177b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 );. sqlite3Vd
177c0 62 65 56 65 72 69 66 79 41 62 6f 72 74 61 62 6c beVerifyAbortabl
177d0 65 28 76 2c 20 4f 45 5f 41 62 6f 72 74 29 3b 0a e(v, OE_Abort);.
177e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 sqlite3VdbeA
177f0 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f 50 5f 53 ddOp4Int(v, OP_S
17800 6f 72 74 65 72 43 6f 6d 70 61 72 65 2c 20 69 53 orterCompare, iS
17810 6f 72 74 65 72 2c 20 6a 32 2c 20 72 65 67 52 65 orter, j2, regRe
17820 63 6f 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 cord,.
17830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 p
17840 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b Index->nKeyCol);
17850 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 VdbeCoverage(v)
17860 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 55 6e 69 ;. sqlite3Uni
17870 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 queConstraint(pP
17880 61 72 73 65 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 arse, OE_Abort,
17890 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c pIndex);. sql
178a0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 ite3VdbeJumpHere
178b0 28 76 2c 20 6a 32 29 3b 0a 20 20 7d 65 6c 73 65 (v, j2);. }else
178c0 7b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71 {. addr2 = sq
178d0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 lite3VdbeCurrent
178e0 41 64 64 72 28 76 29 3b 0a 20 20 7d 0a 20 20 73 Addr(v);. }. s
178f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 qlite3VdbeAddOp3
17900 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 44 61 74 (v, OP_SorterDat
17910 61 2c 20 69 53 6f 72 74 65 72 2c 20 72 65 67 52 a, iSorter, regR
17920 65 63 6f 72 64 2c 20 69 49 64 78 29 3b 0a 20 20 ecord, iIdx);.
17930 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 sqlite3VdbeAddOp
17940 31 28 76 2c 20 4f 50 5f 53 65 65 6b 45 6e 64 2c 1(v, OP_SeekEnd,
17950 20 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 iIdx);. sqlite
17960 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 3VdbeAddOp2(v, O
17970 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64 P_IdxInsert, iId
17980 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 x, regRecord);.
17990 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e sqlite3VdbeChan
179a0 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 geP5(v, OPFLAG_U
179b0 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 SESEEKRESULT);.
179c0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 sqlite3ReleaseT
179d0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 empReg(pParse, r
179e0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c egRecord);. sql
179f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 ite3VdbeAddOp2(v
17a00 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c , OP_SorterNext,
17a10 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72 32 29 iSorter, addr2)
17a20 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 ; VdbeCoverage(v
17a30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 );. sqlite3Vdbe
17a40 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 JumpHere(v, addr
17a50 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 1);.. sqlite3Vd
17a60 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 beAddOp1(v, OP_C
17a70 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 lose, iTab);. s
17a80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 qlite3VdbeAddOp1
17a90 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 (v, OP_Close, iI
17aa0 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 dx);. sqlite3Vd
17ab0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 beAddOp1(v, OP_C
17ac0 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a lose, iSorter);.
17ad0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 }../*.** Allocat
17ae0 65 20 68 65 61 70 20 73 70 61 63 65 20 74 6f 20 e heap space to
17af0 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f 62 hold an Index ob
17b00 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c 20 63 ject with nCol c
17b10 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e olumns..**.** In
17b20 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63 crease the alloc
17b30 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72 ation size to pr
17b40 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61 20 6e ovide an extra n
17b50 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f Extra bytes.** o
17b60 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 f 8-byte aligned
17b70 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65 space after the
17b80 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 61 6e Index object an
17b90 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f d return a.** po
17ba0 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 65 78 inter to this ex
17bb0 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a 70 70 tra space in *pp
17bc0 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 Extra..*/.Index
17bd0 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 *sqlite3Allocate
17be0 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20 20 73 IndexObject(. s
17bf0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 qlite3 *db,
17c00 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 /* Database
17c10 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 connection */.
17c20 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 i16 nCol,
17c30 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 /* Total nu
17c40 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 mber of columns
17c50 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a in the index */.
17c60 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 int nExtra,
17c70 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
17c80 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65 78 74 of bytes of ext
17c90 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f ra space to allo
17ca0 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 c */. char **pp
17cb0 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a 20 50 Extra /* P
17cc0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 65 ointer to the "e
17cd0 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f 0a 29 xtra" space */.)
17ce0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20 20 20 {. Index *p;
17cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f /* Allo
17d00 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62 6a 65 cated index obje
17d10 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 ct */. int nByt
17d20 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 e; /*
17d30 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 Bytes of space f
17d40 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 or Index object
17d50 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e + arrays */.. n
17d60 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 Byte = ROUND8(si
17d70 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b 20 20 zeof(Index)) +
17d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 /* I
17d90 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20 ndex structure
17da0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55 */. ROU
17db0 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a ND8(sizeof(char*
17dc0 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20 20 )*nCol) +
17dd0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c /* Index.azCol
17de0 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 l */.
17df0 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 ROUND8(sizeof
17e00 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 (LogEst)*(nCol+1
17e10 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 ) + /* Index
17e20 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a .aiRowLogEst *
17e30 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 /.
17e40 20 20 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e sizeof(i16)*n
17e50 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 Col +
17e60 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 /* Index.aiColu
17e70 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 mn */.
17e80 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 sizeof(
17e90 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20 u8)*nCol);
17ea0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e /* Index.
17eb0 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 aSortOrder */.
17ec0 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c p = sqlite3DbMal
17ed0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 locZero(db, nByt
17ee0 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 e + nExtra);. i
17ef0 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72 f( p ){. char
17f00 20 2a 70 45 78 74 72 61 20 3d 20 28 28 63 68 61 *pExtra = ((cha
17f10 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a r*)p)+ROUND8(siz
17f20 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 eof(Index));.
17f30 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f p->azColl = (co
17f40 6e 73 74 20 63 68 61 72 2a 2a 29 70 45 78 74 72 nst char**)pExtr
17f50 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 52 4f 55 a; pExtra += ROU
17f60 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a ND8(sizeof(char*
17f70 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e )*nCol);. p->
17f80 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c aiRowLogEst = (L
17f90 6f 67 45 73 74 2a 29 70 45 78 74 72 61 3b 20 70 ogEst*)pExtra; p
17fa0 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 Extra += sizeof(
17fb0 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 LogEst)*(nCol+1)
17fc0 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d ;. p->aiColum
17fd0 6e 20 3d 20 28 69 31 36 2a 29 70 45 78 74 72 61 n = (i16*)pExtra
17fe0 3b 20 20 20 20 20 20 20 70 45 78 74 72 61 20 2b ; pExtra +
17ff0 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 = sizeof(i16)*nC
18000 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 ol;. p->aSort
18010 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 70 45 78 Order = (u8*)pEx
18020 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c tra;. p->nCol
18030 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 umn = nCol;.
18040 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f p->nKeyCol = nCo
18050 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45 78 l - 1;. *ppEx
18060 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29 tra = ((char*)p)
18070 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 + nByte;. }.
18080 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a return p;.}../*.
18090 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 ** Create a new
180a0 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c index for an SQL
180b0 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e table. pName1.
180c0 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 pName2 is the na
180d0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 me of the index
180e0 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 .** and pTblList
180f0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 is the name of
18100 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 the table that i
18110 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e s to be indexed.
18120 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 Both will .**
18130 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 be NULL for a pr
18140 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 imary key or an
18150 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72 index that is cr
18160 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 eated to satisfy
18170 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e a.** UNIQUE con
18180 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 straint. If pTa
18190 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 ble and pIndex a
181a0 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 re NULL, use pPa
181b0 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a rse->pNewTable.*
181c0 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 * as the table t
181d0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 o be indexed. p
181e0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 Parse->pNewTable
181f0 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 is a table that
18200 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 is.** currently
18210 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 being construct
18220 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54 ed by a CREATE T
18230 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a ABLE statement..
18240 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 **.** pList is a
18250 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 list of columns
18260 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 to be indexed.
18270 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e pList will be N
18280 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 ULL if this.** i
18290 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 s a primary key
182a0 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 or unique-constr
182b0 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 aint on the most
182c0 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 recent column a
182d0 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 dded.** to the t
182e0 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 able currently u
182f0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f nder constructio
18300 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c n. .*/.void sql
18310 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 ite3CreateIndex(
18320 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 . Parse *pParse
18330 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 , /* All inf
18340 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 ormation about t
18350 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 his parse */. T
18360 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 oken *pName1,
18370 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 /* First part
18380 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d of index name. M
18390 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 ay be NULL */.
183a0 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 Token *pName2,
183b0 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 /* Second par
183c0 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e t of index name.
183d0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a May be NULL */.
183e0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e SrcList *pTblN
183f0 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f ame, /* Table to
18400 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 index. Use pPar
18410 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 se->pNewTable if
18420 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 0 */. ExprList
18430 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 *pList, /* A
18440 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 list of columns
18450 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f to be indexed */
18460 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 . int onError,
18470 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 /* OE_Abor
18480 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 t, OE_Ignore, OE
18490 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f _Replace, or OE_
184a0 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 None */. Token
184b0 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 *pStart, /*
184c0 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e The CREATE token
184d0 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 69 that begins thi
184e0 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 s statement */.
184f0 20 45 78 70 72 20 2a 70 50 49 57 68 65 72 65 2c Expr *pPIWhere,
18500 20 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 /* WHERE cla
18510 75 73 65 20 66 6f 72 20 70 61 72 74 69 61 6c 20 use for partial
18520 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 indices */. int
18530 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20 sortOrder,
18540 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 /* Sort order of
18550 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65 primary key whe
18560 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f n pList==NULL */
18570 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 . int ifNotExis
18580 74 2c 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 t, /* Omit er
18590 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72 ror if index alr
185a0 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 eady exists */.
185b0 20 75 38 20 69 64 78 54 79 70 65 20 20 20 20 20 u8 idxType
185c0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 /* The index
185d0 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 54 61 type */.){. Ta
185e0 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 ble *pTab = 0;
185f0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 /* Table to b
18600 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 e indexed */. I
18610 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 ndex *pIndex = 0
18620 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 ; /* The index
18630 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a to be created *
18640 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 /. char *zName
18650 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 = 0; /* Name
18660 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f of the index */
18670 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 . int nName;
18680 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
18690 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 r of characters
186a0 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e in zName */. in
186b0 74 20 69 2c 20 6a 3b 0a 20 20 44 62 46 69 78 65 t i, j;. DbFixe
186c0 72 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f r sFix; /
186d0 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 * For assigning
186e0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74 database names t
186f0 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e o pTable */. in
18700 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b t sortOrderMask;
18710 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 /* 1 to honor
18720 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 DESC in index.
18730 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0 to ignore. */
18740 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d . sqlite3 *db =
18750 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 pParse->db;. D
18760 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 b *pDb;
18770 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 /* The speci
18780 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 fic table contai
18790 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64 ning the indexed
187a0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 database */. i
187b0 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 nt iDb;
187c0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 /* Index of
187d0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61 the database tha
187e0 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 t is being writt
187f0 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 en */. Token *p
18800 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 Name = 0; /*
18810 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 Unqualified name
18820 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f of the index to
18830 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 create */. str
18840 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 uct ExprList_ite
18850 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a m *pListItem; /*
18860 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 For looping ove
18870 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 r pList */. int
18880 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20 nExtra = 0;
18890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
188a0 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 Space allocated
188b0 20 66 6f 72 20 7a 45 78 74 72 61 5b 5d 20 2a 2f for zExtra[] */
188c0 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 43 6f 6c . int nExtraCol
188d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
188e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
188f0 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20 6e extra columns n
18900 65 65 64 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 eeded */. char
18910 2a 7a 45 78 74 72 61 20 3d 20 30 3b 20 20 20 20 *zExtra = 0;
18920 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 /* E
18930 78 74 72 61 20 73 70 61 63 65 20 61 66 74 65 72 xtra space after
18940 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 the Index objec
18950 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 t */. Index *pP
18960 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 50 k = 0; /* P
18970 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 RIMARY KEY index
18980 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 for WITHOUT ROW
18990 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a 0a 20 20 ID tables */..
189a0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 if( db->mallocFa
189b0 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e iled || pParse->
189c0 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 67 6f nErr>0 ){. go
189d0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 to exit_create_i
189e0 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 ndex;. }. if(
189f0 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 IN_DECLARE_VTAB
18a00 26 26 20 69 64 78 54 79 70 65 21 3d 53 51 4c 49 && idxType!=SQLI
18a10 54 45 5f 49 44 58 54 59 50 45 5f 50 52 49 4d 41 TE_IDXTYPE_PRIMA
18a20 52 59 4b 45 59 20 29 7b 0a 20 20 20 20 67 6f 74 RYKEY ){. got
18a30 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e o exit_create_in
18a40 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 dex;. }. if( S
18a50 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 QLITE_OK!=sqlite
18a60 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 3ReadSchema(pPar
18a70 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 se) ){. goto
18a80 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 exit_create_inde
18a90 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a x;. }.. /*. *
18aa0 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65 * Find the table
18ab0 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69 that is to be i
18ac0 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20 ndexed. Return
18ad0 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 early if not fou
18ae0 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 nd.. */. if( p
18af0 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 TblName!=0 ){..
18b00 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77 /* Use the tw
18b10 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d o-part index nam
18b20 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 e to determine t
18b30 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 he database .
18b40 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f ** to search fo
18b50 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69 r the table. 'Fi
18b60 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d x' the table nam
18b70 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20 e to this db.
18b80 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 ** before looki
18b90 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e ng up the table.
18ba0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 . */. asse
18bb0 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e rt( pName1 && pN
18bc0 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20 ame2 );. iDb
18bd0 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 = sqlite3TwoPart
18be0 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 Name(pParse, pNa
18bf0 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e me1, pName2, &pN
18c00 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44 ame);. if( iD
18c10 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f b<0 ) goto exit_
18c20 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 create_index;.
18c30 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 20 assert( pName
18c40 26 26 20 70 4e 61 6d 65 2d 3e 7a 20 29 3b 0a 0a && pName->z );..
18c50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
18c60 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f MIT_TEMPDB. /
18c70 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e * If the index n
18c80 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 ame was unqualif
18c90 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 ied, check if th
18ca0 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 e table. ** i
18cb0 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 s a temp table.
18cc0 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 If so, set the d
18cd0 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f atabase to 1. Do
18ce0 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20 not do this.
18cf0 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73 ** if initialis
18d00 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 73 ing a database s
18d10 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 chema.. */.
18d20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e if( !db->init.
18d30 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54 busy ){. pT
18d40 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c ab = sqlite3SrcL
18d50 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 istLookup(pParse
18d60 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 , pTblName);.
18d70 20 20 20 69 66 28 20 70 4e 61 6d 65 32 2d 3e 6e if( pName2->n
18d80 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70 ==0 && pTab && p
18d90 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 Tab->pSchema==db
18da0 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 ->aDb[1].pSchema
18db0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44 62 20 ){. iDb
18dc0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 = 1;. }.
18dd0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 73 }.#endif.. s
18de0 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 qlite3FixInit(&s
18df0 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 Fix, pParse, iDb
18e00 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 , "index", pName
18e10 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 );. if( sqlit
18e20 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 e3FixSrcList(&sF
18e30 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 20 29 7b ix, pTblName) ){
18e40 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 . /* Becaus
18e50 65 20 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e e the parser con
18e60 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65 structs pTblName
18e70 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 from a single i
18e80 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20 dentifier,.
18e90 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 ** sqlite3FixSr
18ea0 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20 cList can never
18eb0 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 fail. */. a
18ec0 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a ssert(0);. }.
18ed0 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 pTab = sqlit
18ee0 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 49 74 65 e3LocateTableIte
18ef0 6d 28 70 50 61 72 73 65 2c 20 30 2c 20 26 70 54 m(pParse, 0, &pT
18f00 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 29 3b 0a 20 blName->a[0]);.
18f10 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d assert( db->m
18f20 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c allocFailed==0 |
18f30 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 | pTab==0 );.
18f40 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 67 if( pTab==0 ) g
18f50 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f oto exit_create_
18f60 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 69 index;. if( i
18f70 44 62 3d 3d 31 20 26 26 20 64 62 2d 3e 61 44 62 Db==1 && db->aDb
18f80 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 21 3d 70 [iDb].pSchema!=p
18f90 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a Tab->pSchema ){.
18fa0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 sqlite3Err
18fb0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 orMsg(pParse, .
18fc0 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f "canno
18fd0 74 20 63 72 65 61 74 65 20 61 20 54 45 4d 50 20 t create a TEMP
18fe0 69 6e 64 65 78 20 6f 6e 20 6e 6f 6e 2d 54 45 4d index on non-TEM
18ff0 50 20 74 61 62 6c 65 20 5c 22 25 73 5c 22 22 2c P table \"%s\"",
19000 0a 20 20 20 20 20 20 20 20 20 20 20 70 54 61 62 . pTab
19010 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 ->zName);.
19020 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 goto exit_create
19030 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 _index;. }.
19040 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 if( !HasRowid(
19050 70 54 61 62 29 20 29 20 70 50 6b 20 3d 20 73 71 pTab) ) pPk = sq
19060 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 lite3PrimaryKeyI
19070 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 7d 65 ndex(pTab);. }e
19080 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 lse{. assert(
19090 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 pName==0 );.
190a0 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74 3d assert( pStart=
190b0 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d =0 );. pTab =
190c0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 pParse->pNewTab
190d0 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 le;. if( !pTa
190e0 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 b ) goto exit_cr
190f0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 eate_index;.
19100 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 iDb = sqlite3Sch
19110 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 emaToIndex(db, p
19120 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 Tab->pSchema);.
19130 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e }. pDb = &db->
19140 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 61 73 73 aDb[iDb];.. ass
19150 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a ert( pTab!=0 );.
19160 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 assert( pParse
19170 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 ->nErr==0 );. i
19180 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 f( sqlite3StrNIC
19190 6d 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 mp(pTab->zName,
191a0 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 "sqlite_", 7)==0
191b0 20 0a 20 20 20 20 20 20 20 26 26 20 64 62 2d 3e . && db->
191c0 69 6e 69 74 2e 62 75 73 79 3d 3d 30 0a 23 69 66 init.busy==0.#if
191d0 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 SQLITE_USER_AUT
191e0 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 HENTICATION.
191f0 20 20 20 26 26 20 73 71 6c 69 74 65 33 55 73 65 && sqlite3Use
19200 72 41 75 74 68 54 61 62 6c 65 28 70 54 61 62 2d rAuthTable(pTab-
19210 3e 7a 4e 61 6d 65 29 3d 3d 30 0a 23 65 6e 64 69 >zName)==0.#endi
19220 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f f.#ifdef SQLITE_
19230 41 4c 4c 4f 57 5f 53 51 4c 49 54 45 5f 4d 41 53 ALLOW_SQLITE_MAS
19240 54 45 52 5f 49 4e 44 45 58 0a 20 20 20 20 20 20 TER_INDEX.
19250 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 && sqlite3StrIC
19260 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b mp(&pTab->zName[
19270 37 5d 2c 22 6d 61 73 74 65 72 22 29 21 3d 30 0a 7],"master")!=0.
19280 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 26 26 #endif. &&
19290 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 sqlite3StrNICmp
192a0 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d (&pTab->zName[7]
192b0 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29 21 ,"altertab_",9)!
192c0 3d 30 0a 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 =0. ){. sqlit
192d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 e3ErrorMsg(pPars
192e0 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 e, "table %s may
192f0 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 not be indexed"
19300 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a , pTab->zName);.
19310 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 goto exit_cr
19320 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a eate_index;. }.
19330 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
19340 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 MIT_VIEW. if( p
19350 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a Tab->pSelect ){.
19360 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 sqlite3Error
19370 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 Msg(pParse, "vie
19380 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e ws may not be in
19390 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 dexed");. got
193a0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e o exit_create_in
193b0 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a dex;. }.#endif.
193c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
193d0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 MIT_VIRTUALTABLE
193e0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c . if( IsVirtual
193f0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 (pTab) ){. sq
19400 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 lite3ErrorMsg(pP
19410 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74 arse, "virtual t
19420 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 ables may not be
19430 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 indexed");.
19440 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 goto exit_create
19450 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 _index;. }.#end
19460 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 if.. /*. ** Fi
19470 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 nd the name of t
19480 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 he index. Make
19490 73 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f sure there is no
194a0 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 t already anothe
194b0 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 r. ** index or
194c0 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 table with the s
194d0 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a ame name. . **
194e0 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a . ** Exception:
194f0 20 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64 If we are read
19500 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 ing the names of
19510 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 permanent indic
19520 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a es from the. **
19530 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 sqlite_master t
19540 61 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f able (because so
19550 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 me other process
19560 20 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 changed the sch
19570 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e ema) and. ** on
19580 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e e of the index n
19590 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 ames collides wi
195a0 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 th the name of a
195b0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 temporary table
195c0 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 or. ** index,
195d0 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e then we will con
195e0 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 tinue to process
195f0 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a this index.. *
19600 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d *. ** If pName=
19610 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 =0 it means that
19620 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 we are. ** dea
19630 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d ling with a prim
19640 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 ary key or UNIQU
19650 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 E constraint. W
19660 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 e have to invent
19670 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 our. ** own na
19680 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 me.. */. if( p
19690 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d Name ){. zNam
196a0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 e = sqlite3NameF
196b0 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 romToken(db, pNa
196c0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 me);. if( zNa
196d0 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 me==0 ) goto exi
196e0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a t_create_index;.
196f0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d assert( pNam
19700 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 e->z!=0 );. i
19710 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 f( SQLITE_OK!=sq
19720 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 lite3CheckObject
19730 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 Name(pParse, zNa
19740 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 me) ){. got
19750 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e o exit_create_in
19760 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 dex;. }. i
19770 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 f( !IN_RENAME_OB
19780 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66 JECT ){. if
19790 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 ( !db->init.busy
197a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 ){. if(
197b0 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 sqlite3FindTable
197c0 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d (db, zName, 0)!=
197d0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 0 ){. s
197e0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 qlite3ErrorMsg(p
197f0 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 Parse, "there is
19800 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 already a table
19810 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d named %s", zNam
19820 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f e);. go
19830 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 to exit_create_i
19840 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a ndex;. }.
19850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 }. if
19860 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 ( sqlite3FindInd
19870 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44 ex(db, zName, pD
19880 62 2d 3e 7a 44 62 53 4e 61 6d 65 29 21 3d 30 20 b->zDbSName)!=0
19890 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 ){. if( !
198a0 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 ifNotExist ){.
198b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 sqlite3E
198c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 rrorMsg(pParse,
198d0 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 "index %s alread
198e0 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 y exists", zName
198f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 );. }else
19900 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 {. asse
19910 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 rt( !db->init.bu
19920 73 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 sy );.
19930 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 sqlite3CodeVerif
19940 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 ySchema(pParse,
19950 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a iDb);. }.
19960 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 goto exi
19970 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a t_create_index;.
19980 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 }. }.
19990 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e }else{. int n
199a0 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f ;. Index *pLo
199b0 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f op;. for(pLoo
199c0 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 p=pTab->pIndex,
199d0 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f n=1; pLoop; pLoo
199e0 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 p=pLoop->pNext,
199f0 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 n++){}. zName
19a00 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 = sqlite3MPrint
19a10 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 f(db, "sqlite_au
19a20 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 toindex_%s_%d",
19a30 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b pTab->zName, n);
19a40 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d . if( zName==
19a50 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 0 ){. goto
19a60 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 exit_create_inde
19a70 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a x;. }.. /*
19a80 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 Automatic index
19a90 20 6e 61 6d 65 73 20 67 65 6e 65 72 61 74 65 64 names generated
19aa0 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 73 71 6c from within sql
19ab0 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 ite3_declare_vta
19ac0 62 28 29 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 b(). ** must
19ad0 68 61 76 65 20 6e 61 6d 65 73 20 74 68 61 74 20 have names that
19ae0 61 72 65 20 64 69 73 74 69 6e 63 74 20 66 72 6f are distinct fro
19af0 6d 20 6e 6f 72 6d 61 6c 20 61 75 74 6f 6d 61 74 m normal automat
19b00 69 63 20 69 6e 64 65 78 20 6e 61 6d 65 73 2e 0a ic index names..
19b10 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f ** The follo
19b20 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 63 wing statement c
19b30 6f 6e 76 65 72 74 73 20 22 73 71 6c 69 74 65 33 onverts "sqlite3
19b40 5f 61 75 74 6f 69 6e 64 65 78 2e 2e 2e 22 20 69 _autoindex..." i
19b50 6e 74 6f 0a 20 20 20 20 2a 2a 20 22 73 71 6c 69 nto. ** "sqli
19b60 74 65 33 5f 62 75 74 6f 69 6e 64 65 78 2e 2e 2e te3_butoindex...
19b70 22 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 " in order to ma
19b80 6b 65 20 74 68 65 20 6e 61 6d 65 73 20 64 69 73 ke the names dis
19b90 74 69 6e 63 74 2e 0a 20 20 20 20 2a 2a 20 54 68 tinct.. ** Th
19ba0 65 20 22 76 74 61 62 5f 65 72 72 2e 74 65 73 74 e "vtab_err.test
19bb0 22 20 74 65 73 74 20 64 65 6d 6f 6e 73 74 72 61 " test demonstra
19bc0 74 65 73 20 74 68 65 20 6e 65 65 64 20 6f 66 20 tes the need of
19bd0 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 2e 20 this statement.
19be0 2a 2f 0a 20 20 20 20 69 66 28 20 49 4e 5f 53 50 */. if( IN_SP
19bf0 45 43 49 41 4c 5f 50 41 52 53 45 20 29 20 7a 4e ECIAL_PARSE ) zN
19c00 61 6d 65 5b 37 5d 2b 2b 3b 0a 20 20 7d 0a 0a 20 ame[7]++;. }..
19c10 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 /* Check for au
19c20 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 thorization to c
19c30 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a reate an index..
19c40 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c */.#ifndef SQL
19c50 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 ITE_OMIT_AUTHORI
19c60 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 21 49 4e ZATION. if( !IN
19c70 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 _RENAME_OBJECT )
19c80 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 {. const char
19c90 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a 44 62 *zDb = pDb->zDb
19ca0 53 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 SName;. if( s
19cb0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 qlite3AuthCheck(
19cc0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 pParse, SQLITE_I
19cd0 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 NSERT, SCHEMA_TA
19ce0 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 BLE(iDb), 0, zDb
19cf0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 ) ){. goto
19d00 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 exit_create_inde
19d10 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d x;. }. i =
19d20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 SQLITE_CREATE_I
19d30 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f NDEX;. if( !O
19d40 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 MIT_TEMPDB && iD
19d50 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 b==1 ) i = SQLIT
19d60 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e E_CREATE_TEMP_IN
19d70 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c DEX;. if( sql
19d80 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 ite3AuthCheck(pP
19d90 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 arse, i, zName,
19da0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 pTab->zName, zDb
19db0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 ) ){. goto
19dc0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 exit_create_inde
19dd0 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e x;. }. }.#en
19de0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 dif.. /* If pLi
19df0 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 st==0, it means
19e00 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 this routine was
19e10 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 called to make
19e20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b a primary. ** k
19e30 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 ey out of the la
19e40 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 st column added
19e50 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 to the table und
19e60 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e er construction.
19e70 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 . ** So create
19e80 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 a fake list to s
19e90 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 imulate this..
19ea0 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d */. if( pList==
19eb0 30 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 70 0 ){. Token p
19ec0 72 65 76 43 6f 6c 3b 0a 20 20 20 20 43 6f 6c 75 revCol;. Colu
19ed0 6d 6e 20 2a 70 43 6f 6c 20 3d 20 26 70 54 61 62 mn *pCol = &pTab
19ee0 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f ->aCol[pTab->nCo
19ef0 6c 2d 31 5d 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e l-1];. pCol->
19f00 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 colFlags |= COLF
19f10 4c 41 47 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 LAG_UNIQUE;.
19f20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 49 6e 69 74 sqlite3TokenInit
19f30 28 26 70 72 65 76 43 6f 6c 2c 20 70 43 6f 6c 2d (&prevCol, pCol-
19f40 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4c 69 >zName);. pLi
19f50 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 st = sqlite3Expr
19f60 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 ListAppend(pPars
19f70 65 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 e, 0,.
19f80 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 sqlite3ExprA
19f90 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 lloc(db, TK_ID,
19fa0 26 70 72 65 76 43 6f 6c 2c 20 30 29 29 3b 0a 20 &prevCol, 0));.
19fb0 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 if( pList==0
19fc0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 ) goto exit_crea
19fd0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 te_index;. as
19fe0 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 sert( pList->nEx
19ff0 70 72 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c pr==1 );. sql
1a000 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 ite3ExprListSetS
1a010 6f 72 74 4f 72 64 65 72 28 70 4c 69 73 74 2c 20 ortOrder(pList,
1a020 73 6f 72 74 4f 72 64 65 72 29 3b 0a 20 20 7d 65 sortOrder);. }e
1a030 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 lse{. sqlite3
1a040 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e ExprListCheckLen
1a050 67 74 68 28 70 50 61 72 73 65 2c 20 70 4c 69 73 gth(pParse, pLis
1a060 74 2c 20 22 69 6e 64 65 78 22 29 3b 0a 20 20 7d t, "index");. }
1a070 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 .. /* Figure ou
1a080 74 20 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 t how many bytes
1a090 20 6f 66 20 73 70 61 63 65 20 61 72 65 20 72 65 of space are re
1a0a0 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 quired to store
1a0b0 65 78 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 explicitly. **
1a0c0 73 70 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 specified collat
1a0d0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d ion sequence nam
1a0e0 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 es.. */. for(i
1a0f0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 =0; i<pList->nEx
1a100 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 pr; i++){. Ex
1a110 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 pr *pExpr = pLis
1a120 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 t->a[i].pExpr;.
1a130 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 assert( pExpr
1a140 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 !=0 );. if( p
1a150 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c Expr->op==TK_COL
1a160 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20 6e 45 LATE ){. nE
1a170 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c xtra += (1 + sql
1a180 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78 ite3Strlen30(pEx
1a190 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a pr->u.zToken));.
1a1a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 }. }.. /*
1a1b0 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 . ** Allocate t
1a1c0 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 he index structu
1a1d0 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d re. . */. nNam
1a1e0 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 e = sqlite3Strle
1a1f0 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 n30(zName);. nE
1a200 78 74 72 61 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 xtraCol = pPk ?
1a210 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 pPk->nKeyCol : 1
1a220 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c ;. pIndex = sql
1a230 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 ite3AllocateInde
1a240 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 4c 69 73 xObject(db, pLis
1a250 74 2d 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74 72 t->nExpr + nExtr
1a260 61 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 aCol,.
1a270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a280 20 20 20 20 20 20 20 20 20 20 20 20 6e 4e 61 6d nNam
1a290 65 20 2b 20 6e 45 78 74 72 61 20 2b 20 31 2c 20 e + nExtra + 1,
1a2a0 26 7a 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 &zExtra);. if(
1a2b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 db->mallocFailed
1a2c0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 ){. goto exi
1a2d0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a t_create_index;.
1a2e0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 }. assert( EI
1a2f0 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 GHT_BYTE_ALIGNME
1a300 4e 54 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 NT(pIndex->aiRow
1a310 4c 6f 67 45 73 74 29 20 29 3b 0a 20 20 61 73 73 LogEst) );. ass
1a320 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f ert( EIGHT_BYTE_
1a330 41 4c 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 ALIGNMENT(pIndex
1a340 2d 3e 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 ->azColl) );. p
1a350 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a Index->zName = z
1a360 45 78 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 Extra;. zExtra
1a370 2b 3d 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 += nName + 1;.
1a380 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a memcpy(pIndex->z
1a390 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 Name, zName, nNa
1a3a0 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d me+1);. pIndex-
1a3b0 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a >pTable = pTab;.
1a3c0 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f pIndex->onErro
1a3d0 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b r = (u8)onError;
1a3e0 0a 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e . pIndex->uniqN
1a3f0 6f 74 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 otNull = onError
1a400 21 3d 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e !=OE_None;. pIn
1a410 64 65 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 69 dex->idxType = i
1a420 64 78 54 79 70 65 3b 0a 20 20 70 49 6e 64 65 78 dxType;. pIndex
1a430 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e ->pSchema = db->
1a440 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 aDb[iDb].pSchema
1a450 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 ;. pIndex->nKey
1a460 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 Col = pList->nEx
1a470 70 72 3b 0a 20 20 69 66 28 20 70 50 49 57 68 65 pr;. if( pPIWhe
1a480 72 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 re ){. sqlite
1a490 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 3ResolveSelfRefe
1a4a0 72 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54 rence(pParse, pT
1a4b0 61 62 2c 20 4e 43 5f 50 61 72 74 49 64 78 2c 20 ab, NC_PartIdx,
1a4c0 70 50 49 57 68 65 72 65 2c 20 30 29 3b 0a 20 20 pPIWhere, 0);.
1a4d0 20 20 70 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 pIndex->pPartI
1a4e0 64 78 57 68 65 72 65 20 3d 20 70 50 49 57 68 65 dxWhere = pPIWhe
1a4f0 72 65 3b 0a 20 20 20 20 70 50 49 57 68 65 72 65 re;. pPIWhere
1a500 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 = 0;. }. asse
1a510 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d rt( sqlite3Schem
1a520 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 aMutexHeld(db, i
1a530 44 62 2c 20 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 Db, 0) );.. /*
1a540 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 Check to see if
1a550 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 we should honor
1a560 44 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e DESC requests on
1a570 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 index columns.
1a580 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 */. if( pDb->p
1a590 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 Schema->file_for
1a5a0 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f mat>=4 ){. so
1a5b0 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 rtOrderMask = -1
1a5c0 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 ; /* Honor DES
1a5d0 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 C */. }else{.
1a5e0 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 sortOrderMask
1a5f0 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 = 0; /* Ignor
1a600 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 e DESC */. }..
1a610 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 /* Analyze the
1a620 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 list of expressi
1a630 6f 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 ons that form th
1a640 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 e terms of the i
1a650 6e 64 65 78 20 61 6e 64 0a 20 20 2a 2a 20 72 65 ndex and. ** re
1a660 70 6f 72 74 20 61 6e 79 20 65 72 72 6f 72 73 2e port any errors.
1a670 20 20 49 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 In the common
1a680 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 case where the e
1a690 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 78 61 xpression is exa
1a6a0 63 74 6c 79 0a 20 20 2a 2a 20 61 20 74 61 62 6c ctly. ** a tabl
1a6b0 65 20 63 6f 6c 75 6d 6e 2c 20 73 74 6f 72 65 20 e column, store
1a6c0 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 that column in a
1a6d0 69 43 6f 6c 75 6d 6e 5b 5d 2e 20 20 46 6f 72 20 iColumn[]. For
1a6e0 67 65 6e 65 72 61 6c 20 65 78 70 72 65 73 73 69 general expressi
1a6f0 6f 6e 73 2c 0a 20 20 2a 2a 20 70 6f 70 75 6c 61 ons,. ** popula
1a700 74 65 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 te pIndex->aColE
1a710 78 70 72 20 61 6e 64 20 73 74 6f 72 65 20 58 4e xpr and store XN
1a720 5f 45 58 50 52 20 28 2d 32 29 20 69 6e 20 61 69 _EXPR (-2) in ai
1a730 43 6f 6c 75 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20 Column[].. **.
1a740 20 2a 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 ** TODO: Issue
1a750 61 20 77 61 72 6e 69 6e 67 20 69 66 20 74 77 6f a warning if two
1a760 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 or more columns
1a770 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 72 of the index ar
1a780 65 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a e identical.. *
1a790 2a 20 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 * TODO: Issue a
1a7a0 77 61 72 6e 69 6e 67 20 69 66 20 74 68 65 20 74 warning if the t
1a7b0 61 62 6c 65 20 70 72 69 6d 61 72 79 20 6b 65 79 able primary key
1a7c0 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74 is used as part
1a7d0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 of the. ** ind
1a7e0 65 78 20 6b 65 79 2e 0a 20 20 2a 2f 0a 20 20 70 ex key.. */. p
1a7f0 4c 69 73 74 49 74 65 6d 20 3d 20 70 4c 69 73 74 ListItem = pList
1a800 2d 3e 61 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 ->a;. if( IN_RE
1a810 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 NAME_OBJECT ){.
1a820 20 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 pIndex->aColE
1a830 78 70 72 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 xpr = pList;.
1a840 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a pList = 0;. }.
1a850 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e for(i=0; i<pIn
1a860 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b dex->nKeyCol; i+
1a870 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b +, pListItem++){
1a880 0a 20 20 20 20 45 78 70 72 20 2a 70 43 45 78 70 . Expr *pCExp
1a890 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 r;
1a8a0 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 /* The i-th
1a8b0 69 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e index expression
1a8c0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 71 75 */. int requ
1a8d0 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 20 estedSortOrder;
1a8e0 20 20 20 20 20 20 20 2f 2a 20 41 53 43 20 6f 72 /* ASC or
1a8f0 20 44 45 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 DESC on the i-t
1a900 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a h expression */.
1a910 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
1a920 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 zColl;
1a930 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 /* Collation
1a940 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f sequence name */
1a950 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 .. sqlite3Str
1a960 69 6e 67 54 6f 49 64 28 70 4c 69 73 74 49 74 65 ingToId(pListIte
1a970 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 m->pExpr);. s
1a980 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c qlite3ResolveSel
1a990 66 52 65 66 65 72 65 6e 63 65 28 70 50 61 72 73 fReference(pPars
1a9a0 65 2c 20 70 54 61 62 2c 20 4e 43 5f 49 64 78 45 e, pTab, NC_IdxE
1a9b0 78 70 72 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e xpr, pListItem->
1a9c0 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 69 pExpr, 0);. i
1a9d0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 f( pParse->nErr
1a9e0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 ) goto exit_crea
1a9f0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 43 te_index;. pC
1aa00 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 Expr = sqlite3Ex
1aa10 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 4c prSkipCollate(pL
1aa20 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b istItem->pExpr);
1aa30 0a 20 20 20 20 69 66 28 20 70 43 45 78 70 72 2d . if( pCExpr-
1aa40 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 >op!=TK_COLUMN )
1aa50 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 {. if( pTab
1aa60 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 ==pParse->pNewTa
1aa70 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 ble ){. s
1aa80 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 qlite3ErrorMsg(p
1aa90 50 61 72 73 65 2c 20 22 65 78 70 72 65 73 73 69 Parse, "expressi
1aaa0 6f 6e 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 ons prohibited i
1aab0 6e 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e n PRIMARY KEY an
1aac0 64 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 d ".
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1aae0 20 20 20 20 22 55 4e 49 51 55 45 20 63 6f 6e 73 "UNIQUE cons
1aaf0 74 72 61 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 traints");.
1ab00 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 goto exit_cre
1ab10 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 ate_index;.
1ab20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e }. if( pIn
1ab30 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 3d 3d 30 dex->aColExpr==0
1ab40 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 ){. pInd
1ab50 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 3d 20 70 ex->aColExpr = p
1ab60 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 70 4c List;. pL
1ab70 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d ist = 0;. }
1ab80 0a 20 20 20 20 20 20 6a 20 3d 20 58 4e 5f 45 58 . j = XN_EX
1ab90 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 PR;. pIndex
1aba0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 ->aiColumn[i] =
1abb0 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70 XN_EXPR;. p
1abc0 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 Index->uniqNotNu
1abd0 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 ll = 0;. }els
1abe0 65 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 43 45 e{. j = pCE
1abf0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 xpr->iColumn;.
1ac00 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 30 assert( j<=0
1ac10 78 37 66 66 66 20 29 3b 0a 20 20 20 20 20 20 69 x7fff );. i
1ac20 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 f( j<0 ){.
1ac30 20 20 6a 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 j = pTab->iPKe
1ac40 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 y;. }else i
1ac50 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d f( pTab->aCol[j]
1ac60 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 .notNull==0 ){.
1ac70 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 pIndex->u
1ac80 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a niqNotNull = 0;.
1ac90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 }. pI
1aca0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 ndex->aiColumn[i
1acb0 5d 20 3d 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 ] = (i16)j;.
1acc0 7d 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b }. zColl = 0;
1acd0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49 74 . if( pListIt
1ace0 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 em->pExpr->op==T
1acf0 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 K_COLLATE ){.
1ad00 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 int nColl;.
1ad10 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 zColl = pLis
1ad20 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e tItem->pExpr->u.
1ad30 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43 zToken;. nC
1ad40 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 oll = sqlite3Str
1ad50 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 len30(zColl) + 1
1ad60 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 ;. assert(
1ad70 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b nExtra>=nColl );
1ad80 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 . memcpy(zE
1ad90 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f xtra, zColl, nCo
1ada0 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c ll);. zColl
1adb0 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 = zExtra;.
1adc0 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c zExtra += nColl
1add0 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2d ;. nExtra -
1ade0 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c = nColl;. }el
1adf0 73 65 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 se if( j>=0 ){.
1ae00 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 zColl = pTa
1ae10 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c b->aCol[j].zColl
1ae20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
1ae30 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d !zColl ) zColl =
1ae40 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 sqlite3StrBINAR
1ae50 59 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e Y;. if( !db->
1ae60 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73 71 init.busy && !sq
1ae70 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 lite3LocateCollS
1ae80 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c eq(pParse, zColl
1ae90 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 ) ){. goto
1aea0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 exit_create_inde
1aeb0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e x;. }. pIn
1aec0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d dex->azColl[i] =
1aed0 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 zColl;. requ
1aee0 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d estedSortOrder =
1aef0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 pListItem->sort
1af00 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65 Order & sortOrde
1af10 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 rMask;. pInde
1af20 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d x->aSortOrder[i]
1af30 20 3d 20 28 75 38 29 72 65 71 75 65 73 74 65 64 = (u8)requested
1af40 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a SortOrder;. }..
1af50 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 /* Append the
1af60 74 61 62 6c 65 20 6b 65 79 20 74 6f 20 74 68 65 table key to the
1af70 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 end of the inde
1af80 78 2e 20 20 46 6f 72 20 57 49 54 48 4f 55 54 20 x. For WITHOUT
1af90 52 4f 57 49 44 0a 20 20 2a 2a 20 74 61 62 6c 65 ROWID. ** table
1afa0 73 20 28 77 68 65 6e 20 70 50 6b 21 3d 30 29 20 s (when pPk!=0)
1afb0 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 this will be the
1afc0 20 64 65 63 6c 61 72 65 64 20 50 52 49 4d 41 52 declared PRIMAR
1afd0 59 20 4b 45 59 2e 20 20 46 6f 72 0a 20 20 2a 2a Y KEY. For. **
1afe0 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 73 20 28 normal tables (
1aff0 77 68 65 6e 20 70 50 6b 3d 3d 30 29 20 74 68 69 when pPk==0) thi
1b000 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 72 6f s will be the ro
1b010 77 69 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 wid.. */. if(
1b020 70 50 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a pPk ){. for(j
1b030 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 =0; j<pPk->nKeyC
1b040 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 ol; j++){.
1b050 69 6e 74 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 int x = pPk->aiC
1b060 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 olumn[j];.
1b070 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a assert( x>=0 );.
1b080 20 20 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c if( hasCol
1b090 75 6d 6e 28 70 49 6e 64 65 78 2d 3e 61 69 43 6f umn(pIndex->aiCo
1b0a0 6c 75 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b lumn, pIndex->nK
1b0b0 65 79 43 6f 6c 2c 20 78 29 20 29 7b 0a 20 20 20 eyCol, x) ){.
1b0c0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f pIndex->nCo
1b0d0 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20 20 7d lumn--; . }
1b0e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 else{. pI
1b0f0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 ndex->aiColumn[i
1b100 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 ] = x;. p
1b110 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d Index->azColl[i]
1b120 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a = pPk->azColl[j
1b130 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 ];. pInde
1b140 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d x->aSortOrder[i]
1b150 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 = pPk->aSortOrd
1b160 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 er[j];. i
1b170 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ++;. }.
1b180 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d }. assert( i=
1b190 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e =pIndex->nColumn
1b1a0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 );. }else{.
1b1b0 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d pIndex->aiColum
1b1c0 6e 5b 69 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b n[i] = XN_ROWID;
1b1d0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 . pIndex->azC
1b1e0 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 oll[i] = sqlite3
1b1f0 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 20 StrBINARY;. }.
1b200 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 sqlite3DefaultR
1b210 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 20 owEst(pIndex);.
1b220 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 if( pParse->pNe
1b230 77 54 61 62 6c 65 3d 3d 30 20 29 20 65 73 74 69 wTable==0 ) esti
1b240 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70 mateIndexWidth(p
1b250 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 Index);.. /* If
1b260 20 74 68 69 73 20 69 6e 64 65 78 20 63 6f 6e 74 this index cont
1b270 61 69 6e 73 20 65 76 65 72 79 20 63 6f 6c 75 6d ains every colum
1b280 6e 20 6f 66 20 69 74 73 20 74 61 62 6c 65 2c 20 n of its table,
1b290 74 68 65 6e 20 6d 61 72 6b 0a 20 20 2a 2a 20 69 then mark. ** i
1b2a0 74 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 t as a covering
1b2b0 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 index */. asser
1b2c0 74 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 t( HasRowid(pTab
1b2d0 29 20 0a 20 20 20 20 20 20 7c 7c 20 70 54 61 62 ) . || pTab
1b2e0 2d 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 73 71 6c ->iPKey<0 || sql
1b2f0 69 74 65 33 43 6f 6c 75 6d 6e 4f 66 49 6e 64 65 ite3ColumnOfInde
1b300 78 28 70 49 6e 64 65 78 2c 20 70 54 61 62 2d 3e x(pIndex, pTab->
1b310 69 50 4b 65 79 29 3e 3d 30 20 29 3b 0a 20 20 72 iPKey)>=0 );. r
1b320 65 63 6f 6d 70 75 74 65 43 6f 6c 75 6d 6e 73 4e ecomputeColumnsN
1b330 6f 74 49 6e 64 65 78 65 64 28 70 49 6e 64 65 78 otIndexed(pIndex
1b340 29 3b 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d );. if( pTblNam
1b350 65 21 3d 30 20 26 26 20 70 49 6e 64 65 78 2d 3e e!=0 && pIndex->
1b360 6e 43 6f 6c 75 6d 6e 3e 3d 70 54 61 62 2d 3e 6e nColumn>=pTab->n
1b370 43 6f 6c 20 29 7b 0a 20 20 20 20 70 49 6e 64 65 Col ){. pInde
1b380 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 3d 20 x->isCovering =
1b390 31 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 1;. for(j=0;
1b3a0 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b j<pTab->nCol; j+
1b3b0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 3d +){. if( j=
1b3c0 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 20 63 =pTab->iPKey ) c
1b3d0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 ontinue;. i
1b3e0 66 28 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e f( sqlite3Column
1b3f0 4f 66 49 6e 64 65 78 28 70 49 6e 64 65 78 2c 6a OfIndex(pIndex,j
1b400 29 3e 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b )>=0 ) continue;
1b410 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 69 . pIndex->i
1b420 73 43 6f 76 65 72 69 6e 67 20 3d 20 30 3b 0a 20 sCovering = 0;.
1b430 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
1b440 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 54 61 }. }.. if( pTa
1b450 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 b==pParse->pNewT
1b460 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 able ){. /* T
1b470 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 his routine has
1b480 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 been called to c
1b490 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 reate an automat
1b4a0 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 ic index as a.
1b4b0 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 ** result of a
1b4c0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 PRIMARY KEY or
1b4d0 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e UNIQUE clause on
1b4e0 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 a column defini
1b4f0 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 tion, or. **
1b500 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 a PRIMARY KEY or
1b510 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 UNIQUE clause f
1b520 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c ollowing the col
1b530 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e umn definitions.
1b540 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 . ** i.e. one
1b550 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 of:. **.
1b560 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 ** CREATE TABLE
1b570 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c t(x PRIMARY KEY,
1b580 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 y);. ** CREA
1b590 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c TE TABLE t(x, y,
1b5a0 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a UNIQUE(x, y));.
1b5b0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 **. ** Ei
1b5c0 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 ther way, check
1b5d0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 to see if the ta
1b5e0 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 ble already has
1b5f0 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 such an index. I
1b600 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e f. ** so, don
1b610 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 't bother creati
1b620 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 ng this one. Thi
1b630 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 s only applies t
1b640 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 o. ** automat
1b650 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 ically created i
1b660 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 ndices. Users ca
1b670 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 n do as they wis
1b680 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 h with. ** ex
1b690 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a plicit indices..
1b6a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 **. ** Tw
1b6b0 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d o UNIQUE or PRIM
1b6c0 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 ARY KEY constrai
1b6d0 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 nts are consider
1b6e0 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 ed equivalent.
1b6f0 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20 73 ** (and thus s
1b700 75 70 70 72 65 73 73 69 6e 67 20 74 68 65 20 73 uppressing the s
1b710 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20 econd one) even
1b720 69 66 20 74 68 65 79 20 68 61 76 65 20 64 69 66 if they have dif
1b730 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f ferent. ** so
1b740 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a rt orders.. *
1b750 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 *. ** If ther
1b760 65 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 e are different
1b770 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e collating sequen
1b780 63 65 73 20 6f 72 20 69 66 20 74 68 65 20 63 6f ces or if the co
1b790 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20 lumns of. **
1b7a0 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f the constraint o
1b7b0 63 63 75 72 20 69 6e 20 64 69 66 66 65 72 65 6e ccur in differen
1b7c0 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20 74 t orders, then t
1b7d0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 he constraints a
1b7e0 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 re. ** consid
1b7f0 65 72 65 64 20 64 69 73 74 69 6e 63 74 20 61 6e ered distinct an
1b800 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69 6e d both result in
1b810 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 separate indice
1b820 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e s.. */. In
1b830 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 dex *pIdx;. f
1b840 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 or(pIdx=pTab->pI
1b850 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 ndex; pIdx; pIdx
1b860 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 =pIdx->pNext){.
1b870 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 int k;.
1b880 20 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 assert( IsUniq
1b890 75 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 3b ueIndex(pIdx) );
1b8a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 . assert( p
1b8b0 49 64 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 Idx->idxType!=SQ
1b8c0 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 LITE_IDXTYPE_APP
1b8d0 44 45 46 20 29 3b 0a 20 20 20 20 20 20 61 73 73 DEF );. ass
1b8e0 65 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 ert( IsUniqueInd
1b8f0 65 78 28 70 49 6e 64 65 78 29 20 29 3b 0a 0a 20 ex(pIndex) );..
1b900 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e if( pIdx->n
1b910 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e KeyCol!=pIndex->
1b920 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e nKeyCol ) contin
1b930 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d ue;. for(k=
1b940 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 0; k<pIdx->nKeyC
1b950 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 ol; k++){.
1b960 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 const char *z1
1b970 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 ;. const
1b980 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20 char *z2;.
1b990 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e assert( pIdx->
1b9a0 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20 29 aiColumn[k]>=0 )
1b9b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 ;. if( pI
1b9c0 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 dx->aiColumn[k]!
1b9d0 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d =pIndex->aiColum
1b9e0 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 n[k] ) break;.
1b9f0 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64 78 2d z1 = pIdx-
1ba00 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 >azColl[k];.
1ba10 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d z2 = pIndex-
1ba20 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 >azColl[k];.
1ba30 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 if( sqlite3S
1ba40 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 trICmp(z1, z2) )
1ba50 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a break;. }.
1ba60 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 if( k==pId
1ba70 78 2d 3e 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 x->nKeyCol ){.
1ba80 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e if( pIdx->
1ba90 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d onError!=pIndex-
1baa0 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 >onError ){.
1bab0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f /* This co
1bac0 6e 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 nstraint creates
1bad0 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 the same index
1bae0 61 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 as a previous.
1baf0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 ** const
1bb00 72 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 raint specified
1bb10 73 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 somewhere in the
1bb20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 CREATE TABLE st
1bb30 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 atement..
1bb40 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 ** However th
1bb50 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c e ON CONFLICT cl
1bb60 61 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72 auses are differ
1bb70 65 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 ent. If both thi
1bb80 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 s . **
1bb90 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 constraint and t
1bba0 68 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 he previous equi
1bbb0 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e valent constrain
1bbc0 74 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a t have explicit.
1bbd0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 ** ON
1bbe0 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 CONFLICT clauses
1bbf0 20 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f this is an erro
1bc00 72 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 r. Otherwise, us
1bc10 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 e the.
1bc20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 ** explicitly sp
1bc30 65 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 72 ecified behavior
1bc40 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a for the index..
1bc50 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 */.
1bc60 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64 if( !(pId
1bc70 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 x->onError==OE_D
1bc80 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 efault || pIndex
1bc90 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 ->onError==OE_De
1bca0 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 fault) ){.
1bcb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 sqlite3Err
1bcc0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 orMsg(pParse, .
1bcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
1bce0 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 conflicting ON C
1bcf0 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 ONFLICT clauses
1bd00 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a specified", 0);.
1bd10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }.
1bd20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e if( pIdx->
1bd30 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 onError==OE_Defa
1bd40 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 ult ){.
1bd50 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 pIdx->onError
1bd60 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 = pIndex->onErr
1bd70 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a or;. }.
1bd80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
1bd90 20 20 69 66 28 20 69 64 78 54 79 70 65 3d 3d 53 if( idxType==S
1bda0 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52 QLITE_IDXTYPE_PR
1bdb0 49 4d 41 52 59 4b 45 59 20 29 20 70 49 64 78 2d IMARYKEY ) pIdx-
1bdc0 3e 69 64 78 54 79 70 65 20 3d 20 69 64 78 54 79 >idxType = idxTy
1bdd0 70 65 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f pe;. goto
1bde0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 exit_create_ind
1bdf0 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ex;. }.
1be00 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 49 4e }. }.. if( !IN
1be10 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 _RENAME_OBJECT )
1be20 7b 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 {.. /* Link t
1be30 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72 he new Index str
1be40 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61 ucture to its ta
1be50 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f ble and to the o
1be60 74 68 65 72 0a 20 20 20 20 2a 2a 20 69 6e 2d 6d ther. ** in-m
1be70 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 emory database s
1be80 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 20 20 tructures. .
1be90 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 */. assert( p
1bea0 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 Parse->nErr==0 )
1beb0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e ;. if( db->in
1bec0 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 it.busy ){.
1bed0 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 Index *p;.
1bee0 20 61 73 73 65 72 74 28 20 21 49 4e 5f 53 50 45 assert( !IN_SPE
1bef0 43 49 41 4c 5f 50 41 52 53 45 20 29 3b 0a 20 20 CIAL_PARSE );.
1bf00 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 assert( sqli
1bf10 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 te3SchemaMutexHe
1bf20 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65 78 ld(db, 0, pIndex
1bf30 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 ->pSchema) );.
1bf40 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 p = sqlite3H
1bf50 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65 ashInsert(&pInde
1bf60 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 x->pSchema->idxH
1bf70 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 ash, .
1bf80 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 pIndex->zName, p
1bf90 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 69 66 Index);. if
1bfa0 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 61 ( p ){. a
1bfb0 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 ssert( p==pIndex
1bfc0 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d ); /* Malloc m
1bfd0 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 ust have failed
1bfe0 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 */. sqlit
1bff0 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a e3OomFault(db);.
1c000 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 goto exi
1c010 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a t_create_index;.
1c020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 }. db
1c030 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44 42 ->mDbFlags |= DB
1c040 46 4c 41 47 5f 53 63 68 65 6d 61 43 68 61 6e 67 FLAG_SchemaChang
1c050 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 62 e;. if( pTb
1c060 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 lName!=0 ){.
1c070 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d pIndex->tnum
1c080 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 = db->init.newT
1c090 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 num;. }.
1c0a0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 }.. /* If th
1c0b0 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 is is the initia
1c0c0 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 l CREATE INDEX s
1c0d0 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45 tatement (or CRE
1c0e0 41 54 45 20 54 41 42 4c 45 20 69 66 20 74 68 65 ATE TABLE if the
1c0f0 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 . ** index is
1c100 20 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 an implied inde
1c110 78 20 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f x for a UNIQUE o
1c120 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f r PRIMARY KEY co
1c130 6e 73 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 nstraint) then.
1c140 20 20 20 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20 ** emit code
1c150 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 to allocate the
1c160 69 6e 64 65 78 20 72 6f 6f 74 70 61 67 65 20 6f index rootpage o
1c170 6e 20 64 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20 n disk and make
1c180 61 6e 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 20 an entry for.
1c190 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e ** the index in
1c1a0 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 the sqlite_mast
1c1b0 65 72 20 74 61 62 6c 65 20 61 6e 64 20 70 6f 70 er table and pop
1c1c0 75 6c 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 ulate the index
1c1d0 77 69 74 68 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 with. ** cont
1c1e0 65 6e 74 2e 20 20 42 75 74 2c 20 64 6f 20 6e 6f ent. But, do no
1c1f0 74 20 64 6f 20 74 68 69 73 20 69 66 20 77 65 20 t do this if we
1c200 61 72 65 20 73 69 6d 70 6c 79 20 72 65 61 64 69 are simply readi
1c210 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 ng the sqlite_ma
1c220 73 74 65 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c ster. ** tabl
1c230 65 20 74 6f 20 70 61 72 73 65 20 74 68 65 20 73 e to parse the s
1c240 63 68 65 6d 61 2c 20 6f 72 20 69 66 20 74 68 69 chema, or if thi
1c250 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 50 s index is the P
1c260 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 RIMARY KEY index
1c270 0a 20 20 20 20 2a 2a 20 6f 66 20 61 20 57 49 54 . ** of a WIT
1c280 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 HOUT ROWID table
1c290 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 .. **. **
1c2a0 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 If pTblName==0 i
1c2b0 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 t means this ind
1c2c0 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 ex is generated
1c2d0 61 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52 as an implied PR
1c2e0 49 4d 41 52 59 20 4b 45 59 0a 20 20 20 20 2a 2a IMARY KEY. **
1c2f0 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 or UNIQUE index
1c300 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 in a CREATE TAB
1c310 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 LE statement. S
1c320 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 ince the table.
1c330 20 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 ** has just b
1c340 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 een created, it
1c350 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 contains no data
1c360 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 and the index i
1c370 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 nitialization.
1c380 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 ** step can be
1c390 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f skipped.. */
1c3a0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 48 61 . else if( Ha
1c3b0 73 52 6f 77 69 64 28 70 54 61 62 29 20 7c 7c 20 sRowid(pTab) ||
1c3c0 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 pTblName!=0 ){.
1c3d0 20 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 Vdbe *v;.
1c3e0 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b char *zStmt;
1c3f0 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 . int iMem
1c400 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d = ++pParse->nMem
1c410 3b 0a 0a 20 20 20 20 20 20 76 20 3d 20 73 71 6c ;.. v = sql
1c420 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 ite3GetVdbe(pPar
1c430 73 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76 se);. if( v
1c440 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f ==0 ) goto exit_
1c450 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 create_index;..
1c460 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 sqlite3Begi
1c470 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 nWriteOperation(
1c480 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b pParse, 1, iDb);
1c490 0a 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 .. /* Creat
1c4a0 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 e the rootpage f
1c4b0 6f 72 20 74 68 65 20 69 6e 64 65 78 20 75 73 69 or the index usi
1c4c0 6e 67 20 43 72 65 61 74 65 49 6e 64 65 78 2e 20 ng CreateIndex.
1c4d0 42 75 74 20 62 65 66 6f 72 65 0a 20 20 20 20 20 But before.
1c4e0 20 2a 2a 20 64 6f 69 6e 67 20 73 6f 2c 20 63 6f ** doing so, co
1c4f0 64 65 20 61 20 4e 6f 6f 70 20 69 6e 73 74 72 75 de a Noop instru
1c500 63 74 69 6f 6e 20 61 6e 64 20 73 74 6f 72 65 20 ction and store
1c510 69 74 73 20 61 64 64 72 65 73 73 20 69 6e 20 0a its address in .
1c520 20 20 20 20 20 20 2a 2a 20 49 6e 64 65 78 2e 74 ** Index.t
1c530 6e 75 6d 2e 20 54 68 69 73 20 69 73 20 72 65 71 num. This is req
1c540 75 69 72 65 64 20 69 6e 20 63 61 73 65 20 74 68 uired in case th
1c550 69 73 20 69 6e 64 65 78 20 69 73 20 61 63 74 75 is index is actu
1c560 61 6c 6c 79 20 61 20 0a 20 20 20 20 20 20 2a 2a ally a . **
1c570 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64 PRIMARY KEY and
1c580 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 63 the table is ac
1c590 74 75 61 6c 6c 79 20 61 20 57 49 54 48 4f 55 54 tually a WITHOUT
1c5a0 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 49 6e ROWID table. In
1c5b0 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 . ** that
1c5c0 63 61 73 65 20 74 68 65 20 63 6f 6e 76 65 72 74 case the convert
1c5d0 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 ToWithoutRowidTa
1c5e0 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 77 69 ble() routine wi
1c5f0 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20 20 20 20 ll replace.
1c600 20 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69 74 ** the Noop wit
1c610 68 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 h a Goto to jump
1c620 20 6f 76 65 72 20 74 68 65 20 56 44 42 45 20 63 over the VDBE c
1c630 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 65 ode generated be
1c640 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 low. */. pI
1c650 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c ndex->tnum = sql
1c660 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 ite3VdbeAddOp0(v
1c670 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 , OP_Noop);.
1c680 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 sqlite3VdbeAdd
1c690 4f 70 33 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 Op3(v, OP_Create
1c6a0 42 74 72 65 65 2c 20 69 44 62 2c 20 69 4d 65 6d Btree, iDb, iMem
1c6b0 2c 20 42 54 52 45 45 5f 42 4c 4f 42 4b 45 59 29 , BTREE_BLOBKEY)
1c6c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 61 74 68 ;.. /* Gath
1c6d0 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 er the complete
1c6e0 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 text of the CREA
1c6f0 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 TE INDEX stateme
1c700 6e 74 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a nt into. **
1c710 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 the zStmt varia
1c720 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 ble. */.
1c730 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b if( pStart ){
1c740 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d . int n =
1c750 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73 (int)(pParse->s
1c760 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e LastToken.z - pN
1c770 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65 ame->z) + pParse
1c780 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a ->sLastToken.n;.
1c790 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d if( pNam
1c7a0 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 e->z[n-1]==';' )
1c7b0 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 2f 2a n--;. /*
1c7c0 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 A named index w
1c7d0 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 ith an explicit
1c7e0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 CREATE INDEX sta
1c7f0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 tement */.
1c800 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 zStmt = sqlite
1c810 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 3MPrintf(db, "CR
1c820 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a EATE%s INDEX %.*
1c830 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 s",.
1c840 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 onError==OE_None
1c850 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45 ? "" : " UNIQUE
1c860 22 2c 20 6e 2c 20 70 4e 61 6d 65 2d 3e 7a 29 3b ", n, pName->z);
1c870 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 . }else{.
1c880 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f /* An auto
1c890 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 matic index crea
1c8a0 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 ted by a PRIMARY
1c8b0 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 KEY or UNIQUE c
1c8c0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 onstraint */.
1c8d0 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 /* zStmt =
1c8e0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 sqlite3MPrintf("
1c8f0 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a "); */. z
1c900 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 Stmt = 0;.
1c910 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 }.. /* Add
1c920 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 an entry in sqli
1c930 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 te_master for th
1c940 69 73 20 69 6e 64 65 78 0a 20 20 20 20 20 20 2a is index. *
1c950 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e /. sqlite3N
1c960 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 estedParse(pPars
1c970 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 49 e, . "I
1c980 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 NSERT INTO %Q.%s
1c990 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c VALUES('index',
1c9a0 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c %Q,%Q,#%d,%Q);",
1c9b0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 . db->a
1c9c0 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 Db[iDb].zDbSName
1c9d0 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 0a 20 , MASTER_NAME,.
1c9e0 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d pIndex-
1c9f0 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 >zName,.
1ca00 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 pTab->zName,.
1ca10 20 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 iMem,.
1ca20 20 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 zStmt.
1ca30 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 );.
1ca40 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
1ca50 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 db, zStmt);..
1ca60 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 /* Fill the i
1ca70 6e 64 65 78 20 77 69 74 68 20 64 61 74 61 20 61 ndex with data a
1ca80 6e 64 20 72 65 70 61 72 73 65 20 74 68 65 20 73 nd reparse the s
1ca90 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f chema. Code an O
1caa0 50 5f 45 78 70 69 72 65 0a 20 20 20 20 20 20 2a P_Expire. *
1cab0 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 * to invalidate
1cac0 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 all pre-compiled
1cad0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 statements..
1cae0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 */. if(
1caf0 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 pTblName ){.
1cb00 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c sqlite3Refil
1cb10 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 lIndex(pParse, p
1cb20 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 Index, iMem);.
1cb30 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 sqlite3Cha
1cb40 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 ngeCookie(pParse
1cb50 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 , iDb);.
1cb60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 sqlite3VdbeAddPa
1cb70 72 73 65 53 63 68 65 6d 61 4f 70 28 76 2c 20 69 rseSchemaOp(v, i
1cb80 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 Db,.
1cb90 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 sqlite3MPrintf(d
1cba0 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27 20 41 4e b, "name='%q' AN
1cbb0 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c D type='index'",
1cbc0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 pIndex->zName))
1cbd0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 ;. sqlite
1cbe0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 3VdbeAddOp2(v, O
1cbf0 50 5f 45 78 70 69 72 65 2c 20 30 2c 20 31 29 3b P_Expire, 0, 1);
1cc00 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 . }..
1cc10 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 sqlite3VdbeJumpH
1cc20 65 72 65 28 76 2c 20 70 49 6e 64 65 78 2d 3e 74 ere(v, pIndex->t
1cc30 6e 75 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a num);. }. }.
1cc40 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e . /* When addin
1cc50 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68 g an index to th
1cc60 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 e list of indice
1cc70 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d s for a table, m
1cc80 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c ake. ** sure al
1cc90 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65 l indices labele
1cca0 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d d OE_Replace com
1ccb0 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73 e after all thos
1ccc0 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f e labeled. ** O
1ccd0 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20 E_Ignore. This
1cce0 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72 is necessary for
1ccf0 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6e the correct con
1cd00 73 74 72 61 69 6e 74 20 63 68 65 63 6b 0a 20 20 straint check.
1cd10 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20 28 69 ** processing (i
1cd20 6e 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 n sqlite3Generat
1cd30 65 43 6f 6e 73 74 72 61 69 6e 74 43 68 65 63 6b eConstraintCheck
1cd40 73 28 29 29 20 61 73 20 70 61 72 74 20 6f 66 0a s()) as part of.
1cd50 20 20 2a 2a 20 55 50 44 41 54 45 20 61 6e 64 20 ** UPDATE and
1cd60 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 INSERT statement
1cd70 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 s. . */. if(
1cd80 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c db->init.busy ||
1cd90 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a pTblName==0 ){.
1cda0 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 if( onError!
1cdb0 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 =OE_Replace || p
1cdc0 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 Tab->pIndex==0.
1cdd0 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62 2d || pTab-
1cde0 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 >pIndex->onError
1cdf0 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 ==OE_Replace){.
1ce00 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 pIndex->pNe
1ce10 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 xt = pTab->pInde
1ce20 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 70 x;. pTab->p
1ce30 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a Index = pIndex;.
1ce40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
1ce50 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20 3d Index *pOther =
1ce60 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 pTab->pIndex;.
1ce70 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74 68 while( pOth
1ce80 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 er->pNext && pOt
1ce90 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 her->pNext->onEr
1cea0 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 ror!=OE_Replace
1ceb0 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68 65 ){. pOthe
1cec0 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 r = pOther->pNex
1ced0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 t;. }.
1cee0 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d pIndex->pNext =
1cef0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a pOther->pNext;.
1cf00 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e pOther->pN
1cf10 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 ext = pIndex;.
1cf20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20 3d }. pIndex =
1cf30 20 30 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 0;. }. else i
1cf40 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a f( IN_RENAME_OBJ
1cf50 45 43 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 ECT ){. asser
1cf60 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 49 t( pParse->pNewI
1cf70 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 70 ndex==0 );. p
1cf80 50 61 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78 Parse->pNewIndex
1cf90 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70 = pIndex;. p
1cfa0 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a Index = 0;. }..
1cfb0 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 /* Clean up be
1cfc0 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a fore exiting */.
1cfd0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 exit_create_inde
1cfe0 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 x:. if( pIndex
1cff0 29 20 73 71 6c 69 74 65 33 46 72 65 65 49 6e 64 ) sqlite3FreeInd
1d000 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a ex(db, pIndex);.
1d010 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c sqlite3ExprDel
1d020 65 74 65 28 64 62 2c 20 70 50 49 57 68 65 72 65 ete(db, pPIWhere
1d030 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 );. sqlite3Expr
1d040 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 ListDelete(db, p
1d050 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 List);. sqlite3
1d060 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 SrcListDelete(db
1d070 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 , pTblName);. s
1d080 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
1d090 20 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a zName);.}../*.*
1d0a0 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 * Fill the Index
1d0b0 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 .aiRowEst[] arra
1d0c0 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 y with default i
1d0d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 nformation - inf
1d0e0 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 ormation.** to b
1d0f0 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 e used when we h
1d100 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 ave not run the
1d110 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e ANALYZE command.
1d120 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b .**.** aiRowEst[
1d130 30 5d 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 0] is supposed t
1d140 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 o contain the nu
1d150 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 mber of elements
1d160 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a in the index..*
1d170 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f * Since we do no
1d180 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 t know, guess 1
1d190 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 million. aiRowE
1d1a0 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 st[1] is an esti
1d1b0 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e mate of the.** n
1d1c0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e umber of rows in
1d1d0 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 the table that
1d1e0 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 match any partic
1d1f0 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 ular value of th
1d200 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d e.** first colum
1d210 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 n of the index.
1d220 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 aiRowEst[2] is
1d230 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 an estimate of t
1d240 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 he number.** of
1d250 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 rows that match
1d260 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 any particular c
1d270 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 ombination of th
1d280 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e e first 2 column
1d290 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 s.** of the inde
1d2a0 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 x. And so forth
1d2b0 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 . It must alway
1d2c0 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 s be the case th
1d2d0 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 at.*.**
1d2e0 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 aiRowEst[N]<=a
1d2f0 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 iRowEst[N-1].**
1d300 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 aiRowE
1d310 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 st[N]>=1.**.** A
1d320 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 part from that,
1d330 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 we have little t
1d340 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 o go on besides
1d350 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a intuition as to.
1d360 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b ** how aiRowEst[
1d370 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 ] should be init
1d380 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 ialized. The nu
1d390 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 mbers generated
1d3a0 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 here.** are base
1d3b0 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c d on typical val
1d3c0 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 ues found in act
1d3d0 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a ual indices..*/.
1d3e0 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 void sqlite3Defa
1d3f0 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 ultRowEst(Index
1d400 2a 70 49 64 78 29 7b 0a 20 20 2f 2a 20 20 20 20 *pIdx){. /*
1d410 20 20 20 20 20 20 20 20 20 20 20 20 31 30 2c 20 10,
1d420 20 39 2c 20 20 38 2c 20 20 37 2c 20 20 36 20 2a 9, 8, 7, 6 *
1d430 2f 0a 20 20 4c 6f 67 45 73 74 20 61 56 61 6c 5b /. LogEst aVal[
1d440 5d 20 3d 20 7b 20 33 33 2c 20 33 32 2c 20 33 30 ] = { 33, 32, 30
1d450 2c 20 32 38 2c 20 32 36 20 7d 3b 0a 20 20 4c 6f , 28, 26 };. Lo
1d460 67 45 73 74 20 2a 61 20 3d 20 70 49 64 78 2d 3e gEst *a = pIdx->
1d470 61 69 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 69 aiRowLogEst;. i
1d480 6e 74 20 6e 43 6f 70 79 20 3d 20 4d 49 4e 28 41 nt nCopy = MIN(A
1d490 72 72 61 79 53 69 7a 65 28 61 56 61 6c 29 2c 20 rraySize(aVal),
1d4a0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 29 3b 0a pIdx->nKeyCol);.
1d4b0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 int i;.. /* I
1d4c0 6e 64 65 78 65 73 20 77 69 74 68 20 64 65 66 61 ndexes with defa
1d4d0 75 6c 74 20 72 6f 77 20 65 73 74 69 6d 61 74 65 ult row estimate
1d4e0 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 s should not hav
1d4f0 65 20 73 74 61 74 31 20 64 61 74 61 20 2a 2f 0a e stat1 data */.
1d500 20 20 61 73 73 65 72 74 28 20 21 70 49 64 78 2d assert( !pIdx-
1d510 3e 68 61 73 53 74 61 74 31 20 29 3b 0a 0a 20 20 >hasStat1 );..
1d520 2f 2a 20 53 65 74 20 74 68 65 20 66 69 72 73 74 /* Set the first
1d530 20 65 6e 74 72 79 20 28 6e 75 6d 62 65 72 20 6f entry (number o
1d540 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e f rows in the in
1d550 64 65 78 29 20 74 6f 20 74 68 65 20 65 73 74 69 dex) to the esti
1d560 6d 61 74 65 64 20 0a 20 20 2a 2a 20 6e 75 6d 62 mated . ** numb
1d570 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 er of rows in th
1d580 65 20 74 61 62 6c 65 2c 20 6f 72 20 68 61 6c 66 e table, or half
1d590 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 the number of r
1d5a0 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 ows in the table
1d5b0 0a 20 20 2a 2a 20 66 6f 72 20 61 20 70 61 72 74 . ** for a part
1d5c0 69 61 6c 20 69 6e 64 65 78 2e 20 20 20 42 75 74 ial index. But
1d5d0 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 do not let the
1d5e0 65 73 74 69 6d 61 74 65 20 64 72 6f 70 20 62 65 estimate drop be
1d5f0 6c 6f 77 20 31 30 2e 20 2a 2f 0a 20 20 61 5b 30 low 10. */. a[0
1d600 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 ] = pIdx->pTable
1d610 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a 20 20 ->nRowLogEst;.
1d620 69 66 28 20 70 49 64 78 2d 3e 70 50 61 72 74 49 if( pIdx->pPartI
1d630 64 78 57 68 65 72 65 21 3d 30 20 29 20 61 5b 30 dxWhere!=0 ) a[0
1d640 5d 20 2d 3d 20 31 30 3b 20 20 61 73 73 65 72 74 ] -= 10; assert
1d650 28 20 31 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 ( 10==sqlite3Log
1d660 45 73 74 28 32 29 20 29 3b 0a 20 20 69 66 28 20 Est(2) );. if(
1d670 61 5b 30 5d 3c 33 33 20 29 20 61 5b 30 5d 20 3d a[0]<33 ) a[0] =
1d680 20 33 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 33;
1d690 20 20 20 20 20 20 61 73 73 65 72 74 28 20 33 33 assert( 33
1d6a0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 ==sqlite3LogEst(
1d6b0 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 73 74 10) );.. /* Est
1d6c0 69 6d 61 74 65 20 74 68 61 74 20 61 5b 31 5d 20 imate that a[1]
1d6d0 69 73 20 31 30 2c 20 61 5b 32 5d 20 69 73 20 39 is 10, a[2] is 9
1d6e0 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20 61 5b 34 , a[3] is 8, a[4
1d6f0 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20 69 73 0a ] is 7, a[5] is.
1d700 20 20 2a 2a 20 36 20 61 6e 64 20 65 61 63 68 20 ** 6 and each
1d710 73 75 62 73 65 71 75 65 6e 74 20 76 61 6c 75 65 subsequent value
1d720 20 28 69 66 20 61 6e 79 29 20 69 73 20 35 2e 20 (if any) is 5.
1d730 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 61 5b */. memcpy(&a[
1d740 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70 79 2a 1], aVal, nCopy*
1d750 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 29 3b sizeof(LogEst));
1d760 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79 2b 31 . for(i=nCopy+1
1d770 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 ; i<=pIdx->nKeyC
1d780 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b ol; i++){. a[
1d790 69 5d 20 3d 20 32 33 3b 20 20 20 20 20 20 20 20 i] = 23;
1d7a0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 asse
1d7b0 72 74 28 20 32 33 3d 3d 73 71 6c 69 74 65 33 4c rt( 23==sqlite3L
1d7c0 6f 67 45 73 74 28 35 29 20 29 3b 0a 20 20 7d 0a ogEst(5) );. }.
1d7d0 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 . assert( 0==sq
1d7e0 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29 lite3LogEst(1) )
1d7f0 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 ;. if( IsUnique
1d800 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 61 5b Index(pIdx) ) a[
1d810 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d pIdx->nKeyCol] =
1d820 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 0;.}../*.** Thi
1d830 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 s routine will d
1d840 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20 rop an existing
1d850 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68 named index. Th
1d860 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d is routine.** im
1d870 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f plements the DRO
1d880 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e P INDEX statemen
1d890 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 t..*/.void sqlit
1d8a0 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73 e3DropIndex(Pars
1d8b0 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 e *pParse, SrcLi
1d8c0 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 st *pName, int i
1d8d0 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 fExists){. Inde
1d8e0 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 x *pIndex;. Vdb
1d8f0 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 e *v;. sqlite3
1d900 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 *db = pParse->db
1d910 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 ;. int iDb;..
1d920 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e assert( pParse->
1d930 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 nErr==0 ); /*
1d940 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74 Never called wit
1d950 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a h prior errors *
1d960 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c /. if( db->mall
1d970 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 ocFailed ){.
1d980 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 goto exit_drop_i
1d990 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 ndex;. }. asse
1d9a0 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d rt( pName->nSrc=
1d9b0 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 =1 );. if( SQLI
1d9c0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 TE_OK!=sqlite3Re
1d9d0 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 adSchema(pParse)
1d9e0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 ){. goto exi
1d9f0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 t_drop_index;.
1da00 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c }. pIndex = sql
1da10 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 ite3FindIndex(db
1da20 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e , pName->a[0].zN
1da30 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d ame, pName->a[0]
1da40 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 .zDatabase);. i
1da50 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a f( pIndex==0 ){.
1da60 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74 if( !ifExist
1da70 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 s ){. sqlit
1da80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 e3ErrorMsg(pPars
1da90 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 e, "no such inde
1daa0 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 x: %S", pName, 0
1dab0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 );. }else{.
1dac0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 sqlite3CodeV
1dad0 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 erifyNamedSchema
1dae0 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e (pParse, pName->
1daf0 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b a[0].zDatabase);
1db00 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 . }. pPars
1db10 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d e->checkSchema =
1db20 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 1;. goto exi
1db30 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 t_drop_index;.
1db40 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e }. if( pIndex->
1db50 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f idxType!=SQLITE_
1db60 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 29 IDXTYPE_APPDEF )
1db70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 {. sqlite3Err
1db80 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 orMsg(pParse, "i
1db90 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 ndex associated
1dba0 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 with UNIQUE ".
1dbb0 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 "or PRIMARY
1dbc0 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 KEY constraint c
1dbd0 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 annot be dropped
1dbe0 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 ", 0);. goto
1dbf0 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b exit_drop_index;
1dc00 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c . }. iDb = sql
1dc10 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 ite3SchemaToInde
1dc20 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 x(db, pIndex->pS
1dc30 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 chema);.#ifndef
1dc40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 SQLITE_OMIT_AUTH
1dc50 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 ORIZATION. {.
1dc60 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c int code = SQL
1dc70 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a ITE_DROP_INDEX;.
1dc80 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 Table *pTab
1dc90 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 = pIndex->pTable
1dca0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 ;. const char
1dcb0 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b *zDb = db->aDb[
1dcc0 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 iDb].zDbSName;.
1dcd0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a const char *z
1dce0 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 Tab = SCHEMA_TAB
1dcf0 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28 LE(iDb);. if(
1dd00 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 sqlite3AuthChec
1dd10 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 k(pParse, SQLITE
1dd20 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 _DELETE, zTab, 0
1dd30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 , zDb) ){.
1dd40 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 goto exit_drop_i
1dd50 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ndex;. }.
1dd60 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 if( !OMIT_TEMPDB
1dd70 20 26 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d && iDb ) code =
1dd80 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d SQLITE_DROP_TEM
1dd90 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 P_INDEX;. if(
1dda0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 sqlite3AuthChec
1ddb0 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 k(pParse, code,
1ddc0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 pIndex->zName, p
1ddd0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 Tab->zName, zDb)
1dde0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 ){. goto e
1ddf0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a xit_drop_index;.
1de00 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 }. }.#endif
1de10 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 .. /* Generate
1de20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 code to remove t
1de30 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f he index and fro
1de40 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 m the master tab
1de50 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 le */. v = sqli
1de60 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 te3GetVdbe(pPars
1de70 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 e);. if( v ){.
1de80 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 sqlite3BeginW
1de90 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 riteOperation(pP
1dea0 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 arse, 1, iDb);.
1deb0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 sqlite3Nested
1dec0 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 Parse(pParse,.
1ded0 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f "DELETE FRO
1dee0 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61 M %Q.%s WHERE na
1def0 6d 65 3d 25 51 20 41 4e 44 20 74 79 70 65 3d 27 me=%Q AND type='
1df00 69 6e 64 65 78 27 22 2c 0a 20 20 20 20 20 20 20 index'",.
1df10 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 44 62 db->aDb[iDb].zDb
1df20 53 4e 61 6d 65 2c 20 4d 41 53 54 45 52 5f 4e 41 SName, MASTER_NA
1df30 4d 45 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d ME, pIndex->zNam
1df40 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c e. );. sql
1df50 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62 ite3ClearStatTab
1df60 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c les(pParse, iDb,
1df70 20 22 69 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e "idx", pIndex->
1df80 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 zName);. sqli
1df90 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 te3ChangeCookie(
1dfa0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 pParse, iDb);.
1dfb0 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 destroyRootPag
1dfc0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 e(pParse, pIndex
1dfd0 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 ->tnum, iDb);.
1dfe0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 sqlite3VdbeAdd
1dff0 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e Op4(v, OP_DropIn
1e000 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 dex, iDb, 0, 0,
1e010 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 pIndex->zName, 0
1e020 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f );. }..exit_dro
1e030 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 p_index:. sqlit
1e040 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 e3SrcListDelete(
1e050 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f db, pName);.}../
1e060 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61 *.** pArray is a
1e070 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 pointer to an a
1e080 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e rray of objects.
1e090 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 Each object in
1e0a0 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 the.** array is
1e0b0 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e szEntry bytes in
1e0c0 20 73 69 7a 65 2e 20 54 68 69 73 20 72 6f 75 74 size. This rout
1e0d0 69 6e 65 20 75 73 65 73 20 73 71 6c 69 74 65 33 ine uses sqlite3
1e0e0 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 DbRealloc().** t
1e0f0 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61 72 72 o extend the arr
1e100 61 79 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 ay so that there
1e110 20 69 73 20 73 70 61 63 65 20 66 6f 72 20 61 20 is space for a
1e120 6e 65 77 20 6f 62 6a 65 63 74 20 61 74 20 74 68 new object at th
1e130 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 e end..**.** Whe
1e140 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 n this function
1e150 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e is called, *pnEn
1e160 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 try contains the
1e170 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 current size of
1e180 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20 28 69 .** the array (i
1e190 6e 20 65 6e 74 72 69 65 73 20 2d 20 73 6f 20 74 n entries - so t
1e1a0 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 he allocation is
1e1b0 20 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73 ((*pnEntry) * s
1e1c0 7a 45 6e 74 72 79 29 20 62 79 74 65 73 0a 2a 2a zEntry) bytes.**
1e1d0 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a in total)..**.*
1e1e0 2a 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 * If the realloc
1e1f0 28 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c () is successful
1e200 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d (i.e. if no OOM
1e210 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 condition occur
1e220 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 s), the.** space
1e230 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 allocated for t
1e240 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 he new object is
1e250 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 zeroed, *pnEntr
1e260 79 20 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20 y updated to.**
1e270 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77 20 reflect the new
1e280 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 size of the arra
1e290 79 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 y and a pointer
1e2a0 74 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 to the new alloc
1e2b0 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 ation.** returne
1e2c0 64 2e 20 2a 70 49 64 78 20 69 73 20 73 65 74 20 d. *pIdx is set
1e2d0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 to the index of
1e2e0 74 68 65 20 6e 65 77 20 61 72 72 61 79 20 65 6e the new array en
1e2f0 74 72 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 try in this case
1e300 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 ..**.** Otherwis
1e310 65 2c 20 69 66 20 74 68 65 20 72 65 61 6c 6c 6f e, if the reallo
1e320 63 28 29 20 66 61 69 6c 73 2c 20 2a 70 49 64 78 c() fails, *pIdx
1e330 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a is set to -1, *
1e340 70 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a pnEntry remains.
1e350 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 ** unchanged and
1e360 20 61 20 63 6f 70 79 20 6f 66 20 70 41 72 72 61 a copy of pArra
1e370 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 y returned..*/.v
1e380 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61 oid *sqlite3Arra
1e390 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c yAllocate(. sql
1e3a0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f ite3 *db, /
1e3b0 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 * Connection to
1e3c0 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 notify of malloc
1e3d0 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 failures */. v
1e3e0 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20 oid *pArray,
1e3f0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a /* Array of obj
1e400 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20 ects. Might be
1e410 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 reallocated */.
1e420 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 int szEntry,
1e430 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 /* Size of ea
1e440 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 ch object in the
1e450 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 array */. int
1e460 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a *pnEntry, /*
1e470 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 Number of objec
1e480 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 ts currently in
1e490 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 use */. int *pI
1e4a0 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 dx /* Wr
1e4b0 69 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 ite the index of
1e4c0 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 a new slot here
1e4d0 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a */.){. char *z
1e4e0 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45 ;. int n = *pnE
1e4f0 6e 74 72 79 3b 0a 20 20 69 66 28 20 28 6e 20 26 ntry;. if( (n &
1e500 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 (n-1))==0 ){.
1e510 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d 30 int sz = (n==0
1e520 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 ) ? 1 : 2*n;.
1e530 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73 71 void *pNew = sq
1e540 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 lite3DbRealloc(d
1e550 62 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a b, pArray, sz*sz
1e560 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20 Entry);. if(
1e570 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 pNew==0 ){.
1e580 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 *pIdx = -1;.
1e590 20 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 return pArray
1e5a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72 72 ;. }. pArr
1e5b0 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 ay = pNew;. }.
1e5c0 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72 z = (char*)pArr
1e5d0 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b ay;. memset(&z[
1e5e0 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c n * szEntry], 0,
1e5f0 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 szEntry);. *pI
1e600 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 dx = n;. ++*pnE
1e610 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 ntry;. return p
1e620 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 Array;.}../*.**
1e630 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 Append a new ele
1e640 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 ment to the give
1e650 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 n IdList. Creat
1e660 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 e a new IdList i
1e670 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a f.** need be..**
1e680 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 .** A new IdList
1e690 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 is returned, or
1e6a0 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 NULL if malloc(
1e6b0 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 ) fails..*/.IdLi
1e6c0 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 st *sqlite3IdLis
1e6d0 74 41 70 70 65 6e 64 28 50 61 72 73 65 20 2a 70 tAppend(Parse *p
1e6e0 50 61 72 73 65 2c 20 49 64 4c 69 73 74 20 2a 70 Parse, IdList *p
1e6f0 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f List, Token *pTo
1e700 6b 65 6e 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 ken){. sqlite3
1e710 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 *db = pParse->db
1e720 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 ;. int i;. if(
1e730 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 pList==0 ){.
1e740 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 pList = sqlite3
1e750 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c DbMallocZero(db,
1e760 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 sizeof(IdList)
1e770 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 );. if( pList
1e780 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a ==0 ) return 0;.
1e790 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d }. pList->a =
1e7a0 20 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c sqlite3ArrayAll
1e7b0 6f 63 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c ocate(. db,
1e7c0 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c . pList->a,
1e7d0 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c . sizeof(pL
1e7e0 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 ist->a[0]),.
1e7f0 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 &pList->nId,.
1e800 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 &i. );. i
1e810 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 f( i<0 ){. sq
1e820 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 lite3IdListDelet
1e830 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 e(db, pList);.
1e840 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a return 0;. }.
1e850 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e pList->a[i].zN
1e860 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d ame = sqlite3Nam
1e870 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 eFromToken(db, p
1e880 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 49 4e Token);. if( IN
1e890 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26 _RENAME_OBJECT &
1e8a0 26 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e & pList->a[i].zN
1e8b0 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 ame ){. sqlit
1e8c0 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 e3RenameTokenMap
1e8d0 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 (pParse, (void*)
1e8e0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d pList->a[i].zNam
1e8f0 65 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a e, pToken);. }.
1e900 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a return pList;.
1e910 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 }../*.** Delete
1e920 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f an IdList..*/.vo
1e930 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 id sqlite3IdList
1e940 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a Delete(sqlite3 *
1e950 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 db, IdList *pLis
1e960 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 t){. int i;. i
1e970 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 f( pList==0 ) re
1e980 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b turn;. for(i=0;
1e990 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 i<pList->nId; i
1e9a0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 ++){. sqlite3
1e9b0 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 DbFree(db, pList
1e9c0 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 ->a[i].zName);.
1e9d0 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 }. sqlite3DbFr
1e9e0 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 ee(db, pList->a)
1e9f0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 ;. sqlite3DbFre
1ea00 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a eNN(db, pList);.
1ea10 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 }../*.** Return
1ea20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69 the index in pLi
1ea30 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69 st of the identi
1ea40 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20 fier named zId.
1ea50 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 Return -1.** if
1ea60 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 not found..*/.i
1ea70 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 nt sqlite3IdList
1ea80 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c Index(IdList *pL
1ea90 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 ist, const char
1eaa0 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 *zName){. int i
1eab0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 ;. if( pList==0
1eac0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 ) return -1;.
1ead0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 for(i=0; i<pList
1eae0 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 ->nId; i++){.
1eaf0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 if( sqlite3StrI
1eb00 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e Cmp(pList->a[i].
1eb10 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 zName, zName)==0
1eb20 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d ) return i;. }
1eb30 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a . return -1;.}.
1eb40 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68 ./*.** Expand th
1eb50 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 e space allocate
1eb60 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 d for the given
1eb70 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62 SrcList object b
1eb80 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45 y.** creating nE
1eb90 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62 xtra new slots b
1eba0 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61 eginning at iSta
1ebb0 72 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a rt. iStart is z
1ebc0 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65 ero based..** Ne
1ebd0 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f w slots are zero
1ebe0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 ed..**.** For ex
1ebf0 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61 ample, suppose a
1ec00 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c SrcList initial
1ec10 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20 ly contains two
1ec20 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a entries: A,B..**
1ec30 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77 To append 3 new
1ec40 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68 entries onto th
1ec50 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a e end, do this:.
1ec60 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33 **.** sqlite3
1ec70 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 SrcListEnlarge(d
1ec80 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20 b, pSrclist, 3,
1ec90 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 2);.**.** After
1eca0 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69 the call above i
1ecb0 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a t would contain:
1ecc0 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c A, B, nil, nil
1ecd0 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 , nil..** If the
1ece0 20 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74 iStart argument
1ecf0 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74 had been 1 inst
1ed00 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74 ead of 2, then t
1ed10 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75 he result.** wou
1ed20 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41 ld have been: A
1ed30 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c , nil, nil, nil,
1ed40 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20 B. To prepend
1ed50 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a the new slots,.*
1ed60 2a 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c * the iStart val
1ed70 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20 ue would be 0.
1ed80 54 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20 The result then
1ed90 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c would.** be: nil
1eda0 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42 , nil, nil, A, B
1edb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d ..**.** If a mem
1edc0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 ory allocation f
1edd0 61 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74 ails the SrcList
1ede0 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20 is unchanged.
1edf0 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f The.** db->mallo
1ee00 63 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c cFailed flag wil
1ee10 6c 20 62 65 20 73 65 74 20 74 6f 20 74 72 75 65 l be set to true
1ee20 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 ..*/.SrcList *sq
1ee30 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 lite3SrcListEnla
1ee40 72 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a rge(. sqlite3 *
1ee50 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 db, /* Dat
1ee60 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e abase connection
1ee70 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f to notify of OO
1ee80 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72 M errors */. Sr
1ee90 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 cList *pSrc,
1eea0 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20 /* The SrcList
1eeb0 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a to be enlarged *
1eec0 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 /. int nExtra,
1eed0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
1eee0 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f of new slots to
1eef0 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b add to pSrc->a[
1ef00 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72 ] */. int iStar
1ef10 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 t /* Ind
1ef20 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20 ex in pSrc->a[]
1ef30 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f of first new slo
1ef40 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b t */.){. int i;
1ef50 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 .. /* Sanity ch
1ef60 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e ecking on callin
1ef70 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a g parameters */.
1ef80 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 assert( iStart
1ef90 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 >=0 );. assert(
1efa0 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20 nExtra>=1 );.
1efb0 61 73 73 65 72 74 28 20 70 53 72 63 21 3d 30 20 assert( pSrc!=0
1efc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 );. assert( iSt
1efd0 61 72 74 3c 3d 70 53 72 63 2d 3e 6e 53 72 63 20 art<=pSrc->nSrc
1efe0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 );.. /* Allocat
1eff0 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 e additional spa
1f000 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a ce if needed */.
1f010 20 20 69 66 28 20 28 75 33 32 29 70 53 72 63 2d if( (u32)pSrc-
1f020 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53 72 >nSrc+nExtra>pSr
1f030 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 c->nAlloc ){.
1f040 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a SrcList *pNew;.
1f050 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d int nAlloc =
1f060 20 70 53 72 63 2d 3e 6e 53 72 63 2a 32 2b 6e 45 pSrc->nSrc*2+nE
1f070 78 74 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 xtra;. int nG
1f080 6f 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 ot;. pNew = s
1f090 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 qlite3DbRealloc(
1f0a0 64 62 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 db, pSrc,.
1f0b0 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 sizeof(
1f0c0 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 *pSrc) + (nAlloc
1f0d0 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d -1)*sizeof(pSrc-
1f0e0 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 >a[0]) );. if
1f0f0 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 ( pNew==0 ){.
1f100 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d assert( db->m
1f110 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 allocFailed );.
1f120 20 20 20 20 20 72 65 74 75 72 6e 20 70 53 72 63 return pSrc
1f130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 ;. }. pSrc
1f140 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f = pNew;. nGo
1f150 74 20 3d 20 28 73 71 6c 69 74 65 33 44 62 4d 61 t = (sqlite3DbMa
1f160 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 llocSize(db, pNe
1f170 77 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 w) - sizeof(*pSr
1f180 63 29 29 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d c))/sizeof(pSrc-
1f190 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 >a[0])+1;. pS
1f1a0 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 47 6f rc->nAlloc = nGo
1f1b0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 t;. }.. /* Mov
1f1c0 65 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 e existing slots
1f1d0 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 that come after
1f1e0 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 the newly inser
1f1f0 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f ted slots. ** o
1f200 75 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f ut of the way */
1f210 0a 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e . for(i=pSrc->n
1f220 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 Src-1; i>=iStart
1f230 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 ; i--){. pSrc
1f240 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 ->a[i+nExtra] =
1f250 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a pSrc->a[i];. }.
1f260 20 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 pSrc->nSrc +=
1f270 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 nExtra;.. /* Ze
1f280 72 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c ro the newly all
1f290 6f 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a ocated slots */.
1f2a0 20 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d 3e memset(&pSrc->
1f2b0 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 a[iStart], 0, si
1f2c0 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 zeof(pSrc->a[0])
1f2d0 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 *nExtra);. for(
1f2e0 69 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74 61 i=iStart; i<iSta
1f2f0 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b rt+nExtra; i++){
1f300 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e . pSrc->a[i].
1f310 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 iCursor = -1;.
1f320 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 }.. /* Return a
1f330 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 pointer to the
1f340 65 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73 74 enlarged SrcList
1f350 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53 72 */. return pSr
1f360 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 c;.}.../*.** App
1f370 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65 20 end a new table
1f380 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76 65 name to the give
1f390 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65 61 n SrcList. Crea
1f3a0 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 te a new SrcList
1f3b0 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 if.** need be.
1f3c0 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 A new entry is
1f3d0 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 53 created in the S
1f3e0 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20 70 rcList even if p
1f3f0 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 2e 0a 2a Table is NULL..*
1f400 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20 69 *.** A SrcList i
1f410 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e s returned, or N
1f420 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 ULL if there is
1f430 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 an OOM error. T
1f440 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 he returned.** S
1f450 72 63 4c 69 73 74 20 6d 69 67 68 74 20 62 65 20 rcList might be
1f460 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 the same as the
1f470 53 72 63 4c 69 73 74 20 74 68 61 74 20 77 61 73 SrcList that was
1f480 20 69 6e 70 75 74 20 6f 72 20 69 74 20 6d 69 67 input or it mig
1f490 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f ht be.** a new o
1f4a0 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 ne. If an OOM e
1f4b0 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 73 rror does occurs
1f4c0 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69 6f 72 , then the prior
1f4d0 20 76 61 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a value of pList.
1f4e0 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 70 75 74 ** that is input
1f4f0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 to this routine
1f500 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c is automaticall
1f510 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 y freed..**.** I
1f520 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 6e f pDatabase is n
1f530 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e ot null, it mean
1f540 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65 s that the table
1f550 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c has an optional
1f560 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d .** database nam
1f570 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 e prefix. Like
1f580 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73 65 this: "database
1f590 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70 44 .table". The pD
1f5a0 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 atabase.** point
1f5b0 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6e s to the table n
1f5c0 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61 62 ame and the pTab
1f5d0 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 le points to the
1f5e0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a database name..
1f5f0 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e 61 ** The SrcList.a
1f600 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 [].zName field i
1f610 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68 s filled with th
1f620 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 e table name whi
1f630 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 ch might.** come
1f640 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 from pTable (if
1f650 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 pDatabase is NU
1f660 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 LL) or from pDat
1f670 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c abase. .** SrcL
1f680 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 ist.a[].zDatabas
1f690 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 e is filled with
1f6a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 the database na
1f6b0 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a me from pTable,.
1f6c0 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 ** or with NULL
1f6d0 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20 69 if no database i
1f6e0 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a s specified..**.
1f6f0 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 ** In other word
1f700 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 s, if call like
1f710 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 this:.**.**
1f720 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 sqlite3SrcLi
1f730 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 stAppend(D,A,B,0
1f740 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 );.**.** Then B
1f750 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 is a table name
1f760 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 and the database
1f770 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63 69 name is unspeci
1f780 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 fied. If called
1f790 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a .** like this:.*
1f7a0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c *.** sql
1f7b0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e ite3SrcListAppen
1f7c0 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a d(D,A,B,C);.**.*
1f7d0 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68 65 20 * Then C is the
1f7e0 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 table name and B
1f7f0 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 is the database
1f800 20 6e 61 6d 65 2e 20 20 49 66 20 43 20 69 73 20 name. If C is
1f810 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68 65 6e 20 defined.** then
1f820 73 6f 20 69 73 20 42 2e 20 20 49 6e 20 6f 74 68 so is B. In oth
1f830 65 72 20 77 6f 72 64 73 2c 20 77 65 20 6e 65 76 er words, we nev
1f840 65 72 20 68 61 76 65 20 61 20 63 61 73 65 20 77 er have a case w
1f850 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 here:.**.**
1f860 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 sqlite3SrcLi
1f870 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 30 2c 43 stAppend(D,A,0,C
1f880 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 70 54 );.**.** Both pT
1f890 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 able and pDataba
1f8a0 73 65 20 61 72 65 20 61 73 73 75 6d 65 64 20 74 se are assumed t
1f8b0 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20 54 68 o be quoted. Th
1f8c0 65 79 20 61 72 65 20 64 65 71 75 6f 74 65 64 0a ey are dequoted.
1f8d0 2a 2a 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 ** before being
1f8e0 61 64 64 65 64 20 74 6f 20 74 68 65 20 53 72 63 added to the Src
1f8f0 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 List..*/.SrcList
1f900 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 *sqlite3SrcList
1f910 41 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 Append(. sqlite
1f920 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 3 *db, /*
1f930 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e Connection to n
1f940 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 otify of malloc
1f950 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 failures */. Sr
1f960 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 cList *pList,
1f970 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 /* Append to t
1f980 68 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c his SrcList. NUL
1f990 4c 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 L creates a new
1f9a0 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b SrcList */. Tok
1f9b0 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 en *pTable,
1f9c0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70 /* Table to app
1f9d0 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a end */. Token *
1f9e0 70 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20 pDatabase /*
1f9f0 44 61 74 61 62 61 73 65 20 6f 66 20 74 68 65 20 Database of the
1fa00 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 table */.){. st
1fa10 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 ruct SrcList_ite
1fa20 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65 m *pItem;. asse
1fa30 72 74 28 20 70 44 61 74 61 62 61 73 65 3d 3d 30 rt( pDatabase==0
1fa40 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20 29 3b || pTable!=0 );
1fa50 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76 65 /* Cannot have
1fa60 20 43 20 77 69 74 68 6f 75 74 20 42 20 2a 2f 0a C without B */.
1fa70 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 assert( db!=0
1fa80 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d );. if( pList==
1fa90 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 0 ){. pList =
1faa0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 sqlite3DbMalloc
1fab0 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 RawNN(db, sizeof
1fac0 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 (SrcList) );.
1fad0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 if( pList==0 )
1fae0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c return 0;. pL
1faf0 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b ist->nAlloc = 1;
1fb00 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 53 72 63 . pList->nSrc
1fb10 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 = 1;. memset
1fb20 28 26 70 4c 69 73 74 2d 3e 61 5b 30 5d 2c 20 30 (&pList->a[0], 0
1fb30 2c 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e , sizeof(pList->
1fb40 61 5b 30 5d 29 29 3b 0a 20 20 20 20 70 4c 69 73 a[0]));. pLis
1fb50 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 t->a[0].iCursor
1fb60 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 = -1;. }else{.
1fb70 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 pList = sqlit
1fb80 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 e3SrcListEnlarge
1fb90 28 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 (db, pList, 1, p
1fba0 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 7d List->nSrc);. }
1fbb0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f . if( db->mallo
1fbc0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 cFailed ){. s
1fbd0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c qlite3SrcListDel
1fbe0 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a ete(db, pList);.
1fbf0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 return 0;.
1fc00 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 }. pItem = &pLi
1fc10 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 st->a[pList->nSr
1fc20 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 c-1];. if( pDat
1fc30 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61 abase && pDataba
1fc40 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 se->z==0 ){.
1fc50 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 pDatabase = 0;.
1fc60 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 }. if( pDataba
1fc70 73 65 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d se ){. pItem-
1fc80 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 >zName = sqlite3
1fc90 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 NameFromToken(db
1fca0 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20 , pDatabase);.
1fcb0 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 pItem->zDataba
1fcc0 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 se = sqlite3Name
1fcd0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 FromToken(db, pT
1fce0 61 62 6c 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a able);. }else{.
1fcf0 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 pItem->zName
1fd00 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 = sqlite3NameFr
1fd10 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 omToken(db, pTab
1fd20 6c 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e le);. pItem->
1fd30 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 zDatabase = 0;.
1fd40 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 }. return pLis
1fd50 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 t;.}../*.** Assi
1fd60 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e gn VdbeCursor in
1fd70 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 dex numbers to a
1fd80 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53 ll tables in a S
1fd90 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 rcList.*/.void s
1fda0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 qlite3SrcListAss
1fdb0 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65 ignCursors(Parse
1fdc0 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 *pParse, SrcLis
1fdd0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 t *pList){. int
1fde0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 i;. struct Src
1fdf0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d List_item *pItem
1fe00 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73 74 ;. assert(pList
1fe10 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e || pParse->db->
1fe20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a mallocFailed );.
1fe30 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 if( pList ){.
1fe40 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 for(i=0, pIte
1fe50 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c m=pList->a; i<pL
1fe60 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 ist->nSrc; i++,
1fe70 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 pItem++){.
1fe80 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 if( pItem->iCurs
1fe90 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 or>=0 ) break;.
1fea0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 pItem->iCur
1feb0 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 sor = pParse->nT
1fec0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 ab++;. if(
1fed0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 pItem->pSelect )
1fee0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 {. sqlite
1fef0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 3SrcListAssignCu
1ff00 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49 rsors(pParse, pI
1ff10 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 tem->pSelect->pS
1ff20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 rc);. }.
1ff30 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 }. }.}../*.**
1ff40 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 Delete an entire
1ff50 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 SrcList includi
1ff60 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74 ng all its subst
1ff70 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 ructure..*/.void
1ff80 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 sqlite3SrcListD
1ff90 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 elete(sqlite3 *d
1ffa0 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 b, SrcList *pLis
1ffb0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 t){. int i;. s
1ffc0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 truct SrcList_it
1ffd0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 em *pItem;. if(
1ffe0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 pList==0 ) retu
1fff0 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d rn;. for(pItem=
20000 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 pList->a, i=0; i
20010 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b <pList->nSrc; i+
20020 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 +, pItem++){.
20030 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 sqlite3DbFree(d
20040 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 b, pItem->zDatab
20050 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 ase);. sqlite
20060 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 3DbFree(db, pIte
20070 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 m->zName);. s
20080 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
20090 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b pItem->zAlias);
200a0 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e . if( pItem->
200b0 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 fg.isIndexedBy )
200c0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 sqlite3DbFree(d
200d0 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e b, pItem->u1.zIn
200e0 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 69 66 dexedBy);. if
200f0 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 ( pItem->fg.isTa
20100 62 46 75 6e 63 20 29 20 73 71 6c 69 74 65 33 45 bFunc ) sqlite3E
20110 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 xprListDelete(db
20120 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e , pItem->u1.pFun
20130 63 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 cArg);. sqlit
20140 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 e3DeleteTable(db
20150 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a , pItem->pTab);.
20160 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 sqlite3Selec
20170 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 tDelete(db, pIte
20180 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 m->pSelect);.
20190 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 sqlite3ExprDele
201a0 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f te(db, pItem->pO
201b0 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 n);. sqlite3I
201c0 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 dListDelete(db,
201d0 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a pItem->pUsing);.
201e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 }. sqlite3DbF
201f0 72 65 65 4e 4e 28 64 62 2c 20 70 4c 69 73 74 29 reeNN(db, pList)
20200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 ;.}../*.** This
20210 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 routine is calle
20220 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 d by the parser
20230 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 to add a new ter
20240 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 m to the.** end
20250 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f of a growing FRO
20260 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 M clause. The "
20270 70 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 p" parameter is
20280 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 the part of.** t
20290 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 he FROM clause t
202a0 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 hat has already
202b0 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 been constructed
202c0 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a . "p" is NULL.*
202d0 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 * if this is the
202e0 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 first term of t
202f0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 he FROM clause.
20300 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 pTable and pDat
20310 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 abase.** are the
20320 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 name of the tab
20330 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 le and database
20340 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f named in the FRO
20350 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a M clause term..*
20360 2a 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e * pDatabase is N
20370 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 ULL if the datab
20380 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 ase name qualifi
20390 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 er is missing -
203a0 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 the.** usual cas
203b0 65 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 e. If the term
203c0 68 61 73 20 61 6e 20 61 6c 69 61 73 2c 20 74 68 has an alias, th
203d0 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 en pAlias points
203e0 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 to the.** alias
203f0 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 token. If the
20400 74 65 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 term is a subque
20410 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 ry, then pSubque
20420 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c ry is the.** SEL
20430 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 ECT statement th
20440 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79 20 at the subquery
20450 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 encodes. The pT
20460 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 able and.** pDat
20470 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 abase parameters
20480 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 are NULL for su
20490 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 bqueries. The p
204a0 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a On and pUsing.**
204b0 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 parameters are
204c0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 the content of t
204d0 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 he ON and USING
204e0 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 clauses..**.** R
204f0 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c eturn a new SrcL
20500 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 ist which encode
20510 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 s is the FROM wi
20520 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 th the new.** te
20530 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 rm added..*/.Src
20540 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 List *sqlite3Src
20550 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 ListAppendFromTe
20560 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 rm(. Parse *pPa
20570 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a rse, /*
20580 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 Parsing context
20590 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 */. SrcList *p
205a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a , /*
205b0 20 54 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f The left part o
205c0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 f the FROM claus
205d0 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a e already seen *
205e0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c /. Token *pTabl
205f0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e e, /* N
20600 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 ame of the table
20610 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 to add to the F
20620 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 ROM clause */.
20630 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 Token *pDatabase
20640 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 , /* Name
20650 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 of the database
20660 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c containing pTabl
20670 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 e */. Token *pA
20680 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f lias, /
20690 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 * The right-hand
206a0 20 73 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 side of the AS
206b0 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f subexpression */
206c0 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 . Select *pSubq
206d0 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 uery, /* A
206e0 73 75 62 71 75 65 72 79 20 75 73 65 64 20 69 6e subquery used in
206f0 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c place of a tabl
20700 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 e name */. Expr
20710 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 *pOn,
20720 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c /* The ON cl
20730 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a ause of a join *
20740 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 /. IdList *pUsi
20750 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 ng /* T
20760 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 he USING clause
20770 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a of a join */.){.
20780 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 struct SrcList
20790 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 _item *pItem;.
207a0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 sqlite3 *db = pP
207b0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 arse->db;. if(
207c0 21 70 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 !p && (pOn || pU
207d0 73 69 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c sing) ){. sql
207e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 ite3ErrorMsg(pPa
207f0 72 73 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 rse, "a JOIN cla
20800 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20 use is required
20810 62 65 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 before %s", .
20820 20 20 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a (pOn ? "ON" :
20830 20 22 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b "USING"). );
20840 0a 20 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 . goto append
20850 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d _from_error;. }
20860 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 . p = sqlite3Sr
20870 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 cListAppend(db,
20880 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 p, pTable, pData
20890 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d base);. if( p==
208a0 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70 0 ){. goto ap
208b0 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b pend_from_error;
208c0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 . }. assert( p
208d0 2d 3e 6e 53 72 63 3e 30 20 29 3b 0a 20 20 70 49 ->nSrc>0 );. pI
208e0 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e tem = &p->a[p->n
208f0 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 49 4e Src-1];. if( IN
20900 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 26 _RENAME_OBJECT &
20910 26 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 & pItem->zName )
20920 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 6f {. Token *pTo
20930 6b 65 6e 20 3d 20 28 70 44 61 74 61 62 61 73 65 ken = (pDatabase
20940 20 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a && pDatabase->z
20950 29 20 3f 20 70 44 61 74 61 62 61 73 65 20 3a 20 ) ? pDatabase :
20960 70 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69 pTable;. sqli
20970 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 te3RenameTokenMa
20980 70 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d p(pParse, pItem-
20990 3e 7a 4e 61 6d 65 2c 20 70 54 6f 6b 65 6e 29 3b >zName, pToken);
209a0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 . }. assert( p
209b0 41 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 Alias!=0 );. if
209c0 28 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 ( pAlias->n ){.
209d0 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 pItem->zAlias
209e0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 = sqlite3NameFr
209f0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 omToken(db, pAli
20a00 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d as);. }. pItem
20a10 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 ->pSelect = pSub
20a20 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e query;. pItem->
20a30 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 pOn = pOn;. pIt
20a40 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 em->pUsing = pUs
20a50 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b ing;. return p;
20a60 0a 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 .. append_from_e
20a70 72 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20 rror:. assert(
20a80 70 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 p==0 );. sqlite
20a90 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 3ExprDelete(db,
20aa0 70 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 pOn);. sqlite3I
20ab0 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 dListDelete(db,
20ac0 70 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 pUsing);. sqlit
20ad0 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 e3SelectDelete(d
20ae0 62 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20 b, pSubquery);.
20af0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a return 0;.}../*
20b00 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58 .** Add an INDEX
20b10 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 ED BY or NOT IND
20b20 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74 EXED clause to t
20b30 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 he most recently
20b40 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 added .** eleme
20b50 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 nt of the source
20b60 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 -list passed as
20b70 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d the second argum
20b80 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c ent..*/.void sql
20b90 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 ite3SrcListIndex
20ba0 65 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 edBy(Parse *pPar
20bb0 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 se, SrcList *p,
20bc0 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 Token *pIndexedB
20bd0 79 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 y){. assert( pI
20be0 6e 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 ndexedBy!=0 );.
20bf0 20 69 66 28 20 70 20 26 26 20 70 49 6e 64 65 78 if( p && pIndex
20c00 65 64 42 79 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 edBy->n>0 ){.
20c10 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f struct SrcList_
20c20 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 item *pItem;.
20c30 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 53 72 63 assert( p->nSrc
20c40 3e 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 20 >0 );. pItem
20c50 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d = &p->a[p->nSrc-
20c60 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 1];. assert(
20c70 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 pItem->fg.notInd
20c80 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 exed==0 );. a
20c90 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 ssert( pItem->fg
20ca0 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 .isIndexedBy==0
20cb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 );. assert( p
20cc0 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 Item->fg.isTabFu
20cd0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 nc==0 );. if(
20ce0 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d pIndexedBy->n==
20cf0 31 20 26 26 20 21 70 49 6e 64 65 78 65 64 42 79 1 && !pIndexedBy
20d00 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 ->z ){. /*
20d10 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 A "NOT INDEXED"
20d20 63 6c 61 75 73 65 20 77 61 73 20 73 75 70 70 6c clause was suppl
20d30 69 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79 ied. See parse.y
20d40 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 . ** const
20d50 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 ruct "indexed_op
20d60 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 t" for details.
20d70 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e */. pItem->
20d80 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 fg.notIndexed =
20d90 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 1;. }else{.
20da0 20 20 20 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 pItem->u1.zI
20db0 6e 64 65 78 65 64 42 79 20 3d 20 73 71 6c 69 74 ndexedBy = sqlit
20dc0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 e3NameFromToken(
20dd0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 pParse->db, pInd
20de0 65 78 65 64 42 79 29 3b 0a 20 20 20 20 20 20 70 exedBy);. p
20df0 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 Item->fg.isIndex
20e00 65 64 42 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a edBy = 1;. }.
20e10 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 }.}../*.** Add
20e20 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 75 6e the list of fun
20e30 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 ction arguments
20e40 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 to the SrcList e
20e50 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20 74 61 ntry for a.** ta
20e60 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 ble-valued-funct
20e70 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c ion..*/.void sql
20e80 69 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63 41 ite3SrcListFuncA
20e90 72 67 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 rgs(Parse *pPars
20ea0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 45 e, SrcList *p, E
20eb0 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b xprList *pList){
20ec0 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 . if( p ){.
20ed0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 struct SrcList_i
20ee0 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d tem *pItem = &p-
20ef0 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 >a[p->nSrc-1];.
20f00 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d assert( pItem
20f10 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d ->fg.notIndexed=
20f20 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 =0 );. assert
20f30 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e ( pItem->fg.isIn
20f40 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 dexedBy==0 );.
20f50 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d assert( pItem-
20f60 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 >fg.isTabFunc==0
20f70 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 );. pItem->u
20f80 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4c 69 1.pFuncArg = pLi
20f90 73 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 66 st;. pItem->f
20fa0 67 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 31 3b g.isTabFunc = 1;
20fb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 . }else{. sq
20fc0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c lite3ExprListDel
20fd0 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 ete(pParse->db,
20fe0 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f pList);. }.}../
20ff0 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 *.** When buildi
21000 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 ng up a FROM cla
21010 75 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 use in the parse
21020 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 r, the join oper
21030 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 ator.** is initi
21040 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f ally attached to
21050 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e the left operan
21060 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 d. But the code
21070 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 generator.** ex
21080 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f pects the join o
21090 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e perator to be on
210a0 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 the right opera
210b0 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e nd. This routin
210c0 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 e.** Shifts all
210d0 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 join operators f
210e0 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 rom left to righ
210f0 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 t for an entire
21100 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a FROM.** clause..
21110 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 **.** Example: S
21120 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 uppose the join
21130 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a is like this:.**
21140 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 .** A
21150 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f natural cross jo
21160 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f in B.**.** The o
21170 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 perator is "natu
21180 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e ral cross join".
21190 20 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 The A and B op
211a0 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 erands are store
211b0 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 d.** in p->a[0]
211c0 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 and p->a[1], res
211d0 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 pectively. The
211e0 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 parser initially
211f0 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f stores the.** o
21200 70 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 perator with A.
21210 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 This routine sh
21220 69 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 ifts that operat
21230 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f or over to B..*/
21240 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 .void sqlite3Src
21250 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 ListShiftJoinTyp
21260 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 e(SrcList *p){.
21270 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e if( p ){. in
21280 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 t i;. for(i=p
21290 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 ->nSrc-1; i>0; i
212a0 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b --){. p->a[
212b0 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d i].fg.jointype =
212c0 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e 6a 6f p->a[i-1].fg.jo
212d0 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 intype;. }.
212e0 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a 6f 69 p->a[0].fg.joi
212f0 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d ntype = 0;. }.}
21300 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 ../*.** Generate
21310 20 56 44 42 45 20 63 6f 64 65 20 66 6f 72 20 61 VDBE code for a
21320 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 BEGIN statement
21330 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
21340 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 3BeginTransactio
21350 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c n(Parse *pParse,
21360 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71 int type){. sq
21370 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 lite3 *db;. Vdb
21380 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a e *v;. int i;..
21390 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 assert( pParse
213a0 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 !=0 );. db = pP
213b0 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 arse->db;. asse
213c0 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 69 rt( db!=0 );. i
213d0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 f( sqlite3AuthCh
213e0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 eck(pParse, SQLI
213f0 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 TE_TRANSACTION,
21400 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 "BEGIN", 0, 0) )
21410 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 {. return;.
21420 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 }. v = sqlite3G
21430 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a etVdbe(pParse);.
21440 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72 if( !v ) retur
21450 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 n;. if( type!=T
21460 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 K_DEFERRED ){.
21470 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d for(i=0; i<db-
21480 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 >nDb; i++){.
21490 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 sqlite3VdbeAdd
214a0 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 Op2(v, OP_Transa
214b0 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d ction, i, (type=
214c0 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 =TK_EXCLUSIVE)+1
214d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 );. sqlite3
214e0 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c VdbeUsesBtree(v,
214f0 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 i);. }. }.
21500 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f sqlite3VdbeAddO
21510 70 30 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d p0(v, OP_AutoCom
21520 6d 69 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 mit);.}../*.** G
21530 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 enerate VDBE cod
21540 65 20 66 6f 72 20 61 20 43 4f 4d 4d 49 54 20 6f e for a COMMIT o
21550 72 20 52 4f 4c 4c 42 41 43 4b 20 73 74 61 74 65 r ROLLBACK state
21560 6d 65 6e 74 2e 0a 2a 2a 20 43 6f 64 65 20 66 6f ment..** Code fo
21570 72 20 52 4f 4c 4c 42 41 43 4b 20 69 73 20 67 65 r ROLLBACK is ge
21580 6e 65 72 61 74 65 64 20 69 66 20 65 54 79 70 65 nerated if eType
21590 3d 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 2e 20 20 ==TK_ROLLBACK.
215a0 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 63 6f 64 Otherwise.** cod
215b0 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 e is generated f
215c0 6f 72 20 61 20 43 4f 4d 4d 49 54 2e 0a 2a 2f 0a or a COMMIT..*/.
215d0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 void sqlite3EndT
215e0 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 ransaction(Parse
215f0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 65 54 *pParse, int eT
21600 79 70 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b ype){. Vdbe *v;
21610 0a 20 20 69 6e 74 20 69 73 52 6f 6c 6c 62 61 63 . int isRollbac
21620 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 k;.. assert( pP
21630 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 arse!=0 );. ass
21640 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 62 21 ert( pParse->db!
21650 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 =0 );. assert(
21660 65 54 79 70 65 3d 3d 54 4b 5f 43 4f 4d 4d 49 54 eType==TK_COMMIT
21670 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 45 4e || eType==TK_EN
21680 44 20 7c 7c 20 65 54 79 70 65 3d 3d 54 4b 5f 52 D || eType==TK_R
21690 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 69 73 52 OLLBACK );. isR
216a0 6f 6c 6c 62 61 63 6b 20 3d 20 65 54 79 70 65 3d ollback = eType=
216b0 3d 54 4b 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 =TK_ROLLBACK;.
216c0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 if( sqlite3AuthC
216d0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c heck(pParse, SQL
216e0 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c ITE_TRANSACTION,
216f0 20 0a 20 20 20 20 20 20 20 69 73 52 6f 6c 6c 62 . isRollb
21700 61 63 6b 20 3f 20 22 52 4f 4c 4c 42 41 43 4b 22 ack ? "ROLLBACK"
21710 20 3a 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 : "COMMIT", 0,
21720 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 0) ){. return
21730 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 ;. }. v = sqli
21740 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 te3GetVdbe(pPars
21750 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 e);. if( v ){.
21760 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 sqlite3VdbeAd
21770 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 dOp2(v, OP_AutoC
21780 6f 6d 6d 69 74 2c 20 31 2c 20 69 73 52 6f 6c 6c ommit, 1, isRoll
21790 62 61 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a back);. }.}../*
217a0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
217b0 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 n is called by t
217c0 68 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 he parser when i
217d0 74 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 t parses a comma
217e0 6e 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a nd to create,.**
217f0 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c release or roll
21800 62 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 back an SQL save
21810 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 point. .*/.void
21820 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 sqlite3Savepoint
21830 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 (Parse *pParse,
21840 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 int op, Token *p
21850 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a Name){. char *z
21860 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 Name = sqlite3Na
21870 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 meFromToken(pPar
21880 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a se->db, pName);.
21890 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 if( zName ){.
218a0 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c Vdbe *v = sql
218b0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 ite3GetVdbe(pPar
218c0 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c se);.#ifndef SQL
218d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 ITE_OMIT_AUTHORI
218e0 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 ZATION. stati
218f0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 63 c const char * c
21900 6f 6e 73 74 20 61 7a 5b 5d 20 3d 20 7b 20 22 42 onst az[] = { "B
21910 45 47 49 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 EGIN", "RELEASE"
21920 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a , "ROLLBACK" };.
21930 20 20 20 20 61 73 73 65 72 74 28 20 21 53 41 56 assert( !SAV
21940 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 EPOINT_BEGIN &&
21950 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 SAVEPOINT_RELEAS
21960 45 3d 3d 31 20 26 26 20 53 41 56 45 50 4f 49 4e E==1 && SAVEPOIN
21970 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b T_ROLLBACK==2 );
21980 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 .#endif. if(
21990 21 76 20 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 !v || sqlite3Aut
219a0 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 hCheck(pParse, S
219b0 51 4c 49 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c QLITE_SAVEPOINT,
219c0 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 az[op], zName,
219d0 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 0) ){. sqli
219e0 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 te3DbFree(pParse
219f0 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 ->db, zName);.
21a00 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 return;.
21a10 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 }. sqlite3Vdb
21a20 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 eAddOp4(v, OP_Sa
21a30 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 vepoint, op, 0,
21a40 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 0, zName, P4_DYN
21a50 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a AMIC);. }.}../*
21a60 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 .** Make sure th
21a70 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 e TEMP database
21a80 69 73 20 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 is open and avai
21a90 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 lable for use.
21aa0 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 Return.** the nu
21ab0 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 mber of errors.
21ac0 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 Leave any error
21ad0 20 6d 65 73 73 61 67 65 73 20 69 6e 20 74 68 65 messages in the
21ae0 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75 72 pParse structur
21af0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 e..*/.int sqlite
21b00 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 3OpenTempDatabas
21b10 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 e(Parse *pParse)
21b20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 {. sqlite3 *db
21b30 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 = pParse->db;.
21b40 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 if( db->aDb[1].p
21b50 42 74 3d 3d 30 20 26 26 20 21 70 50 61 72 73 65 Bt==0 && !pParse
21b60 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 ->explain ){.
21b70 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 72 int rc;. Btr
21b80 65 65 20 2a 70 42 74 3b 0a 20 20 20 20 73 74 61 ee *pBt;. sta
21b90 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c tic const int fl
21ba0 61 67 73 20 3d 20 0a 20 20 20 20 20 20 20 20 20 ags = .
21bb0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 SQLITE_OPEN_REA
21bc0 44 57 52 49 54 45 20 7c 0a 20 20 20 20 20 20 20 DWRITE |.
21bd0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 SQLITE_OPEN_C
21be0 52 45 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 REATE |.
21bf0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 SQLITE_OPEN_EX
21c00 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20 20 CLUSIVE |.
21c10 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f SQLITE_OPEN_
21c20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a DELETEONCLOSE |.
21c30 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 SQLITE
21c40 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a _OPEN_TEMP_DB;..
21c50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
21c60 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 BtreeOpen(db->pV
21c70 66 73 2c 20 30 2c 20 64 62 2c 20 26 70 42 74 2c fs, 0, db, &pBt,
21c80 20 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 0, flags);.
21c90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f if( rc!=SQLITE_O
21ca0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 K ){. sqlit
21cb0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 e3ErrorMsg(pPars
21cc0 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 e, "unable to op
21cd0 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 64 en a temporary d
21ce0 61 74 61 62 61 73 65 20 22 0a 20 20 20 20 20 20 atabase ".
21cf0 20 20 22 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 "file for stor
21d00 69 6e 67 20 74 65 6d 70 6f 72 61 72 79 20 74 61 ing temporary ta
21d10 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 70 50 bles");. pP
21d20 61 72 73 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 arse->rc = rc;.
21d30 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 return 1;.
21d40 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 44 62 }. db->aDb
21d50 5b 31 5d 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 [1].pBt = pBt;.
21d60 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 assert( db->a
21d70 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b Db[1].pSchema );
21d80 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f . if( SQLITE_
21d90 4e 4f 4d 45 4d 3d 3d 73 71 6c 69 74 65 33 42 74 NOMEM==sqlite3Bt
21da0 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 reeSetPageSize(p
21db0 42 74 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 Bt, db->nextPage
21dc0 73 69 7a 65 2c 20 2d 31 2c 20 30 29 20 29 7b 0a size, -1, 0) ){.
21dd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d sqlite3Oom
21de0 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 20 Fault(db);.
21df0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d return 1;. }
21e00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b . }. return 0;
21e10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 .}../*.** Record
21e20 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 the fact that t
21e30 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 he schema cookie
21e40 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 will need to be
21e50 20 76 65 72 69 66 69 65 64 0a 2a 2a 20 66 6f 72 verified.** for
21e60 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 20 database iDb.
21e70 54 68 65 20 63 6f 64 65 20 74 6f 20 61 63 74 75 The code to actu
21e80 61 6c 6c 79 20 76 65 72 69 66 79 20 74 68 65 20 ally verify the
21e90 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a schema cookie.**
21ea0 20 77 69 6c 6c 20 6f 63 63 75 72 20 61 74 20 74 will occur at t
21eb0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 74 6f he end of the to
21ec0 70 2d 6c 65 76 65 6c 20 56 44 42 45 20 61 6e 64 p-level VDBE and
21ed0 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61 74 will be generat
21ee0 65 64 0a 2a 2a 20 6c 61 74 65 72 2c 20 62 79 20 ed.** later, by
21ef0 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 sqlite3FinishCod
21f00 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 ing()..*/.void s
21f10 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 qlite3CodeVerify
21f20 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 Schema(Parse *pP
21f30 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a arse, int iDb){.
21f40 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 Parse *pToplev
21f50 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 el = sqlite3Pars
21f60 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 eToplevel(pParse
21f70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 44 );.. assert( iD
21f80 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61 72 b>=0 && iDb<pPar
21f90 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 se->db->nDb );.
21fa0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d assert( pParse-
21fb0 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 >db->aDb[iDb].pB
21fc0 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29 t!=0 || iDb==1 )
21fd0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3c ;. assert( iDb<
21fe0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 SQLITE_MAX_ATTAC
21ff0 48 45 44 2b 32 20 29 3b 0a 20 20 61 73 73 65 72 HED+2 );. asser
22000 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 t( sqlite3Schema
22010 4d 75 74 65 78 48 65 6c 64 28 70 50 61 72 73 65 MutexHeld(pParse
22020 2d 3e 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b ->db, iDb, 0) );
22030 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 54 65 73 . if( DbMaskTes
22040 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f t(pToplevel->coo
22050 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30 kieMask, iDb)==0
22060 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 ){. DbMaskSe
22070 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f t(pToplevel->coo
22080 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 kieMask, iDb);.
22090 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d if( !OMIT_TEM
220a0 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b PDB && iDb==1 ){
220b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 . sqlite3Op
220c0 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 70 enTempDatabase(p
220d0 54 6f 70 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d Toplevel);. }
220e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 . }.}../*.** If
220f0 20 61 72 67 75 6d 65 6e 74 20 7a 44 62 20 69 73 argument zDb is
22100 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 61 6c 6c NULL, then call
22110 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 sqlite3CodeVeri
22120 66 79 53 63 68 65 6d 61 28 29 20 66 6f 72 20 65 fySchema() for e
22130 61 63 68 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 ach .** attached
22140 20 64 61 74 61 62 61 73 65 2e 20 4f 74 68 65 72 database. Other
22150 77 69 73 65 2c 20 69 6e 76 6f 6b 65 20 69 74 20 wise, invoke it
22160 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 for the database
22170 20 6e 61 6d 65 64 20 7a 44 62 20 6f 6e 6c 79 2e named zDb only.
22180 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
22190 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 CodeVerifyNamedS
221a0 63 68 65 6d 61 28 50 61 72 73 65 20 2a 70 50 61 chema(Parse *pPa
221b0 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 rse, const char
221c0 2a 7a 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 *zDb){. sqlite3
221d0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 *db = pParse->d
221e0 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f b;. int i;. fo
221f0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 r(i=0; i<db->nDb
22200 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a ; i++){. Db *
22210 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 pDb = &db->aDb[i
22220 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e ];. if( pDb->
22230 70 42 74 20 26 26 20 28 21 7a 44 62 20 7c 7c 20 pBt && (!zDb ||
22240 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 0==sqlite3StrICm
22250 70 28 7a 44 62 2c 20 70 44 62 2d 3e 7a 44 62 53 p(zDb, pDb->zDbS
22260 4e 61 6d 65 29 29 20 29 7b 0a 20 20 20 20 20 20 Name)) ){.
22270 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 sqlite3CodeVerif
22280 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 ySchema(pParse,
22290 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a i);. }. }.}.
222a0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 ./*.** Generate
222b0 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20 70 VDBE code that p
222c0 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69 6e repares for doin
222d0 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 g an operation t
222e0 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 hat.** might cha
222f0 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73 65 nge the database
22300 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 ..**.** This rou
22310 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e 65 tine starts a ne
22320 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 w transaction if
22330 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 we are not alre
22340 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 ady within.** a
22350 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 transaction. If
22360 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 we are already
22370 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 within a transac
22380 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 tion, then a che
22390 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 ckpoint.** is se
223a0 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61 74 t if the setStat
223b0 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20 ement parameter
223c0 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65 63 is true. A chec
223d0 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a kpoint should.**
223e0 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65 72 be set for oper
223f0 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 ations that migh
22400 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20 61 t fail (due to a
22410 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61 72 constraint) par
22420 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 t of.** the way
22430 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69 63 through and whic
22440 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 h will need to u
22450 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73 20 ndo some writes
22460 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 without having t
22470 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 o.** rollback th
22480 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 e whole transact
22490 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 ion. For operat
224a0 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20 63 ions where all c
224b0 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 onstraints.** ca
224c0 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65 66 n be checked bef
224d0 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 ore any changes
224e0 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 are made to the
224f0 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73 20 database, it is
22500 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 never.** necessa
22510 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 ry to undo a wri
22520 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b te and the check
22530 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 point should not
22540 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 be set..*/.void
22550 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 sqlite3BeginWri
22560 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 teOperation(Pars
22570 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 e *pParse, int s
22580 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 etStatement, int
22590 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65 20 2a iDb){. Parse *
225a0 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 pToplevel = sqli
225b0 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c te3ParseToplevel
225c0 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 (pParse);. sqli
225d0 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 te3CodeVerifySch
225e0 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 ema(pParse, iDb)
225f0 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 54 ;. DbMaskSet(pT
22600 6f 70 6c 65 76 65 6c 2d 3e 77 72 69 74 65 4d 61 oplevel->writeMa
22610 73 6b 2c 20 69 44 62 29 3b 0a 20 20 70 54 6f 70 sk, iDb);. pTop
22620 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 level->isMultiWr
22630 69 74 65 20 7c 3d 20 73 65 74 53 74 61 74 65 6d ite |= setStatem
22640 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e ent;.}../*.** In
22650 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 dicate that the
22660 73 74 61 74 65 6d 65 6e 74 20 63 75 72 72 65 6e statement curren
22670 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 tly under constr
22680 75 63 74 69 6f 6e 20 6d 69 67 68 74 20 77 72 69 uction might wri
22690 74 65 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 te.** more than
226a0 6f 6e 65 20 65 6e 74 72 79 20 28 65 78 61 6d 70 one entry (examp
226b0 6c 65 3a 20 64 65 6c 65 74 69 6e 67 20 6f 6e 65 le: deleting one
226c0 20 72 6f 77 20 74 68 65 6e 20 69 6e 73 65 72 74 row then insert
226d0 69 6e 67 20 61 6e 6f 74 68 65 72 2c 0a 2a 2a 20 ing another,.**
226e0 69 6e 73 65 72 74 69 6e 67 20 6d 75 6c 74 69 70 inserting multip
226f0 6c 65 20 72 6f 77 73 20 69 6e 20 61 20 74 61 62 le rows in a tab
22700 6c 65 2c 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 le, or inserting
22710 20 61 20 72 6f 77 20 61 6e 64 20 69 6e 64 65 78 a row and index
22720 20 65 6e 74 72 69 65 73 2e 29 0a 2a 2a 20 49 66 entries.).** If
22730 20 61 6e 20 61 62 6f 72 74 20 6f 63 63 75 72 73 an abort occurs
22740 20 61 66 74 65 72 20 73 6f 6d 65 20 6f 66 20 74 after some of t
22750 68 65 73 65 20 77 72 69 74 65 73 20 68 61 76 65 hese writes have
22760 20 63 6f 6d 70 6c 65 74 65 64 2c 20 74 68 65 6e completed, then
22770 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 6e it will.** be n
22780 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f ecessary to undo
22790 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 64 20 77 the completed w
227a0 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 rites..*/.void s
227b0 71 6c 69 74 65 33 4d 75 6c 74 69 57 72 69 74 65 qlite3MultiWrite
227c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b (Parse *pParse){
227d0 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 . Parse *pTople
227e0 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 vel = sqlite3Par
227f0 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 seToplevel(pPars
22800 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d e);. pToplevel-
22810 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 3d 20 >isMultiWrite =
22820 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 1;.}../* .** The
22830 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 code generator
22840 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 calls this routi
22850 6e 65 20 69 66 20 69 73 20 64 69 73 63 6f 76 65 ne if is discove
22860 72 73 20 74 68 61 74 20 69 74 20 69 73 0a 2a 2a rs that it is.**
22870 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 62 6f possible to abo
22880 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 70 rt a statement p
22890 72 69 6f 72 20 74 6f 20 63 6f 6d 70 6c 65 74 69 rior to completi
228a0 6f 6e 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f on. In order to
228b0 20 0a 2a 2a 20 70 65 72 66 6f 72 6d 20 74 68 69 .** perform thi
228c0 73 20 61 62 6f 72 74 20 77 69 74 68 6f 75 74 20 s abort without
228d0 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20 64 corrupting the d
228e0 61 74 61 62 61 73 65 2c 20 77 65 20 6e 65 65 64 atabase, we need
228f0 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 to make.** sure
22900 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d that the statem
22910 65 6e 74 20 69 73 20 70 72 6f 74 65 63 74 65 64 ent is protected
22920 20 62 79 20 61 20 73 74 61 74 65 6d 65 6e 74 20 by a statement
22930 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a transaction..**.
22940 2a 2a 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 ** Technically,
22950 77 65 20 6f 6e 6c 79 20 6e 65 65 64 20 74 6f 20 we only need to
22960 73 65 74 20 74 68 65 20 6d 61 79 41 62 6f 72 74 set the mayAbort
22970 20 66 6c 61 67 20 69 66 20 74 68 65 0a 2a 2a 20 flag if the.**
22980 69 73 4d 75 6c 74 69 57 72 69 74 65 20 66 6c 61 isMultiWrite fla
22990 67 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 g was previously
229a0 20 73 65 74 2e 20 20 54 68 65 72 65 20 69 73 20 set. There is
229b0 61 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 a time dependenc
229c0 79 0a 2a 2a 20 73 75 63 68 20 74 68 61 74 20 74 y.** such that t
229d0 68 65 20 61 62 6f 72 74 20 6d 75 73 74 20 6f 63 he abort must oc
229e0 63 75 72 20 61 66 74 65 72 20 74 68 65 20 6d 75 cur after the mu
229f0 6c 74 69 77 72 69 74 65 2e 20 20 54 68 69 73 20 ltiwrite. This
22a00 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d 65 20 73 74 makes.** some st
22a10 61 74 65 6d 65 6e 74 73 20 69 6e 76 6f 6c 76 69 atements involvi
22a20 6e 67 20 74 68 65 20 52 45 50 4c 41 43 45 20 63 ng the REPLACE c
22a30 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 onflict resoluti
22a40 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 0a 2a 2a 20 on algorithm.**
22a50 67 6f 20 61 20 6c 69 74 74 6c 65 20 66 61 73 74 go a little fast
22a60 65 72 2e 20 20 42 75 74 20 74 61 6b 69 6e 67 20 er. But taking
22a70 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 69 advantage of thi
22a80 73 20 74 69 6d 65 20 64 65 70 65 6e 64 65 6e 63 s time dependenc
22a90 79 0a 2a 2a 20 6d 61 6b 65 73 20 69 74 20 6d 6f y.** makes it mo
22aa0 72 65 20 64 69 66 66 69 63 75 6c 74 20 74 6f 20 re difficult to
22ab0 70 72 6f 76 65 20 74 68 61 74 20 74 68 65 20 63 prove that the c
22ac0 6f 64 65 20 69 73 20 63 6f 72 72 65 63 74 20 28 ode is correct (
22ad0 69 6e 20 0a 2a 2a 20 70 61 72 74 69 63 75 6c 61 in .** particula
22ae0 72 2c 20 69 74 20 70 72 65 76 65 6e 74 73 20 75 r, it prevents u
22af0 73 20 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 61 s from writing a
22b00 6e 20 65 66 66 65 63 74 69 76 65 0a 2a 2a 20 69 n effective.** i
22b10 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 mplementation of
22b20 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 sqlite3AssertMa
22b30 79 41 62 6f 72 74 28 29 29 20 61 6e 64 20 73 6f yAbort()) and so
22b40 20 77 65 20 68 61 76 65 20 63 68 6f 73 65 6e 0a we have chosen.
22b50 2a 2a 20 74 6f 20 74 61 6b 65 20 74 68 65 20 73 ** to take the s
22b60 61 66 65 20 72 6f 75 74 65 20 61 6e 64 20 73 6b afe route and sk
22b70 69 70 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 ip the optimizat
22b80 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c ion..*/.void sql
22b90 69 74 65 33 4d 61 79 41 62 6f 72 74 28 50 61 72 ite3MayAbort(Par
22ba0 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 50 se *pParse){. P
22bb0 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 arse *pToplevel
22bc0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f = sqlite3ParseTo
22bd0 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a plevel(pParse);.
22be0 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 6d 61 79 pToplevel->may
22bf0 41 62 6f 72 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a Abort = 1;.}../*
22c00 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 .** Code an OP_H
22c10 61 6c 74 20 74 68 61 74 20 63 61 75 73 65 73 20 alt that causes
22c20 74 68 65 20 76 64 62 65 20 74 6f 20 72 65 74 75 the vdbe to retu
22c30 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e rn an SQLITE_CON
22c40 53 54 52 41 49 4e 54 0a 2a 2a 20 65 72 72 6f 72 STRAINT.** error
22c50 2e 20 54 68 65 20 6f 6e 45 72 72 6f 72 20 70 61 . The onError pa
22c60 72 61 6d 65 74 65 72 20 64 65 74 65 72 6d 69 6e rameter determin
22c70 65 73 20 77 68 69 63 68 20 28 69 66 20 61 6e 79 es which (if any
22c80 29 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 ) of the stateme
22c90 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72 20 63 75 72 nt.** and/or cur
22ca0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e rent transaction
22cb0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e is rolled back.
22cc0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
22cd0 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 0a HaltConstraint(.
22ce0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c Parse *pParse,
22cf0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 /* Parsing c
22d00 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 ontext */. int
22d10 65 72 72 43 6f 64 65 2c 20 20 20 20 20 20 2f 2a errCode, /*
22d20 20 65 78 74 65 6e 64 65 64 20 65 72 72 6f 72 20 extended error
22d30 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e code */. int on
22d40 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 Error, /* C
22d50 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a onstraint type *
22d60 2f 0a 20 20 63 68 61 72 20 2a 70 34 2c 20 20 20 /. char *p4,
22d70 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d /* Error m
22d80 65 73 73 61 67 65 20 2a 2f 0a 20 20 69 38 20 70 essage */. i8 p
22d90 34 74 79 70 65 2c 20 20 20 20 20 20 20 20 2f 2a 4type, /*
22da0 20 50 34 5f 53 54 41 54 49 43 20 6f 72 20 50 34 P4_STATIC or P4
22db0 5f 54 52 41 4e 53 49 45 4e 54 20 2a 2f 0a 20 20 _TRANSIENT */.
22dc0 75 38 20 70 35 45 72 72 6d 73 67 20 20 20 20 20 u8 p5Errmsg
22dd0 20 20 2f 2a 20 50 35 5f 45 72 72 4d 73 67 20 74 /* P5_ErrMsg t
22de0 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65 ype */.){. Vdbe
22df0 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 *v = sqlite3Get
22e00 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 Vdbe(pParse);.
22e10 61 73 73 65 72 74 28 20 28 65 72 72 43 6f 64 65 assert( (errCode
22e20 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 &0xff)==SQLITE_C
22e30 4f 4e 53 54 52 41 49 4e 54 20 29 3b 0a 20 20 69 ONSTRAINT );. i
22e40 66 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 f( onError==OE_A
22e50 62 6f 72 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 bort ){. sqli
22e60 74 65 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 te3MayAbort(pPar
22e70 73 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 se);. }. sqlit
22e80 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 e3VdbeAddOp4(v,
22e90 4f 50 5f 48 61 6c 74 2c 20 65 72 72 43 6f 64 65 OP_Halt, errCode
22ea0 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 70 34 , onError, 0, p4
22eb0 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 73 71 6c , p4type);. sql
22ec0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 ite3VdbeChangeP5
22ed0 28 76 2c 20 70 35 45 72 72 6d 73 67 29 3b 0a 7d (v, p5Errmsg);.}
22ee0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 ../*.** Code an
22ef0 4f 50 5f 48 61 6c 74 20 64 75 65 20 74 6f 20 55 OP_Halt due to U
22f00 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 NIQUE or PRIMARY
22f10 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 KEY constraint
22f20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f violation..*/.vo
22f30 69 64 20 73 71 6c 69 74 65 33 55 6e 69 71 75 65 id sqlite3Unique
22f40 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 Constraint(. Pa
22f50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 rse *pParse,
22f60 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 /* Parsing conte
22f70 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 xt */. int onEr
22f80 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e ror, /* Con
22f90 73 74 72 61 69 6e 74 20 74 79 70 65 20 2a 2f 0a straint type */.
22fa0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 Index *pIdx
22fb0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 /* The index
22fc0 20 74 68 61 74 20 74 72 69 67 67 65 72 73 20 74 that triggers t
22fd0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f he constraint */
22fe0 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 .){. char *zErr
22ff0 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 53 74 72 ;. int j;. Str
23000 41 63 63 75 6d 20 65 72 72 4d 73 67 3b 0a 20 20 Accum errMsg;.
23010 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 Table *pTab = pI
23020 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a 20 20 73 dx->pTable;.. s
23030 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e qlite3StrAccumIn
23040 69 74 28 26 65 72 72 4d 73 67 2c 20 70 50 61 72 it(&errMsg, pPar
23050 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 32 30 se->db, 0, 0, 20
23060 30 29 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 0);. if( pIdx->
23070 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20 20 20 20 aColExpr ){.
23080 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 sqlite3_str_appe
23090 6e 64 66 28 26 65 72 72 4d 73 67 2c 20 22 69 6e ndf(&errMsg, "in
230a0 64 65 78 20 27 25 71 27 22 2c 20 70 49 64 78 2d dex '%q'", pIdx-
230b0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 >zName);. }else
230c0 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a {. for(j=0; j
230d0 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 <pIdx->nKeyCol;
230e0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 j++){. char
230f0 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 61 73 *zCol;. as
23100 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43 6f sert( pIdx->aiCo
23110 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20 20 lumn[j]>=0 );.
23120 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62 2d zCol = pTab-
23130 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43 6f >aCol[pIdx->aiCo
23140 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b 0a lumn[j]].zName;.
23150 20 20 20 20 20 20 69 66 28 20 6a 20 29 20 73 71 if( j ) sq
23160 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 lite3_str_append
23170 28 26 65 72 72 4d 73 67 2c 20 22 2c 20 22 2c 20 (&errMsg, ", ",
23180 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 2);. sqlite
23190 33 5f 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 3_str_appendall(
231a0 26 65 72 72 4d 73 67 2c 20 70 54 61 62 2d 3e 7a &errMsg, pTab->z
231b0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c Name);. sql
231c0 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 ite3_str_append(
231d0 26 65 72 72 4d 73 67 2c 20 22 2e 22 2c 20 31 29 &errMsg, ".", 1)
231e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f ;. sqlite3_
231f0 73 74 72 5f 61 70 70 65 6e 64 61 6c 6c 28 26 65 str_appendall(&e
23200 72 72 4d 73 67 2c 20 7a 43 6f 6c 29 3b 0a 20 20 rrMsg, zCol);.
23210 20 20 7d 0a 20 20 7d 0a 20 20 7a 45 72 72 20 3d }. }. zErr =
23220 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d sqlite3StrAccum
23230 46 69 6e 69 73 68 28 26 65 72 72 4d 73 67 29 3b Finish(&errMsg);
23240 0a 20 20 73 71 6c 69 74 65 33 48 61 6c 74 43 6f . sqlite3HaltCo
23250 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c nstraint(pParse,
23260 20 0a 20 20 20 20 49 73 50 72 69 6d 61 72 79 4b . IsPrimaryK
23270 65 79 49 6e 64 65 78 28 70 49 64 78 29 20 3f 20 eyIndex(pIdx) ?
23280 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e SQLITE_CONSTRAIN
23290 54 5f 50 52 49 4d 41 52 59 4b 45 59 20 0a 20 20 T_PRIMARYKEY .
232a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
232b0 20 20 20 20 20 20 20 20 20 20 3a 20 53 51 4c 49 : SQLI
232c0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e TE_CONSTRAINT_UN
232d0 49 51 55 45 2c 0a 20 20 20 20 6f 6e 45 72 72 6f IQUE,. onErro
232e0 72 2c 20 7a 45 72 72 2c 20 50 34 5f 44 59 4e 41 r, zErr, P4_DYNA
232f0 4d 49 43 2c 20 50 35 5f 43 6f 6e 73 74 72 61 69 MIC, P5_Constrai
23300 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f ntUnique);.}.../
23310 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f *.** Code an OP_
23320 48 61 6c 74 20 64 75 65 20 74 6f 20 6e 6f 6e 2d Halt due to non-
23330 75 6e 69 71 75 65 20 72 6f 77 69 64 2e 0a 2a 2f unique rowid..*/
23340 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 77 .void sqlite3Row
23350 69 64 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 idConstraint(.
23360 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 Parse *pParse,
23370 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e /* Parsing con
23380 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e text */. int on
23390 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 43 Error, /* C
233a0 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 onflict resoluti
233b0 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a on algorithm */.
233c0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 20 20 Table *pTab
233d0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 /* The table
233e0 20 77 69 74 68 20 74 68 65 20 6e 6f 6e 2d 75 6e with the non-un
233f0 69 71 75 65 20 72 6f 77 69 64 20 2a 2f 20 0a 29 ique rowid */ .)
23400 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a {. char *zMsg;.
23410 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 int rc;. if(
23420 70 54 61 62 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 pTab->iPKey>=0 )
23430 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c {. zMsg = sql
23440 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 ite3MPrintf(pPar
23450 73 65 2d 3e 64 62 2c 20 22 25 73 2e 25 73 22 2c se->db, "%s.%s",
23460 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 pTab->zName,.
23470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23480 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 43 pTab->aC
23490 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e ol[pTab->iPKey].
234a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d zName);. rc =
234b0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 SQLITE_CONSTRAI
234c0 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 NT_PRIMARYKEY;.
234d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 73 67 }else{. zMsg
234e0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 = sqlite3MPrint
234f0 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 22 25 f(pParse->db, "%
23500 73 2e 72 6f 77 69 64 22 2c 20 70 54 61 62 2d 3e s.rowid", pTab->
23510 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d zName);. rc =
23520 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 SQLITE_CONSTRAI
23530 4e 54 5f 52 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 NT_ROWID;. }.
23540 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 sqlite3HaltConst
23550 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 72 63 raint(pParse, rc
23560 2c 20 6f 6e 45 72 72 6f 72 2c 20 7a 4d 73 67 2c , onError, zMsg,
23570 20 50 34 5f 44 59 4e 41 4d 49 43 2c 0a 20 20 20 P4_DYNAMIC,.
23580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23590 20 20 20 20 20 50 35 5f 43 6f 6e 73 74 72 61 69 P5_Constrai
235a0 6e 74 55 6e 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a ntUnique);.}../*
235b0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 .** Check to see
235c0 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20 if pIndex uses
235d0 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 the collating se
235e0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 quence pColl. R
235f0 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 eturn.** true if
23600 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c it does and fal
23610 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f se if it does no
23620 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 t..*/.#ifndef SQ
23630 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 LITE_OMIT_REINDE
23640 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c X.static int col
23650 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 lationMatch(cons
23660 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 t char *zColl, I
23670 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 ndex *pIndex){.
23680 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 int i;. assert
23690 28 20 7a 43 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 ( zColl!=0 );.
236a0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 for(i=0; i<pInde
236b0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 x->nColumn; i++)
236c0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 {. const char
236d0 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a *z = pIndex->az
236e0 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 61 73 73 Coll[i];. ass
236f0 65 72 74 28 20 7a 21 3d 30 20 7c 7c 20 70 49 6e ert( z!=0 || pIn
23700 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d dex->aiColumn[i]
23710 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 <0 );. if( pI
23720 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 ndex->aiColumn[i
23730 5d 3e 3d 30 20 26 26 20 30 3d 3d 73 71 6c 69 74 ]>=0 && 0==sqlit
23740 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f e3StrICmp(z, zCo
23750 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 ll) ){. ret
23760 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d urn 1;. }. }
23770 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 . return 0;.}.#
23780 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 endif../*.** Rec
23790 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 ompute all indic
237a0 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74 20 es of pTab that
237b0 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e use the collatin
237c0 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c g sequence pColl
237d0 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 ..** If pColl==0
237e0 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 then recompute
237f0 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 all indices of p
23800 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 Tab..*/.#ifndef
23810 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e SQLITE_OMIT_REIN
23820 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 DEX.static void
23830 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72 reindexTable(Par
23840 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c se *pParse, Tabl
23850 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f e *pTab, char co
23860 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 nst *zColl){. I
23870 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 ndex *pIndex;
23880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e /* An
23890 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 index associate
238a0 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a d with pTab */..
238b0 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 for(pIndex=pTa
238c0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 b->pIndex; pInde
238d0 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 x; pIndex=pIndex
238e0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 ->pNext){. if
238f0 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f ( zColl==0 || co
23900 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f llationMatch(zCo
23910 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 ll, pIndex) ){.
23920 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 int iDb = s
23930 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e qlite3SchemaToIn
23940 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 dex(pParse->db,
23950 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a pTab->pSchema);.
23960 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 sqlite3Beg
23970 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e inWriteOperation
23980 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 (pParse, 0, iDb)
23990 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 ;. sqlite3R
239a0 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 efillIndex(pPars
239b0 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a e, pIndex, -1);.
239c0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 }. }.}.#end
239d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 if../*.** Recomp
239e0 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 ute all indices
239f0 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e of all tables in
23a00 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 all databases w
23a10 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 here the.** indi
23a20 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c ces use the coll
23a30 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 ating sequence p
23a40 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d Coll. If pColl=
23a50 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 =0 then recomput
23a60 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 e.** all indices
23a70 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a everywhere..*/.
23a80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
23a90 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 MIT_REINDEX.stat
23aa0 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 ic void reindexD
23ab0 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20 2a atabases(Parse *
23ac0 70 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e pParse, char con
23ad0 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 st *zColl){. Db
23ae0 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 *pDb;
23af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 /* A s
23b00 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a ingle database *
23b10 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 /. int iDb;
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23b30 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 /* The database
23b40 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a index number */.
23b50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 sqlite3 *db =
23b60 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a pParse->db; /*
23b70 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f The database co
23b80 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 nnection */. Ha
23b90 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 shElem *k;
23ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 /* For
23bb0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 looping over ta
23bc0 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 bles in pDb */.
23bd0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 Table *pTab;
23be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
23bf0 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 A table in the d
23c00 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 atabase */.. as
23c10 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 sert( sqlite3Btr
23c20 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 eeHoldsAllMutexe
23c30 73 28 64 62 29 20 29 3b 20 20 2f 2a 20 4e 65 65 s(db) ); /* Nee
23c40 64 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 ded for schema a
23c50 63 63 65 73 73 20 2a 2f 0a 20 20 66 6f 72 28 69 ccess */. for(i
23c60 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 Db=0, pDb=db->aD
23c70 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 b; iDb<db->nDb;
23c80 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 iDb++, pDb++){.
23c90 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21 3d assert( pDb!=
23ca0 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 0 );. for(k=s
23cb0 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 qliteHashFirst(&
23cc0 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 pDb->pSchema->tb
23cd0 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 lHash); k; k=sq
23ce0 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 liteHashNext(k))
23cf0 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 {. pTab = (
23d00 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 Table*)sqliteHas
23d10 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 hData(k);.
23d20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 reindexTable(pPa
23d30 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c rse, pTab, zColl
23d40 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 );. }. }.}.#
23d50 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e endif../*.** Gen
23d60 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 erate code for t
23d70 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 he REINDEX comma
23d80 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 nd..**.**
23d90 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 REINDEX
23da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23db0 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 -- 1.**
23dc0 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c REINDEX <col
23dd0 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 lation>
23de0 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 -- 2.**
23df0 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c REINDEX ?<
23e00 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c database>.?<tabl
23e10 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 ename> -- 3.**
23e20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 REINDEX
23e30 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e ?<database>.?<in
23e40 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a dexname> -- 4.*
23e50 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 *.** Form 1 caus
23e60 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 es all indices i
23e70 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 n all attached d
23e80 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 atabases to be r
23e90 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 ebuilt..** Form
23ea0 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 2 rebuilds all i
23eb0 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 ndices in all da
23ec0 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65 tabases that use
23ed0 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f the named.** co
23ee0 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e llating function
23ef0 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 . Forms 3 and 4
23f00 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d rebuild the nam
23f10 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a ed index or all.
23f20 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 ** indices assoc
23f30 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e iated with the n
23f40 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 amed table..*/.#
23f50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
23f60 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 IT_REINDEX.void
23f70 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 sqlite3Reindex(P
23f80 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f arse *pParse, To
23f90 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b ken *pName1, Tok
23fa0 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 en *pName2){. C
23fb0 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 ollSeq *pColl;
23fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f /* Co
23fd0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 llating sequence
23fe0 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 to be reindexed
23ff0 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 , or NULL */. c
24000 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 har *z;
24010 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 /* Na
24020 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 me of a table or
24030 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 index */. cons
24040 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 t char *zDb;
24050 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 /* Name
24060 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 of the database
24070 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 */. Table *pTab
24080 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
24090 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 /* A table in t
240a0 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 he database */.
240b0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 Index *pIndex;
240c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
240d0 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 An index associa
240e0 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f ted with pTab */
240f0 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 . int iDb;
24100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
24110 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 * The database i
24120 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 ndex number */.
24130 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 sqlite3 *db = p
24140 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 Parse->db; /*
24150 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e The database con
24160 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b nection */. Tok
24170 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 en *pObjName;
24180 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 /* Name
24190 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 of the table or
241a0 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 index to be rei
241b0 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 ndexed */.. /*
241c0 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 Read the databas
241d0 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 e schema. If an
241e0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 error occurs, le
241f0 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 ave an error mes
24200 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f sage. ** and co
24210 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 de in pParse and
24220 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f return NULL. */
24230 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b . if( SQLITE_OK
24240 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 !=sqlite3ReadSch
24250 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 ema(pParse) ){.
24260 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a return;. }..
24270 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 if( pName1==0
24280 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 ){. reindexDa
24290 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 tabases(pParse,
242a0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 0);. return;.
242b0 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56 45 }else if( NEVE
242c0 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 R(pName2==0) ||
242d0 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a pName2->z==0 ){.
242e0 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b char *zColl;
242f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 . assert( pNa
24300 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 me1->z );. zC
24310 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d oll = sqlite3Nam
24320 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 eFromToken(pPars
24330 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a e->db, pName1);.
24340 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 if( !zColl )
24350 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f return;. pCo
24360 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 ll = sqlite3Find
24370 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 CollSeq(db, ENC(
24380 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a db), zColl, 0);.
24390 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b if( pColl ){
243a0 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44 61 . reindexDa
243b0 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 tabases(pParse,
243c0 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 zColl);. sq
243d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
243e0 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72 65 zColl);. re
243f0 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 turn;. }.
24400 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 sqlite3DbFree(db
24410 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 , zColl);. }.
24420 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f iDb = sqlite3Two
24430 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c PartName(pParse,
24440 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c pName1, pName2,
24450 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 &pObjName);. i
24460 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75 72 f( iDb<0 ) retur
24470 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 n;. z = sqlite3
24480 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 NameFromToken(db
24490 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 , pObjName);. i
244a0 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e f( z==0 ) return
244b0 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 ;. zDb = db->aD
244c0 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b b[iDb].zDbSName;
244d0 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 . pTab = sqlite
244e0 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 3FindTable(db, z
244f0 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 , zDb);. if( pT
24500 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 ab ){. reinde
24510 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 xTable(pParse, p
24520 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c Tab, 0);. sql
24530 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a ite3DbFree(db, z
24540 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 );. return;.
24550 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 }. pIndex = sq
24560 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 lite3FindIndex(d
24570 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 b, z, zDb);. sq
24580 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
24590 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 z);. if( pIndex
245a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 ){. sqlite3B
245b0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 eginWriteOperati
245c0 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 on(pParse, 0, iD
245d0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 b);. sqlite3R
245e0 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 efillIndex(pPars
245f0 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a e, pIndex, -1);.
24600 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a return;. }.
24610 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 sqlite3ErrorMs
24620 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c g(pParse, "unabl
24630 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 e to identify th
24640 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 e object to be r
24650 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 eindexed");.}.#e
24660 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 ndif../*.** Retu
24670 72 6e 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 rn a KeyInfo str
24680 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20 61 ucture that is a
24690 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 ppropriate for t
246a0 68 65 20 67 69 76 65 6e 20 49 6e 64 65 78 2e 0a he given Index..
246b0 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 **.** The caller
246c0 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 should invoke s
246d0 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 qlite3KeyInfoUnr
246e0 65 66 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75 ef() on the retu
246f0 72 6e 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 rned object.** w
24700 68 65 6e 20 69 74 20 68 61 73 20 66 69 6e 69 73 hen it has finis
24710 68 65 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f hed using it..*/
24720 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 .KeyInfo *sqlite
24730 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 3KeyInfoOfIndex(
24740 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 Parse *pParse, I
24750 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 ndex *pIdx){. i
24760 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c nt i;. int nCol
24770 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e = pIdx->nColumn
24780 3b 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 ;. int nKey = p
24790 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 Idx->nKeyCol;.
247a0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 KeyInfo *pKey;.
247b0 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 if( pParse->nEr
247c0 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 r ) return 0;.
247d0 69 66 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f if( pIdx->uniqNo
247e0 74 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65 tNull ){. pKe
247f0 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e y = sqlite3KeyIn
24800 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e foAlloc(pParse->
24810 64 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e db, nKey, nCol-n
24820 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 Key);. }else{.
24830 20 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 pKey = sqlite
24840 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 3KeyInfoAlloc(pP
24850 61 72 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 arse->db, nCol,
24860 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b 0);. }. if( pK
24870 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 ey ){. assert
24880 28 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f ( sqlite3KeyInfo
24890 49 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 IsWriteable(pKey
248a0 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 ) );. for(i=0
248b0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a ; i<nCol; i++){.
248c0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 const char
248d0 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e *zColl = pIdx->
248e0 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 azColl[i];.
248f0 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 pKey->aColl[i]
24900 3d 20 7a 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33 = zColl==sqlite3
24910 53 74 72 42 49 4e 41 52 59 20 3f 20 30 20 3a 0a StrBINARY ? 0 :.
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
24930 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c sqlite3L
24940 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 ocateCollSeq(pPa
24950 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 rse, zColl);.
24960 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 pKey->aSortOr
24970 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 der[i] = pIdx->a
24980 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 SortOrder[i];.
24990 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72 }. if( pPar
249a0 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 se->nErr ){.
249b0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 assert( pParse
249c0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 ->rc==SQLITE_ERR
249d0 4f 52 5f 4d 49 53 53 49 4e 47 5f 43 4f 4c 4c 53 OR_MISSING_COLLS
249e0 45 51 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 EQ );. if(
249f0 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72 79 3d 3d pIdx->bNoQuery==
24a00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 0 ){. /*
24a10 44 65 61 63 74 69 76 61 74 65 20 74 68 65 20 69 Deactivate the i
24a20 6e 64 65 78 20 62 65 63 61 75 73 65 20 69 74 20 ndex because it
24a30 63 6f 6e 74 61 69 6e 73 20 61 6e 20 75 6e 6b 6e contains an unkn
24a40 6f 77 6e 20 63 6f 6c 6c 61 74 69 6e 67 0a 20 20 own collating.
24a50 20 20 20 20 20 20 2a 2a 20 73 65 71 75 65 6e 63 ** sequenc
24a60 65 2e 20 20 54 68 65 20 6f 6e 6c 79 20 77 61 79 e. The only way
24a70 20 74 6f 20 72 65 61 63 74 69 76 65 20 74 68 65 to reactive the
24a80 20 69 6e 64 65 78 20 69 73 20 74 6f 20 72 65 6c index is to rel
24a90 6f 61 64 20 74 68 65 0a 20 20 20 20 20 20 20 20 oad the.
24aa0 2a 2a 20 73 63 68 65 6d 61 2e 20 20 41 64 64 69 ** schema. Addi
24ab0 6e 67 20 74 68 65 20 6d 69 73 73 69 6e 67 20 63 ng the missing c
24ac0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 ollating sequenc
24ad0 65 20 6c 61 74 65 72 20 64 6f 65 73 20 6e 6f 74 e later does not
24ae0 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61 63 . ** reac
24af0 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 2e 20 tive the index.
24b00 20 54 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e The application
24b10 20 68 61 64 20 74 68 65 20 63 68 61 6e 63 65 20 had the chance
24b20 74 6f 20 72 65 67 69 73 74 65 72 0a 20 20 20 20 to register.
24b30 20 20 20 20 2a 2a 20 74 68 65 20 6d 69 73 73 69 ** the missi
24b40 6e 67 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74 ng index using t
24b50 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 65 65 he collation-nee
24b60 64 65 64 20 63 61 6c 6c 62 61 63 6b 2e 20 20 46 ded callback. F
24b70 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 or. ** si
24b80 6d 70 6c 69 63 69 74 79 2c 20 53 51 4c 69 74 65 mplicity, SQLite
24b90 20 77 69 6c 6c 20 6e 6f 74 20 67 69 76 65 20 74 will not give t
24ba0 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 61 he application a
24bb0 20 73 65 63 6f 6e 64 20 63 68 61 6e 63 65 2e 0a second chance..
24bc0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 */.
24bd0 20 20 20 70 49 64 78 2d 3e 62 4e 6f 51 75 65 72 pIdx->bNoQuer
24be0 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 y = 1;. p
24bf0 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 Parse->rc = SQLI
24c00 54 45 5f 45 52 52 4f 52 5f 52 45 54 52 59 3b 0a TE_ERROR_RETRY;.
24c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 }. sq
24c20 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 lite3KeyInfoUnre
24c30 66 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 70 f(pKey);. p
24c40 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 Key = 0;. }.
24c50 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 }. return pKey
24c60 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c ;.}..#ifndef SQL
24c70 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 ITE_OMIT_CTE./*
24c80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 .** This routine
24c90 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 is invoked once
24ca0 20 70 65 72 20 43 54 45 20 62 79 20 74 68 65 20 per CTE by the
24cb0 70 61 72 73 65 72 20 77 68 69 6c 65 20 70 61 72 parser while par
24cc0 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48 20 sing a .** WITH
24cd0 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 clause. .*/.With
24ce0 20 2a 73 71 6c 69 74 65 33 57 69 74 68 41 64 64 *sqlite3WithAdd
24cf0 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 (. Parse *pPars
24d00 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 e, /* P
24d10 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a arsing context *
24d20 2f 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c /. With *pWith,
24d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 /* E
24d40 78 69 73 74 69 6e 67 20 57 49 54 48 20 63 6c 61 xisting WITH cla
24d50 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a use, or NULL */.
24d60 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 Token *pName,
24d70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d /* Nam
24d80 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d e of the common-
24d90 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c table */. ExprL
24da0 69 73 74 20 2a 70 41 72 67 6c 69 73 74 2c 20 20 ist *pArglist,
24db0 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 /* Optional c
24dc0 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20 olumn name list
24dd0 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f for the table */
24de0 0a 20 20 53 65 6c 65 63 74 20 2a 70 51 75 65 72 . Select *pQuer
24df0 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 y /* Qu
24e00 65 72 79 20 75 73 65 64 20 74 6f 20 69 6e 69 74 ery used to init
24e10 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65 ialize the table
24e20 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 */.){. sqlite3
24e30 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 *db = pParse->d
24e40 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65 77 3b b;. With *pNew;
24e50 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a . char *zName;.
24e60 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 . /* Check that
24e70 20 74 68 65 20 43 54 45 20 6e 61 6d 65 20 69 73 the CTE name is
24e80 20 75 6e 69 71 75 65 20 77 69 74 68 69 6e 20 74 unique within t
24e90 68 69 73 20 57 49 54 48 20 63 6c 61 75 73 65 2e his WITH clause.
24ea0 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 If. ** not, st
24eb0 6f 72 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 ore an error in
24ec0 74 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74 the Parse struct
24ed0 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 ure. */. zName
24ee0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f = sqlite3NameFro
24ef0 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 mToken(pParse->d
24f00 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 b, pName);. if(
24f10 20 7a 4e 61 6d 65 20 26 26 20 70 57 69 74 68 20 zName && pWith
24f20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 ){. int i;.
24f30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 for(i=0; i<pWi
24f40 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a th->nCte; i++){.
24f50 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 if( sqlite
24f60 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 3StrICmp(zName,
24f70 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d pWith->a[i].zNam
24f80 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 e)==0 ){.
24f90 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 sqlite3ErrorMsg
24fa0 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 (pParse, "duplic
24fb0 61 74 65 20 57 49 54 48 20 74 61 62 6c 65 20 6e ate WITH table n
24fc0 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 ame: %s", zName)
24fd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
24fe0 20 20 7d 0a 0a 20 20 69 66 28 20 70 57 69 74 68 }.. if( pWith
24ff0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 ){. int nByt
25000 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 e = sizeof(*pWit
25010 68 29 20 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 h) + (sizeof(pWi
25020 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74 th->a[1]) * pWit
25030 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e h->nCte);. pN
25040 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 ew = sqlite3DbRe
25050 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74 68 2c alloc(db, pWith,
25060 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 nByte);. }else
25070 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c {. pNew = sql
25080 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f ite3DbMallocZero
25090 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69 (db, sizeof(*pWi
250a0 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 th));. }. asse
250b0 72 74 28 20 28 70 4e 65 77 21 3d 30 20 26 26 20 rt( (pNew!=0 &&
250c0 7a 4e 61 6d 65 21 3d 30 29 20 7c 7c 20 64 62 2d zName!=0) || db-
250d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b >mallocFailed );
250e0 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c .. if( db->mall
250f0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 ocFailed ){.
25100 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 sqlite3ExprListD
25110 65 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69 elete(db, pArgli
25120 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 st);. sqlite3
25130 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c SelectDelete(db,
25140 20 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 pQuery);. sq
25150 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
25160 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 zName);. pNew
25170 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73 = pWith;. }els
25180 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70 e{. pNew->a[p
25190 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 New->nCte].pSele
251a0 63 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20 ct = pQuery;.
251b0 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e pNew->a[pNew->n
251c0 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72 Cte].pCols = pAr
251d0 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d glist;. pNew-
251e0 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a >a[pNew->nCte].z
251f0 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 Name = zName;.
25200 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e pNew->a[pNew->
25210 6e 43 74 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20 nCte].zCteErr =
25220 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74 0;. pNew->nCt
25230 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 e++;. }.. retu
25240 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a rn pNew;.}../*.*
25250 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65 * Free the conte
25260 6e 74 73 20 6f 66 20 74 68 65 20 57 69 74 68 20 nts of the With
25270 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 object passed as
25280 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 the second argu
25290 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 ment..*/.void sq
252a0 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65 28 lite3WithDelete(
252b0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74 sqlite3 *db, Wit
252c0 68 20 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28 h *pWith){. if(
252d0 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e pWith ){. in
252e0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 t i;. for(i=0
252f0 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b ; i<pWith->nCte;
25300 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 i++){. str
25310 75 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20 uct Cte *pCte =
25320 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 &pWith->a[i];.
25330 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c sqlite3ExprL
25340 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43 istDelete(db, pC
25350 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20 te->pCols);.
25360 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 sqlite3SelectD
25370 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e elete(db, pCte->
25380 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 pSelect);.
25390 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 sqlite3DbFree(db
253a0 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a , pCte->zName);.
253b0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 }. sqlite
253c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 69 74 3DbFree(db, pWit
253d0 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 h);. }.}.#endif
253e0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c /* !defined(SQL
253f0 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f ITE_OMIT_CTE) */
25400 0a .