/ Hex Artifact Content
Login

Artifact 8512ed319aa5f7b9bbbd4e17953809e3ff398fdd:


0000: 2f 2a 0a 2a 2a 20 32 30 30 35 20 46 65 62 72 75  /*.** 2005 Febru
0010: 61 72 79 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68 65  ary 15.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou 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 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63 6f  le contains C co
0190: 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  de routines that
01a0: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
01b0: 65 20 56 44 42 45 20 63 6f 64 65 0a 2a 2a 20 74  e VDBE code.** t
01c0: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
01d0: 68 65 20 41 4c 54 45 52 20 54 41 42 4c 45 20 63  he ALTER TABLE c
01e0: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 24 49  ommand..**.** $I
01f0: 64 3a 20 61 6c 74 65 72 2e 63 2c 76 20 31 2e 33  d: alter.c,v 1.3
0200: 33 20 32 30 30 37 2f 31 30 2f 32 30 20 32 30 3a  3 2007/10/20 20:
0210: 35 38 3a 35 37 20 64 72 68 20 45 78 70 20 24 0a  58:57 drh Exp $.
0220: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  */.#include "sql
0230: 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  iteInt.h".#inclu
0240: 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a  de <ctype.h>../*
0250: 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 6e 20  .** The code in 
0260: 74 68 69 73 20 66 69 6c 65 20 6f 6e 6c 79 20 65  this file only e
0270: 78 69 73 74 73 20 69 66 20 77 65 20 61 72 65 20  xists if we are 
0280: 6e 6f 74 20 6f 6d 69 74 74 69 6e 67 20 74 68 65  not omitting the
0290: 0a 2a 2a 20 41 4c 54 45 52 20 54 41 42 4c 45 20  .** ALTER TABLE 
02a0: 6c 6f 67 69 63 20 66 72 6f 6d 20 74 68 65 20 62  logic from the b
02b0: 75 69 6c 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  uild..*/.#ifndef
02c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
02d0: 45 52 54 41 42 4c 45 0a 0a 0a 2f 2a 0a 2a 2a 20  ERTABLE.../*.** 
02e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
02f0: 20 75 73 65 64 20 62 79 20 53 51 4c 20 67 65 6e   used by SQL gen
0300: 65 72 61 74 65 64 20 74 6f 20 69 6d 70 6c 65 6d  erated to implem
0310: 65 6e 74 20 74 68 65 20 0a 2a 2a 20 41 4c 54 45  ent the .** ALTE
0320: 52 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e  R TABLE command.
0330: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
0340: 65 6e 74 20 69 73 20 74 68 65 20 74 65 78 74 20  ent is the text 
0350: 6f 66 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  of a CREATE TABL
0360: 45 20 6f 72 0a 2a 2a 20 43 52 45 41 54 45 20 49  E or.** CREATE I
0370: 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 20 54 68  NDEX command. Th
0380: 65 20 73 65 63 6f 6e 64 20 69 73 20 61 20 74 61  e second is a ta
0390: 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 74 61  ble name. The ta
03a0: 62 6c 65 20 6e 61 6d 65 20 69 6e 20 0a 2a 2a 20  ble name in .** 
03b0: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
03c0: 20 6f 72 20 43 52 45 41 54 45 20 49 4e 44 45 58   or CREATE INDEX
03d0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65   statement is re
03e0: 70 6c 61 63 65 64 20 77 69 74 68 20 74 68 65 20  placed with the 
03f0: 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  third.** argumen
0400: 74 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  t and the result
0410: 20 72 65 74 75 72 6e 65 64 2e 20 45 78 61 6d 70   returned. Examp
0420: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  les:.**.** sqlit
0430: 65 5f 72 65 6e 61 6d 65 5f 74 61 62 6c 65 28 27  e_rename_table('
0440: 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62 63  CREATE TABLE abc
0450: 28 61 2c 20 62 2c 20 63 29 27 2c 20 27 64 65 66  (a, b, c)', 'def
0460: 27 29 0a 2a 2a 20 20 20 20 20 2d 3e 20 27 43 52  ').**     -> 'CR
0470: 45 41 54 45 20 54 41 42 4c 45 20 64 65 66 28 61  EATE TABLE def(a
0480: 2c 20 62 2c 20 63 29 27 0a 2a 2a 0a 2a 2a 20 73  , b, c)'.**.** s
0490: 71 6c 69 74 65 5f 72 65 6e 61 6d 65 5f 74 61 62  qlite_rename_tab
04a0: 6c 65 28 27 43 52 45 41 54 45 20 49 4e 44 45 58  le('CREATE INDEX
04b0: 20 69 20 4f 4e 20 61 62 63 28 61 29 27 2c 20 27   i ON abc(a)', '
04c0: 64 65 66 27 29 0a 2a 2a 20 20 20 20 20 2d 3e 20  def').**     -> 
04d0: 27 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 20  'CREATE INDEX i 
04e0: 4f 4e 20 64 65 66 28 61 2c 20 62 2c 20 63 29 27  ON def(a, b, c)'
04f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0500: 72 65 6e 61 6d 65 54 61 62 6c 65 46 75 6e 63 28  renameTableFunc(
0510: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
0520: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
0530: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
0540: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
0550: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
0560: 61 72 20 63 6f 6e 73 74 20 2a 7a 53 71 6c 20 3d  ar const *zSql =
0570: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
0580: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
0590: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6f  unsigned char co
05a0: 6e 73 74 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 20  nst *zTableName 
05b0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
05c0: 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 0a  text(argv[1]);..
05d0: 20 20 69 6e 74 20 74 6f 6b 65 6e 3b 0a 20 20 54    int token;.  T
05e0: 6f 6b 65 6e 20 74 6e 61 6d 65 3b 0a 20 20 75 6e  oken tname;.  un
05f0: 73 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73  signed char cons
0600: 74 20 2a 7a 43 73 72 20 3d 20 7a 53 71 6c 3b 0a  t *zCsr = zSql;.
0610: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20    int len = 0;. 
0620: 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20   char *zRet;..  
0630: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
0640: 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28  lite3_user_data(
0650: 63 6f 6e 74 65 78 74 29 3b 0a 0a 20 20 2f 2a 20  context);..  /* 
0660: 54 68 65 20 70 72 69 6e 63 69 70 6c 65 20 75 73  The principle us
0670: 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65  ed to locate the
0680: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74   table name in t
0690: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
06a0: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
06b0: 69 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  is that the tabl
06c0: 65 20 6e 61 6d 65 20 69 73 20 74 68 65 20 66 69  e name is the fi
06d0: 72 73 74 20 74 6f 6b 65 6e 20 74 68 61 74 20 69  rst token that i
06e0: 73 20 69 6d 6d 65 64 69 61 74 65 64 6c 79 0a 20  s immediatedly. 
06f0: 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20   ** followed by 
0700: 61 20 6c 65 66 74 20 70 61 72 65 6e 74 68 65 73  a left parenthes
0710: 69 73 20 2d 20 54 4b 5f 4c 50 20 2d 20 6f 72 20  is - TK_LP - or 
0720: 22 55 53 49 4e 47 22 20 54 4b 5f 55 53 49 4e 47  "USING" TK_USING
0730: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 53 71  ..  */.  if( zSq
0740: 6c 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  l ){.    do {.  
0750: 20 20 20 20 69 66 28 20 21 2a 7a 43 73 72 20 29      if( !*zCsr )
0760: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e  {.        /* Ran
0770: 20 6f 75 74 20 6f 66 20 69 6e 70 75 74 20 62 65   out of input be
0780: 66 6f 72 65 20 66 69 6e 64 69 6e 67 20 61 6e 20  fore finding an 
0790: 6f 70 65 6e 69 6e 67 20 62 72 61 63 6b 65 74 2e  opening bracket.
07a0: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f   Return NULL. */
07b0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
07c0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
07d0: 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 74 6f 6b  /* Store the tok
07e0: 65 6e 20 74 68 61 74 20 7a 43 73 72 20 70 6f 69  en that zCsr poi
07f0: 6e 74 73 20 74 6f 20 69 6e 20 74 6e 61 6d 65 2e  nts to in tname.
0800: 20 2a 2f 0a 20 20 20 20 20 20 74 6e 61 6d 65 2e   */.      tname.
0810: 7a 20 3d 20 7a 43 73 72 3b 0a 20 20 20 20 20 20  z = zCsr;.      
0820: 74 6e 61 6d 65 2e 6e 20 3d 20 6c 65 6e 3b 0a 0a  tname.n = len;..
0830: 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65        /* Advance
0840: 20 7a 43 73 72 20 74 6f 20 74 68 65 20 6e 65 78   zCsr to the nex
0850: 74 20 74 6f 6b 65 6e 2e 20 53 74 6f 72 65 20 74  t token. Store t
0860: 68 61 74 20 74 6f 6b 65 6e 20 74 79 70 65 20 69  hat token type i
0870: 6e 20 27 74 6f 6b 65 6e 27 2c 0a 20 20 20 20 20  n 'token',.     
0880: 20 2a 2a 20 61 6e 64 20 69 74 27 73 20 6c 65 6e   ** and it's len
0890: 67 74 68 20 69 6e 20 27 6c 65 6e 27 20 28 74 6f  gth in 'len' (to
08a0: 20 62 65 20 75 73 65 64 20 6e 65 78 74 20 69 74   be used next it
08b0: 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  eration of this 
08c0: 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  loop)..      */.
08d0: 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
08e0: 20 20 20 7a 43 73 72 20 2b 3d 20 6c 65 6e 3b 0a     zCsr += len;.
08f0: 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 71          len = sq
0900: 6c 69 74 65 33 47 65 74 54 6f 6b 65 6e 28 7a 43  lite3GetToken(zC
0910: 73 72 2c 20 26 74 6f 6b 65 6e 29 3b 0a 20 20 20  sr, &token);.   
0920: 20 20 20 7d 20 77 68 69 6c 65 28 20 74 6f 6b 65     } while( toke
0930: 6e 3d 3d 54 4b 5f 53 50 41 43 45 20 29 3b 0a 20  n==TK_SPACE );. 
0940: 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 6e       assert( len
0950: 3e 30 20 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c  >0 );.    } whil
0960: 65 28 20 74 6f 6b 65 6e 21 3d 54 4b 5f 4c 50 20  e( token!=TK_LP 
0970: 26 26 20 74 6f 6b 65 6e 21 3d 54 4b 5f 55 53 49  && token!=TK_USI
0980: 4e 47 20 29 3b 0a 0a 20 20 20 20 7a 52 65 74 20  NG );..    zRet 
0990: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
09a0: 28 64 62 2c 20 22 25 2e 2a 73 25 51 25 73 22 2c  (db, "%.*s%Q%s",
09b0: 20 74 6e 61 6d 65 2e 7a 20 2d 20 7a 53 71 6c 2c   tname.z - zSql,
09c0: 20 7a 53 71 6c 2c 20 0a 20 20 20 20 20 20 20 7a   zSql, .       z
09d0: 54 61 62 6c 65 4e 61 6d 65 2c 20 74 6e 61 6d 65  TableName, tname
09e0: 2e 7a 2b 74 6e 61 6d 65 2e 6e 29 3b 0a 20 20 20  .z+tname.n);.   
09f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
0a00: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 52  text(context, zR
0a10: 65 74 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f  et, -1, sqlite3_
0a20: 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  free);.  }.}..#i
0a30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0a40: 54 5f 54 52 49 47 47 45 52 0a 2f 2a 20 54 68 69  T_TRIGGER./* Thi
0a50: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
0a60: 65 64 20 62 79 20 53 51 4c 20 67 65 6e 65 72 61  ed by SQL genera
0a70: 74 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ted to implement
0a80: 20 74 68 65 0a 2a 2a 20 41 4c 54 45 52 20 54 41   the.** ALTER TA
0a90: 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 65  BLE command. The
0aa0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
0ab0: 69 73 20 74 68 65 20 74 65 78 74 20 6f 66 20 61  is the text of a
0ac0: 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52 20   CREATE TRIGGER 
0ad0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  .** statement. T
0ae0: 68 65 20 73 65 63 6f 6e 64 20 69 73 20 61 20 74  he second is a t
0af0: 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 74  able name. The t
0b00: 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65  able name in the
0b10: 20 43 52 45 41 54 45 20 0a 2a 2a 20 54 52 49 47   CREATE .** TRIG
0b20: 47 45 52 20 73 74 61 74 65 6d 65 6e 74 20 69 73  GER statement is
0b30: 20 72 65 70 6c 61 63 65 64 20 77 69 74 68 20 74   replaced with t
0b40: 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
0b50: 74 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74  t and the result
0b60: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 54   .** returned. T
0b70: 68 69 73 20 69 73 20 61 6e 61 6c 61 67 6f 75 73  his is analagous
0b80: 20 74 6f 20 72 65 6e 61 6d 65 54 61 62 6c 65 46   to renameTableF
0b90: 75 6e 63 28 29 20 61 62 6f 76 65 2c 20 65 78 63  unc() above, exc
0ba0: 65 70 74 20 66 6f 72 20 43 52 45 41 54 45 0a 2a  ept for CREATE.*
0bb0: 2a 20 54 52 49 47 47 45 52 2c 20 6e 6f 74 20 43  * TRIGGER, not C
0bc0: 52 45 41 54 45 20 49 4e 44 45 58 20 61 6e 64 20  REATE INDEX and 
0bd0: 43 52 45 41 54 45 20 54 41 42 4c 45 2e 0a 2a 2f  CREATE TABLE..*/
0be0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6e  .static void ren
0bf0: 61 6d 65 54 72 69 67 67 65 72 46 75 6e 63 28 0a  ameTriggerFunc(.
0c00: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
0c10: 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e  t *context,.  in
0c20: 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65  t argc,.  sqlite
0c30: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
0c40: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
0c50: 72 20 63 6f 6e 73 74 20 2a 7a 53 71 6c 20 3d 20  r const *zSql = 
0c60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
0c70: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 75  xt(argv[0]);.  u
0c80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e  nsigned char con
0c90: 73 74 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 20 3d  st *zTableName =
0ca0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
0cb0: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 0a 20  ext(argv[1]);.. 
0cc0: 20 69 6e 74 20 74 6f 6b 65 6e 3b 0a 20 20 54 6f   int token;.  To
0cd0: 6b 65 6e 20 74 6e 61 6d 65 3b 0a 20 20 69 6e 74  ken tname;.  int
0ce0: 20 64 69 73 74 20 3d 20 33 3b 0a 20 20 75 6e 73   dist = 3;.  uns
0cf0: 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74  igned char const
0d00: 20 2a 7a 43 73 72 20 3d 20 7a 53 71 6c 3b 0a 20   *zCsr = zSql;. 
0d10: 20 69 6e 74 20 6c 65 6e 20 3d 20 30 3b 0a 20 20   int len = 0;.  
0d20: 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 73  char *zRet;..  s
0d30: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
0d40: 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 63  ite3_user_data(c
0d50: 6f 6e 74 65 78 74 29 3b 0a 0a 20 20 2f 2a 20 54  ontext);..  /* T
0d60: 68 65 20 70 72 69 6e 63 69 70 6c 65 20 75 73 65  he principle use
0d70: 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20  d to locate the 
0d80: 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68  table name in th
0d90: 65 20 43 52 45 41 54 45 20 54 52 49 47 47 45 52  e CREATE TRIGGER
0da0: 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74   .  ** statement
0db0: 20 69 73 20 74 68 61 74 20 74 68 65 20 74 61 62   is that the tab
0dc0: 6c 65 20 6e 61 6d 65 20 69 73 20 74 68 65 20 66  le name is the f
0dd0: 69 72 73 74 20 74 6f 6b 65 6e 20 74 68 61 74 20  irst token that 
0de0: 69 73 20 69 6d 6d 65 64 69 61 74 65 64 6c 79 0a  is immediatedly.
0df0: 20 20 2a 2a 20 70 72 65 63 65 64 65 64 20 62 79    ** preceded by
0e00: 20 65 69 74 68 65 72 20 54 4b 5f 4f 4e 20 6f 72   either TK_ON or
0e10: 20 54 4b 5f 44 4f 54 20 61 6e 64 20 69 6d 6d 65   TK_DOT and imme
0e20: 64 69 61 74 65 64 6c 79 20 66 6f 6c 6c 6f 77 65  diatedly followe
0e30: 64 20 62 79 20 6f 6e 65 0a 20 20 2a 2a 20 6f 66  d by one.  ** of
0e40: 20 54 4b 5f 57 48 45 4e 2c 20 54 4b 5f 42 45 47   TK_WHEN, TK_BEG
0e50: 49 4e 20 6f 72 20 54 4b 5f 46 4f 52 2e 0a 20 20  IN or TK_FOR..  
0e60: 2a 2f 0a 20 20 69 66 28 20 7a 53 71 6c 20 29 7b  */.  if( zSql ){
0e70: 0a 20 20 20 20 64 6f 20 7b 0a 0a 20 20 20 20 20  .    do {..     
0e80: 20 69 66 28 20 21 2a 7a 43 73 72 20 29 7b 0a 20   if( !*zCsr ){. 
0e90: 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 20 6f 75         /* Ran ou
0ea0: 74 20 6f 66 20 69 6e 70 75 74 20 62 65 66 6f 72  t of input befor
0eb0: 65 20 66 69 6e 64 69 6e 67 20 74 68 65 20 74 61  e finding the ta
0ec0: 62 6c 65 20 6e 61 6d 65 2e 20 52 65 74 75 72 6e  ble name. Return
0ed0: 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20   NULL. */.      
0ee0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
0ef0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  }..      /* Stor
0f00: 65 20 74 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  e the token that
0f10: 20 7a 43 73 72 20 70 6f 69 6e 74 73 20 74 6f 20   zCsr points to 
0f20: 69 6e 20 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  in tname. */.   
0f30: 20 20 20 74 6e 61 6d 65 2e 7a 20 3d 20 7a 43 73     tname.z = zCs
0f40: 72 3b 0a 20 20 20 20 20 20 74 6e 61 6d 65 2e 6e  r;.      tname.n
0f50: 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 20 20 2f   = len;..      /
0f60: 2a 20 41 64 76 61 6e 63 65 20 7a 43 73 72 20 74  * Advance zCsr t
0f70: 6f 20 74 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e  o the next token
0f80: 2e 20 53 74 6f 72 65 20 74 68 61 74 20 74 6f 6b  . Store that tok
0f90: 65 6e 20 74 79 70 65 20 69 6e 20 27 74 6f 6b 65  en type in 'toke
0fa0: 6e 27 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  n',.      ** and
0fb0: 20 69 74 27 73 20 6c 65 6e 67 74 68 20 69 6e 20   it's length in 
0fc0: 27 6c 65 6e 27 20 28 74 6f 20 62 65 20 75 73 65  'len' (to be use
0fd0: 64 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  d next iteration
0fe0: 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70 29 2e 0a   of this loop)..
0ff0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64        */.      d
1000: 6f 20 7b 0a 20 20 20 20 20 20 20 20 7a 43 73 72  o {.        zCsr
1010: 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 20   += len;.       
1020: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 47 65   len = sqlite3Ge
1030: 74 54 6f 6b 65 6e 28 7a 43 73 72 2c 20 26 74 6f  tToken(zCsr, &to
1040: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ken);.      }whi
1050: 6c 65 28 20 74 6f 6b 65 6e 3d 3d 54 4b 5f 53 50  le( token==TK_SP
1060: 41 43 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ACE );.      ass
1070: 65 72 74 28 20 6c 65 6e 3e 30 20 29 3b 0a 0a 20  ert( len>0 );.. 
1080: 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65       /* Variable
1090: 20 27 64 69 73 74 27 20 73 74 6f 72 65 73 20 74   'dist' stores t
10a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  he number of tok
10b0: 65 6e 73 20 72 65 61 64 20 73 69 6e 63 65 20 74  ens read since t
10c0: 68 65 20 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a  he most.      **
10d0: 20 72 65 63 65 6e 74 20 54 4b 5f 44 4f 54 20 6f   recent TK_DOT o
10e0: 72 20 54 4b 5f 4f 4e 2e 20 54 68 69 73 20 6d 65  r TK_ON. This me
10f0: 61 6e 73 20 74 68 61 74 20 77 68 65 6e 20 61 20  ans that when a 
1100: 57 48 45 4e 2c 20 46 4f 52 20 6f 72 20 42 45 47  WHEN, FOR or BEG
1110: 49 4e 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b  IN .      ** tok
1120: 65 6e 20 69 73 20 72 65 61 64 20 61 6e 64 20 27  en is read and '
1130: 64 69 73 74 27 20 65 71 75 61 6c 73 20 32 2c 20  dist' equals 2, 
1140: 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 74  the condition st
1150: 61 74 65 64 20 61 62 6f 76 65 0a 20 20 20 20 20  ated above.     
1160: 20 2a 2a 20 74 6f 20 62 65 20 6d 65 74 2e 0a 20   ** to be met.. 
1170: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1180: 20 4e 6f 74 65 20 74 68 61 74 20 4f 4e 20 63 61   Note that ON ca
1190: 6e 6e 6f 74 20 62 65 20 61 20 64 61 74 61 62 61  nnot be a databa
11a0: 73 65 2c 20 74 61 62 6c 65 20 6f 72 20 63 6f 6c  se, table or col
11b0: 75 6d 6e 20 6e 61 6d 65 2c 20 73 6f 0a 20 20 20  umn name, so.   
11c0: 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 6e     ** there is n
11d0: 6f 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20  o need to worry 
11e0: 61 62 6f 75 74 20 73 79 6e 74 61 78 20 6c 69 6b  about syntax lik
11f0: 65 20 0a 20 20 20 20 20 20 2a 2a 20 22 43 52 45  e .      ** "CRE
1200: 41 54 45 20 54 52 49 47 47 45 52 20 2e 2e 2e 20  ATE TRIGGER ... 
1210: 4f 4e 20 4f 4e 2e 4f 4e 20 42 45 47 49 4e 20 2e  ON ON.ON BEGIN .
1220: 2e 2e 22 20 65 74 63 2e 0a 20 20 20 20 20 20 2a  .." etc..      *
1230: 2f 0a 20 20 20 20 20 20 64 69 73 74 2b 2b 3b 0a  /.      dist++;.
1240: 20 20 20 20 20 20 69 66 28 20 74 6f 6b 65 6e 3d        if( token=
1250: 3d 54 4b 5f 44 4f 54 20 7c 7c 20 74 6f 6b 65 6e  =TK_DOT || token
1260: 3d 3d 54 4b 5f 4f 4e 20 29 7b 0a 20 20 20 20 20  ==TK_ON ){.     
1270: 20 20 20 64 69 73 74 20 3d 20 30 3b 0a 20 20 20     dist = 0;.   
1280: 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65     }.    } while
1290: 28 20 64 69 73 74 21 3d 32 20 7c 7c 20 28 74 6f  ( dist!=2 || (to
12a0: 6b 65 6e 21 3d 54 4b 5f 57 48 45 4e 20 26 26 20  ken!=TK_WHEN && 
12b0: 74 6f 6b 65 6e 21 3d 54 4b 5f 46 4f 52 20 26 26  token!=TK_FOR &&
12c0: 20 74 6f 6b 65 6e 21 3d 54 4b 5f 42 45 47 49 4e   token!=TK_BEGIN
12d0: 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 72  ) );..    /* Var
12e0: 69 61 62 6c 65 20 74 6e 61 6d 65 20 6e 6f 77 20  iable tname now 
12f0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 6f 6b  contains the tok
1300: 65 6e 20 74 68 61 74 20 69 73 20 74 68 65 20 6f  en that is the o
1310: 6c 64 20 74 61 62 6c 65 2d 6e 61 6d 65 0a 20 20  ld table-name.  
1320: 20 20 2a 2a 20 69 6e 20 74 68 65 20 43 52 45 41    ** in the CREA
1330: 54 45 20 54 52 49 47 47 45 52 20 73 74 61 74 65  TE TRIGGER state
1340: 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ment..    */.   
1350: 20 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 4d   zRet = sqlite3M
1360: 50 72 69 6e 74 66 28 64 62 2c 20 22 25 2e 2a 73  Printf(db, "%.*s
1370: 25 51 25 73 22 2c 20 74 6e 61 6d 65 2e 7a 20 2d  %Q%s", tname.z -
1380: 20 7a 53 71 6c 2c 20 7a 53 71 6c 2c 20 0a 20 20   zSql, zSql, .  
1390: 20 20 20 20 20 7a 54 61 62 6c 65 4e 61 6d 65 2c       zTableName,
13a0: 20 74 6e 61 6d 65 2e 7a 2b 74 6e 61 6d 65 2e 6e   tname.z+tname.n
13b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
13c0: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
13d0: 78 74 2c 20 7a 52 65 74 2c 20 2d 31 2c 20 73 71  xt, zRet, -1, sq
13e0: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d  lite3_free);.  }
13f0: 0a 7d 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 21  .}.#endif   /* !
1400: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
1410: 47 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  GER */../*.** Re
1420: 67 69 73 74 65 72 20 62 75 69 6c 74 2d 69 6e 20  gister built-in 
1430: 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 64 20 74  functions used t
1440: 6f 20 68 65 6c 70 20 69 6d 70 6c 65 6d 65 6e 74  o help implement
1450: 20 41 4c 54 45 52 20 54 41 42 4c 45 0a 2a 2f 0a   ALTER TABLE.*/.
1460: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 6c 74 65  void sqlite3Alte
1470: 72 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74  rFunctions(sqlit
1480: 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69  e3 *db){.  stati
1490: 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
14a0: 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  .     char *zNam
14b0: 65 3b 0a 20 20 20 20 20 73 69 67 6e 65 64 20 63  e;.     signed c
14c0: 68 61 72 20 6e 41 72 67 3b 0a 20 20 20 20 20 76  har nArg;.     v
14d0: 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
14e0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
14f0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
1500: 2a 2a 29 3b 0a 20 20 7d 20 61 46 75 6e 63 73 5b  **);.  } aFuncs[
1510: 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 73 71 6c  ] = {.    { "sql
1520: 69 74 65 5f 72 65 6e 61 6d 65 5f 74 61 62 6c 65  ite_rename_table
1530: 22 2c 20 20 20 20 32 2c 20 72 65 6e 61 6d 65 54  ",    2, renameT
1540: 61 62 6c 65 46 75 6e 63 7d 2c 0a 23 69 66 6e 64  ableFunc},.#ifnd
1550: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
1560: 52 49 47 47 45 52 0a 20 20 20 20 7b 20 22 73 71  RIGGER.    { "sq
1570: 6c 69 74 65 5f 72 65 6e 61 6d 65 5f 74 72 69 67  lite_rename_trig
1580: 67 65 72 22 2c 20 20 32 2c 20 72 65 6e 61 6d 65  ger",  2, rename
1590: 54 72 69 67 67 65 72 46 75 6e 63 7d 2c 0a 23 65  TriggerFunc},.#e
15a0: 6e 64 69 66 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  ndif.  };.  int 
15b0: 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  i;..  for(i=0; i
15c0: 3c 73 69 7a 65 6f 66 28 61 46 75 6e 63 73 29 2f  <sizeof(aFuncs)/
15d0: 73 69 7a 65 6f 66 28 61 46 75 6e 63 73 5b 30 5d  sizeof(aFuncs[0]
15e0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ); i++){.    sql
15f0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
1600: 62 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 7a 4e 61  b, aFuncs[i].zNa
1610: 6d 65 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 6e 41  me, aFuncs[i].nA
1620: 72 67 2c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  rg,.        SQLI
1630: 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 20 2a  TE_UTF8, (void *
1640: 29 64 62 2c 20 61 46 75 6e 63 73 5b 69 5d 2e 78  )db, aFuncs[i].x
1650: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  Func, 0, 0);.  }
1660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1670: 74 65 20 74 68 65 20 74 65 78 74 20 6f 66 20 61  te the text of a
1680: 20 57 48 45 52 45 20 65 78 70 72 65 73 73 69 6f   WHERE expressio
1690: 6e 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 75  n which can be u
16a0: 73 65 64 20 74 6f 20 73 65 6c 65 63 74 20 61 6c  sed to select al
16b0: 6c 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 74  l.** temporary t
16c0: 72 69 67 67 65 72 73 20 6f 6e 20 74 61 62 6c 65  riggers on table
16d0: 20 70 54 61 62 20 66 72 6f 6d 20 74 68 65 20 73   pTab from the s
16e0: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
16f0: 72 20 74 61 62 6c 65 2e 20 49 66 0a 2a 2a 20 74  r table. If.** t
1700: 61 62 6c 65 20 70 54 61 62 20 68 61 73 20 6e 6f  able pTab has no
1710: 20 74 65 6d 70 6f 72 61 72 79 20 74 72 69 67 67   temporary trigg
1720: 65 72 73 2c 20 6f 72 20 69 73 20 69 74 73 65 6c  ers, or is itsel
1730: 66 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  f stored in the 
1740: 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 64 61  .** temporary da
1750: 74 61 62 61 73 65 2c 20 4e 55 4c 4c 20 69 73 20  tabase, NULL is 
1760: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1770: 74 69 63 20 63 68 61 72 20 2a 77 68 65 72 65 54  tic char *whereT
1780: 65 6d 70 54 72 69 67 67 65 72 73 28 50 61 72 73  empTriggers(Pars
1790: 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
17a0: 20 2a 70 54 61 62 29 7b 0a 20 20 54 72 69 67 67   *pTab){.  Trigg
17b0: 65 72 20 2a 70 54 72 69 67 3b 0a 20 20 63 68 61  er *pTrig;.  cha
17c0: 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20  r *zWhere = 0;. 
17d0: 20 63 68 61 72 20 2a 74 6d 70 20 3d 20 30 3b 0a   char *tmp = 0;.
17e0: 20 20 63 6f 6e 73 74 20 53 63 68 65 6d 61 20 2a    const Schema *
17f0: 70 54 65 6d 70 53 63 68 65 6d 61 20 3d 20 70 50  pTempSchema = pP
1800: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 31 5d  arse->db->aDb[1]
1810: 2e 70 53 63 68 65 6d 61 3b 20 2f 2a 20 54 65 6d  .pSchema; /* Tem
1820: 70 20 64 62 20 73 63 68 65 6d 61 20 2a 2f 0a 0a  p db schema */..
1830: 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c    /* If the tabl
1840: 65 20 69 73 20 6e 6f 74 20 6c 6f 63 61 74 65 64  e is not located
1850: 20 69 6e 20 74 68 65 20 74 65 6d 70 2d 64 62 20   in the temp-db 
1860: 28 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 4e  (in which case N
1870: 55 4c 4c 20 69 73 20 0a 20 20 2a 2a 20 72 65 74  ULL is .  ** ret
1880: 75 72 6e 65 64 2c 20 6c 6f 6f 70 20 74 68 72 6f  urned, loop thro
1890: 75 67 68 20 74 68 65 20 74 61 62 6c 65 73 20 6c  ugh the tables l
18a0: 69 73 74 20 6f 66 20 74 72 69 67 67 65 72 73 2e  ist of triggers.
18b0: 20 46 6f 72 20 65 61 63 68 20 74 72 69 67 67 65   For each trigge
18c0: 72 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 6e  r.  ** that is n
18d0: 6f 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ot part of the t
18e0: 65 6d 70 2d 64 62 20 73 63 68 65 6d 61 2c 20 61  emp-db schema, a
18f0: 64 64 20 61 20 63 6c 61 75 73 65 20 74 6f 20 74  dd a clause to t
1900: 68 65 20 57 48 45 52 45 20 0a 20 20 2a 2a 20 65  he WHERE .  ** e
1910: 78 70 72 65 73 73 69 6f 6e 20 62 65 69 6e 67 20  xpression being 
1920: 62 75 69 6c 74 20 75 70 20 69 6e 20 7a 57 68 65  built up in zWhe
1930: 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  re..  */.  if( p
1940: 54 61 62 2d 3e 70 53 63 68 65 6d 61 21 3d 70 54  Tab->pSchema!=pT
1950: 65 6d 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  empSchema ){.   
1960: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1970: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 66  Parse->db;.    f
1980: 6f 72 28 20 70 54 72 69 67 3d 70 54 61 62 2d 3e  or( pTrig=pTab->
1990: 70 54 72 69 67 67 65 72 3b 20 70 54 72 69 67 3b  pTrigger; pTrig;
19a0: 20 70 54 72 69 67 3d 70 54 72 69 67 2d 3e 70 4e   pTrig=pTrig->pN
19b0: 65 78 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ext ){.      if(
19c0: 20 70 54 72 69 67 2d 3e 70 53 63 68 65 6d 61 3d   pTrig->pSchema=
19d0: 3d 70 54 65 6d 70 53 63 68 65 6d 61 20 29 7b 0a  =pTempSchema ){.
19e0: 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 57 68          if( !zWh
19f0: 65 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ere ){.         
1a00: 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   zWhere = sqlite
1a10: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61  3MPrintf(db, "na
1a20: 6d 65 3d 25 51 22 2c 20 70 54 72 69 67 2d 3e 6e  me=%Q", pTrig->n
1a30: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ame);.        }e
1a40: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 74  lse{.          t
1a50: 6d 70 20 3d 20 7a 57 68 65 72 65 3b 0a 20 20 20  mp = zWhere;.   
1a60: 20 20 20 20 20 20 20 7a 57 68 65 72 65 20 3d 20         zWhere = 
1a70: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1a80: 62 2c 20 22 25 73 20 4f 52 20 6e 61 6d 65 3d 25  b, "%s OR name=%
1a90: 51 22 2c 20 7a 57 68 65 72 65 2c 20 70 54 72 69  Q", zWhere, pTri
1aa0: 67 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  g->name);.      
1ab0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1ac0: 28 74 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  (tmp);.        }
1ad0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1ae0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 68 65   }.  return zWhe
1af0: 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  re;.}../*.** Gen
1b00: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72  erate code to dr
1b10: 6f 70 20 61 6e 64 20 72 65 6c 6f 61 64 20 74 68  op and reload th
1b20: 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65  e internal repre
1b30: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 61 62  sentation of tab
1b40: 6c 65 0a 2a 2a 20 70 54 61 62 20 66 72 6f 6d 20  le.** pTab from 
1b50: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 6e  the database, in
1b60: 63 6c 75 64 69 6e 67 20 74 72 69 67 67 65 72 73  cluding triggers
1b70: 20 61 6e 64 20 74 65 6d 70 6f 72 61 72 79 20 74   and temporary t
1b80: 72 69 67 67 65 72 73 2e 0a 2a 2a 20 41 72 67 75  riggers..** Argu
1b90: 6d 65 6e 74 20 7a 4e 61 6d 65 20 69 73 20 74 68  ment zName is th
1ba0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
1bb0: 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
1bc0: 61 73 65 20 73 63 68 65 6d 61 20 61 74 0a 2a 2a  ase schema at.**
1bd0: 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 67 65   the time the ge
1be0: 6e 65 72 61 74 65 64 20 63 6f 64 65 20 69 73 20  nerated code is 
1bf0: 65 78 65 63 75 74 65 64 2e 20 54 68 69 73 20 63  executed. This c
1c00: 61 6e 20 62 65 20 64 69 66 66 65 72 65 6e 74 20  an be different 
1c10: 66 72 6f 6d 0a 2a 2a 20 70 54 61 62 2d 3e 7a 4e  from.** pTab->zN
1c20: 61 6d 65 20 69 66 20 74 68 69 73 20 66 75 6e 63  ame if this func
1c30: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61  tion is being ca
1c40: 6c 6c 65 64 20 74 6f 20 63 6f 64 65 20 70 61 72  lled to code par
1c50: 74 20 6f 66 20 61 6e 20 0a 2a 2a 20 22 41 4c 54  t of an .** "ALT
1c60: 45 52 20 54 41 42 4c 45 20 52 45 4e 41 4d 45 20  ER TABLE RENAME 
1c70: 54 4f 22 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  TO" statement..*
1c80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
1c90: 6c 6f 61 64 54 61 62 6c 65 53 63 68 65 6d 61 28  loadTableSchema(
1ca0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
1cb0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 6f 6e 73  able *pTab, cons
1cc0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
1cd0: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 63 68 61    Vdbe *v;.  cha
1ce0: 72 20 2a 7a 57 68 65 72 65 3b 0a 20 20 69 6e 74  r *zWhere;.  int
1cf0: 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
1d00: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1d10: 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
1d20: 74 61 69 6e 69 6e 67 20 70 54 61 62 20 2a 2f 0a  taining pTab */.
1d30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d40: 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 54 72  MIT_TRIGGER.  Tr
1d50: 69 67 67 65 72 20 2a 70 54 72 69 67 3b 0a 23 65  igger *pTrig;.#e
1d60: 6e 64 69 66 0a 0a 20 20 76 20 3d 20 73 71 6c 69  ndif..  v = sqli
1d70: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1d80: 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72  e);.  if( !v ) r
1d90: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
1da0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1db0: 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 70 50 61  dsAllMutexes(pPa
1dc0: 72 73 65 2d 3e 64 62 29 20 29 3b 0a 20 20 69 44  rse->db) );.  iD
1dd0: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
1de0: 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d  aToIndex(pParse-
1df0: 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  >db, pTab->pSche
1e00: 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ma);.  assert( i
1e10: 44 62 3e 3d 30 20 29 3b 0a 0a 23 69 66 6e 64 65  Db>=0 );..#ifnde
1e20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
1e30: 49 47 47 45 52 0a 20 20 2f 2a 20 44 72 6f 70 20  IGGER.  /* Drop 
1e40: 61 6e 79 20 74 61 62 6c 65 20 74 72 69 67 67 65  any table trigge
1e50: 72 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65  rs from the inte
1e60: 72 6e 61 6c 20 73 63 68 65 6d 61 2e 20 2a 2f 0a  rnal schema. */.
1e70: 20 20 66 6f 72 28 70 54 72 69 67 3d 70 54 61 62    for(pTrig=pTab
1e80: 2d 3e 70 54 72 69 67 67 65 72 3b 20 70 54 72 69  ->pTrigger; pTri
1e90: 67 3b 20 70 54 72 69 67 3d 70 54 72 69 67 2d 3e  g; pTrig=pTrig->
1ea0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
1eb0: 69 54 72 69 67 44 62 20 3d 20 73 71 6c 69 74 65  iTrigDb = sqlite
1ec0: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
1ed0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 72 69 67  Parse->db, pTrig
1ee0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
1ef0: 61 73 73 65 72 74 28 20 69 54 72 69 67 44 62 3d  assert( iTrigDb=
1f00: 3d 69 44 62 20 7c 7c 20 69 54 72 69 67 44 62 3d  =iDb || iTrigDb=
1f10: 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =1 );.    sqlite
1f20: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 44  3VdbeOp3(v, OP_D
1f30: 72 6f 70 54 72 69 67 67 65 72 2c 20 69 54 72 69  ropTrigger, iTri
1f40: 67 44 62 2c 20 30 2c 20 70 54 72 69 67 2d 3e 6e  gDb, 0, pTrig->n
1f50: 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  ame, 0);.  }.#en
1f60: 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 74  dif..  /* Drop t
1f70: 68 65 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64  he table and ind
1f80: 65 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65  ex from the inte
1f90: 72 6e 61 6c 20 73 63 68 65 6d 61 20 2a 2f 0a 20  rnal schema */. 
1fa0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
1fb0: 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c  v, OP_DropTable,
1fc0: 20 69 44 62 2c 20 30 2c 20 70 54 61 62 2d 3e 7a   iDb, 0, pTab->z
1fd0: 4e 61 6d 65 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20  Name, 0);..  /* 
1fe0: 52 65 6c 6f 61 64 20 74 68 65 20 74 61 62 6c 65  Reload the table
1ff0: 2c 20 69 6e 64 65 78 20 61 6e 64 20 70 65 72 6d  , index and perm
2000: 61 6e 65 6e 74 20 74 72 69 67 67 65 72 20 73 63  anent trigger sc
2010: 68 65 6d 61 73 2e 20 2a 2f 0a 20 20 7a 57 68 65  hemas. */.  zWhe
2020: 72 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  re = sqlite3MPri
2030: 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
2040: 22 74 62 6c 5f 6e 61 6d 65 3d 25 51 22 2c 20 7a  "tbl_name=%Q", z
2050: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 7a 57  Name);.  if( !zW
2060: 68 65 72 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  here ) return;. 
2070: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
2080: 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  v, OP_ParseSchem
2090: 61 2c 20 69 44 62 2c 20 30 2c 20 7a 57 68 65 72  a, iDb, 0, zWher
20a0: 65 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a  e, P3_DYNAMIC);.
20b0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20c0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 2f  OMIT_TRIGGER.  /
20d0: 2a 20 4e 6f 77 2c 20 69 66 20 74 68 65 20 74 61  * Now, if the ta
20e0: 62 6c 65 20 69 73 20 6e 6f 74 20 73 74 6f 72 65  ble is not store
20f0: 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61  d in the temp da
2100: 74 61 62 61 73 65 2c 20 72 65 6c 6f 61 64 20 61  tabase, reload a
2110: 6e 79 20 74 65 6d 70 20 0a 20 20 2a 2a 20 74 72  ny temp .  ** tr
2120: 69 67 67 65 72 73 2e 20 44 6f 6e 27 74 20 75 73  iggers. Don't us
2130: 65 20 49 4e 28 2e 2e 2e 29 20 69 6e 20 63 61 73  e IN(...) in cas
2140: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  e SQLITE_OMIT_SU
2150: 42 51 55 45 52 59 20 69 73 20 64 65 66 69 6e 65  BQUERY is define
2160: 64 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  d. .  */.  if( (
2170: 7a 57 68 65 72 65 3d 77 68 65 72 65 54 65 6d 70  zWhere=whereTemp
2180: 54 72 69 67 67 65 72 73 28 70 50 61 72 73 65 2c  Triggers(pParse,
2190: 20 70 54 61 62 29 29 21 3d 30 20 29 7b 0a 20 20   pTab))!=0 ){.  
21a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
21b0: 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (v, OP_ParseSche
21c0: 6d 61 2c 20 31 2c 20 30 2c 20 7a 57 68 65 72 65  ma, 1, 0, zWhere
21d0: 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P3_DYNAMIC);. 
21e0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
21f0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
2200: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
2210: 65 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 78  e "ALTER TABLE x
2220: 78 78 20 52 45 4e 41 4d 45 20 54 4f 20 79 79 79  xx RENAME TO yyy
2230: 22 20 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 0a  " .** command. .
2240: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
2250: 6c 74 65 72 52 65 6e 61 6d 65 54 61 62 6c 65 28  lterRenameTable(
2260: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2270: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2280: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20  Parser context. 
2290: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
22a0: 72 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  rc,            /
22b0: 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 72  * The table to r
22c0: 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 54 6f 6b 65  ename. */.  Toke
22d0: 6e 20 2a 70 4e 61 6d 65 20 20 20 20 20 20 20 20  n *pName        
22e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
22f0: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 2a 2f 0a   table name. */.
2300: 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  ){.  int iDb;   
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2320: 2a 20 44 61 74 61 62 61 73 65 20 74 68 61 74 20  * Database that 
2330: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62  contains the tab
2340: 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  le */.  char *zD
2350: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2360: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74    /* Name of dat
2370: 61 62 61 73 65 20 69 44 62 20 2a 2f 0a 20 20 54  abase iDb */.  T
2380: 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
2390: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
23a0: 65 20 62 65 69 6e 67 20 72 65 6e 61 6d 65 64 20  e being renamed 
23b0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
23c0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
23d0: 2a 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 65  * NULL-terminate
23e0: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 4e 61  d version of pNa
23f0: 6d 65 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33  me */ .  sqlite3
2400: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
2410: 62 3b 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  b; /* Database c
2420: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
2430: 6e 74 20 6e 54 61 62 4e 61 6d 65 3b 20 20 20 20  nt nTabName;    
2440: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2450: 65 72 20 6f 66 20 55 54 46 2d 38 20 63 68 61 72  er of UTF-8 char
2460: 61 63 74 65 72 73 20 69 6e 20 7a 54 61 62 4e 61  acters in zTabNa
2470: 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  me */.  const ch
2480: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 3b 20 20 20  ar *zTabName;   
2490: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 61    /* Original na
24a0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
24b0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 0a 23 69  */.  Vdbe *v;.#i
24c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
24d0: 54 5f 54 52 49 47 47 45 52 0a 20 20 63 68 61 72  T_TRIGGER.  char
24e0: 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 20 20 20   *zWhere = 0;   
24f0: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 63        /* Where c
2500: 6c 61 75 73 65 20 74 6f 20 6c 6f 63 61 74 65 20  lause to locate 
2510: 74 65 6d 70 20 74 72 69 67 67 65 72 73 20 2a 2f  temp triggers */
2520: 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 69 73  .#endif.  int is
2530: 56 69 72 74 75 61 6c 52 65 6e 61 6d 65 20 3d 20  VirtualRename = 
2540: 30 3b 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74  0;  /* True if t
2550: 68 69 73 20 69 73 20 61 20 76 2d 74 61 62 6c 65  his is a v-table
2560: 20 77 69 74 68 20 61 6e 20 78 52 65 6e 61 6d 65   with an xRename
2570: 28 29 20 2a 2f 0a 20 20 0a 20 20 69 66 28 20 64  () */.  .  if( d
2580: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2590: 29 20 67 6f 74 6f 20 65 78 69 74 5f 72 65 6e 61  ) goto exit_rena
25a0: 6d 65 5f 74 61 62 6c 65 3b 0a 20 20 61 73 73 65  me_table;.  asse
25b0: 72 74 28 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d  rt( pSrc->nSrc==
25c0: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  1 );.  assert( s
25d0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
25e0: 41 6c 6c 4d 75 74 65 78 65 73 28 70 50 61 72 73  AllMutexes(pPars
25f0: 65 2d 3e 64 62 29 20 29 3b 0a 0a 20 20 70 54 61  e->db) );..  pTa
2600: 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  b = sqlite3Locat
2610: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  eTable(pParse, p
2620: 53 72 63 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  Src->a[0].zName,
2630: 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 7a 44 61 74   pSrc->a[0].zDat
2640: 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 21 70  abase);.  if( !p
2650: 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  Tab ) goto exit_
2660: 72 65 6e 61 6d 65 5f 74 61 62 6c 65 3b 0a 20 20  rename_table;.  
2670: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
2680: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
2690: 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
26a0: 68 65 6d 61 29 3b 0a 20 20 7a 44 62 20 3d 20 64  hema);.  zDb = d
26b0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
26c0: 65 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 4e  e;..  /* Get a N
26d0: 55 4c 4c 20 74 65 72 6d 69 6e 61 74 65 64 20 76  ULL terminated v
26e0: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65  ersion of the ne
26f0: 77 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 2a 2f  w table name. */
2700: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
2710: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
2720: 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66  db, pName);.  if
2730: 28 20 21 7a 4e 61 6d 65 20 29 20 67 6f 74 6f 20  ( !zName ) goto 
2740: 65 78 69 74 5f 72 65 6e 61 6d 65 5f 74 61 62 6c  exit_rename_tabl
2750: 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  e;..  /* Check t
2760: 68 61 74 20 61 20 74 61 62 6c 65 20 6f 72 20 69  hat a table or i
2770: 6e 64 65 78 20 6e 61 6d 65 64 20 27 7a 4e 61 6d  ndex named 'zNam
2780: 65 27 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  e' does not alre
2790: 61 64 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 69  ady exist.  ** i
27a0: 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20  n database iDb. 
27b0: 49 66 20 73 6f 2c 20 74 68 69 73 20 69 73 20 61  If so, this is a
27c0: 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20  n error..  */.  
27d0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
27e0: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
27f0: 7a 44 62 29 20 7c 7c 20 73 71 6c 69 74 65 33 46  zDb) || sqlite3F
2800: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
2810: 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
2820: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2830: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
2840: 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
2850: 64 79 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65  dy another table
2860: 20 6f 72 20 69 6e 64 65 78 20 77 69 74 68 20 74   or index with t
2870: 68 69 73 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  his name: %s", z
2880: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
2890: 65 78 69 74 5f 72 65 6e 61 6d 65 5f 74 61 62 6c  exit_rename_tabl
28a0: 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  e;.  }..  /* Mak
28b0: 65 20 73 75 72 65 20 69 74 20 69 73 20 6e 6f 74  e sure it is not
28c0: 20 61 20 73 79 73 74 65 6d 20 74 61 62 6c 65 20   a system table 
28d0: 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2c 20 6f  being altered, o
28e0: 72 20 61 20 72 65 73 65 72 76 65 64 20 6e 61 6d  r a reserved nam
28f0: 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  e.  ** that the 
2900: 74 61 62 6c 65 20 69 73 20 62 65 69 6e 67 20 72  table is being r
2910: 65 6e 61 6d 65 64 20 74 6f 2e 0a 20 20 2a 2f 0a  enamed to..  */.
2920: 20 20 69 66 28 20 73 74 72 6c 65 6e 28 70 54 61    if( strlen(pTa
2930: 62 2d 3e 7a 4e 61 6d 65 29 3e 36 20 26 26 20 30  b->zName)>6 && 0
2940: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
2950: 70 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22  p(pTab->zName, "
2960: 73 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a  sqlite_", 7) ){.
2970: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2980: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
2990: 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
29a0: 20 61 6c 74 65 72 65 64 22 2c 20 70 54 61 62 2d   altered", pTab-
29b0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
29c0: 6f 20 65 78 69 74 5f 72 65 6e 61 6d 65 5f 74 61  o exit_rename_ta
29d0: 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53  ble;.  }.  if( S
29e0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
29f0: 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65  3CheckObjectName
2a00: 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20  (pParse, zName) 
2a10: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
2a20: 5f 72 65 6e 61 6d 65 5f 74 61 62 6c 65 3b 0a 20  _rename_table;. 
2a30: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
2a40: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
2a50: 41 54 49 4f 4e 0a 20 20 2f 2a 20 49 6e 76 6f 6b  ATION.  /* Invok
2a60: 65 20 74 68 65 20 61 75 74 68 6f 72 69 7a 61 74  e the authorizat
2a70: 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 2e 20 2a 2f  ion callback. */
2a80: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
2a90: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
2aa0: 53 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42  SQLITE_ALTER_TAB
2ab0: 4c 45 2c 20 7a 44 62 2c 20 70 54 61 62 2d 3e 7a  LE, zDb, pTab->z
2ac0: 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  Name, 0) ){.    
2ad0: 67 6f 74 6f 20 65 78 69 74 5f 72 65 6e 61 6d 65  goto exit_rename
2ae0: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  _table;.  }.#end
2af0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
2b00: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2b10: 41 42 4c 45 0a 20 20 69 66 28 20 73 71 6c 69 74  ABLE.  if( sqlit
2b20: 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
2b30: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54 61  ames(pParse, pTa
2b40: 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  b) ){.    goto e
2b50: 78 69 74 5f 72 65 6e 61 6d 65 5f 74 61 62 6c 65  xit_rename_table
2b60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69  ;.  }.  if( IsVi
2b70: 72 74 75 61 6c 28 70 54 61 62 29 20 26 26 20 70  rtual(pTab) && p
2b80: 54 61 62 2d 3e 70 4d 6f 64 2d 3e 70 4d 6f 64 75  Tab->pMod->pModu
2b90: 6c 65 2d 3e 78 52 65 6e 61 6d 65 20 29 7b 0a 20  le->xRename ){. 
2ba0: 20 20 20 69 73 56 69 72 74 75 61 6c 52 65 6e 61     isVirtualRena
2bb0: 6d 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64  me = 1;.  }.#end
2bc0: 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 61  if..  /* Begin a
2bd0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
2be0: 20 63 6f 64 65 20 74 68 65 20 56 65 72 69 66 79   code the Verify
2bf0: 43 6f 6f 6b 69 65 20 66 6f 72 20 64 61 74 61 62  Cookie for datab
2c00: 61 73 65 20 69 44 62 2e 20 0a 20 20 2a 2a 20 54  ase iDb. .  ** T
2c10: 68 65 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 73  hen modify the s
2c20: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 28 73 69  chema cookie (si
2c30: 6e 63 65 20 74 68 65 20 41 4c 54 45 52 20 54 41  nce the ALTER TA
2c40: 42 4c 45 20 6d 6f 64 69 66 69 65 73 20 74 68 65  BLE modifies the
2c50: 0a 20 20 2a 2a 20 73 63 68 65 6d 61 29 2e 20 4f  .  ** schema). O
2c60: 70 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20  pen a statement 
2c70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74  transaction if t
2c80: 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69  he table is a vi
2c90: 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65  rtual.  ** table
2ca0: 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
2cb0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
2cc0: 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  se);.  if( v==0 
2cd0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
2ce0: 5f 72 65 6e 61 6d 65 5f 74 61 62 6c 65 3b 0a 20  _rename_table;. 
2cf0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69   }.  sqlite3Begi
2d00: 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
2d10: 70 50 61 72 73 65 2c 20 69 73 56 69 72 74 75 61  pParse, isVirtua
2d20: 6c 52 65 6e 61 6d 65 2c 20 69 44 62 29 3b 0a 20  lRename, iDb);. 
2d30: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
2d40: 6f 6b 69 65 28 64 62 2c 20 76 2c 20 69 44 62 29  okie(db, v, iDb)
2d50: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
2d60: 69 73 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  is a virtual tab
2d70: 6c 65 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 78  le, invoke the x
2d80: 52 65 6e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f  Rename() functio
2d90: 6e 20 69 66 0a 20 20 2a 2a 20 6f 6e 65 20 69 73  n if.  ** one is
2da0: 20 64 65 66 69 6e 65 64 2e 20 54 68 65 20 78 52   defined. The xR
2db0: 65 6e 61 6d 65 28 29 20 63 61 6c 6c 62 61 63 6b  ename() callback
2dc0: 20 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74 68 65   will modify the
2dd0: 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 6f 66 20 61   names.  ** of a
2de0: 6e 79 20 72 65 73 6f 75 72 63 65 73 20 75 73 65  ny resources use
2df0: 64 20 62 79 20 74 68 65 20 76 2d 74 61 62 6c 65  d by the v-table
2e00: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2e10: 28 69 6e 63 6c 75 64 69 6e 67 20 6f 74 68 65 72  (including other
2e20: 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20 74 61 62  .  ** SQLite tab
2e30: 6c 65 73 29 20 74 68 61 74 20 61 72 65 20 69 64  les) that are id
2e40: 65 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20  entified by the 
2e50: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 72 74  name of the virt
2e60: 75 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ual table..  */.
2e70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2e80: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2e90: 0a 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c  .  if( isVirtual
2ea0: 52 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71  Rename ){.    sq
2eb0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
2ec0: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
2ed0: 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20  , zName, 0);.   
2ee0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
2ef0: 76 2c 20 4f 50 5f 56 52 65 6e 61 6d 65 2c 20 30  v, OP_VRename, 0
2f00: 2c 20 30 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  , 0, (const char
2f10: 2a 29 70 54 61 62 2d 3e 70 56 74 61 62 2c 20 50  *)pTab->pVtab, P
2f20: 33 5f 56 54 41 42 29 3b 0a 20 20 7d 0a 23 65 6e  3_VTAB);.  }.#en
2f30: 64 69 66 0a 0a 20 20 2f 2a 20 66 69 67 75 72 65  dif..  /* figure
2f40: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 55 54   out how many UT
2f50: 46 2d 38 20 63 68 61 72 61 63 74 65 72 73 20 61  F-8 characters a
2f60: 72 65 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20  re in zName */. 
2f70: 20 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62   zTabName = pTab
2f80: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 6e 54 61 62 4e  ->zName;.  nTabN
2f90: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 55 74 66  ame = sqlite3Utf
2fa0: 38 43 68 61 72 4c 65 6e 28 7a 54 61 62 4e 61 6d  8CharLen(zTabNam
2fb0: 65 2c 20 2d 31 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  e, -1);..  /* Mo
2fc0: 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f  dify the sqlite_
2fd0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 20  master table to 
2fe0: 75 73 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  use the new tabl
2ff0: 65 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 73 71 6c  e name. */.  sql
3000: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
3010: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55  pParse,.      "U
3020: 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54 20  PDATE %Q.%s SET 
3030: 22 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ".#ifdef SQLITE_
3040: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
3050: 20 20 20 20 20 20 20 22 73 71 6c 20 3d 20 73 71         "sql = sq
3060: 6c 69 74 65 5f 72 65 6e 61 6d 65 5f 74 61 62 6c  lite_rename_tabl
3070: 65 28 73 71 6c 2c 20 25 51 29 2c 20 22 0a 23 65  e(sql, %Q), ".#e
3080: 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 22 73  lse.          "s
3090: 71 6c 20 3d 20 43 41 53 45 20 22 0a 20 20 20 20  ql = CASE ".    
30a0: 20 20 20 20 20 20 20 20 22 57 48 45 4e 20 74 79          "WHEN ty
30b0: 70 65 20 3d 20 27 74 72 69 67 67 65 72 27 20 54  pe = 'trigger' T
30c0: 48 45 4e 20 73 71 6c 69 74 65 5f 72 65 6e 61 6d  HEN sqlite_renam
30d0: 65 5f 74 72 69 67 67 65 72 28 73 71 6c 2c 20 25  e_trigger(sql, %
30e0: 51 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  Q)".            
30f0: 22 45 4c 53 45 20 73 71 6c 69 74 65 5f 72 65 6e  "ELSE sqlite_ren
3100: 61 6d 65 5f 74 61 62 6c 65 28 73 71 6c 2c 20 25  ame_table(sql, %
3110: 51 29 20 45 4e 44 2c 20 22 0a 23 65 6e 64 69 66  Q) END, ".#endif
3120: 0a 20 20 20 20 20 20 20 20 20 20 22 74 62 6c 5f  .          "tbl_
3130: 6e 61 6d 65 20 3d 20 25 51 2c 20 22 0a 20 20 20  name = %Q, ".   
3140: 20 20 20 20 20 20 20 22 6e 61 6d 65 20 3d 20 43         "name = C
3150: 41 53 45 20 22 0a 20 20 20 20 20 20 20 20 20 20  ASE ".          
3160: 20 20 22 57 48 45 4e 20 74 79 70 65 3d 27 74 61    "WHEN type='ta
3170: 62 6c 65 27 20 54 48 45 4e 20 25 51 20 22 0a 20  ble' THEN %Q ". 
3180: 20 20 20 20 20 20 20 20 20 20 20 22 57 48 45 4e             "WHEN
3190: 20 6e 61 6d 65 20 4c 49 4b 45 20 27 73 71 6c 69   name LIKE 'sqli
31a0: 74 65 5f 61 75 74 6f 69 6e 64 65 78 25 25 27 20  te_autoindex%%' 
31b0: 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27  AND type='index'
31c0: 20 54 48 45 4e 20 22 0a 20 20 20 20 20 20 20 20   THEN ".        
31d0: 20 20 20 20 20 22 27 73 71 6c 69 74 65 5f 61 75       "'sqlite_au
31e0: 74 6f 69 6e 64 65 78 5f 27 20 7c 7c 20 25 51 20  toindex_' || %Q 
31f0: 7c 7c 20 73 75 62 73 74 72 28 6e 61 6d 65 2c 25  || substr(name,%
3200: 64 2b 31 38 29 20 22 0a 20 20 20 20 20 20 20 20  d+18) ".        
3210: 20 20 20 20 22 45 4c 53 45 20 6e 61 6d 65 20 45      "ELSE name E
3220: 4e 44 20 22 0a 20 20 20 20 20 20 22 57 48 45 52  ND ".      "WHER
3230: 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 41 4e  E tbl_name=%Q AN
3240: 44 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 28  D ".          "(
3250: 74 79 70 65 3d 27 74 61 62 6c 65 27 20 4f 52 20  type='table' OR 
3260: 74 79 70 65 3d 27 69 6e 64 65 78 27 20 4f 52 20  type='index' OR 
3270: 74 79 70 65 3d 27 74 72 69 67 67 65 72 27 29 3b  type='trigger');
3280: 22 2c 20 0a 20 20 20 20 20 20 7a 44 62 2c 20 53  ", .      zDb, S
3290: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
32a0: 2c 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20  , zName, zName, 
32b0: 7a 4e 61 6d 65 2c 20 0a 23 69 66 6e 64 65 66 20  zName, .#ifndef 
32c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
32d0: 47 45 52 0a 20 20 20 20 20 20 7a 4e 61 6d 65 2c  GER.      zName,
32e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7a 4e  .#endif.      zN
32f0: 61 6d 65 2c 20 6e 54 61 62 4e 61 6d 65 2c 20 7a  ame, nTabName, z
3300: 54 61 62 4e 61 6d 65 0a 20 20 29 3b 0a 0a 23 69  TabName.  );..#i
3310: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3320: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
3330: 20 20 2f 2a 20 49 66 20 74 68 65 20 73 71 6c 69    /* If the sqli
3340: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
3350: 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 69 73  e exists in this
3360: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
3370: 75 70 64 61 74 65 20 0a 20 20 2a 2a 20 69 74 20  update .  ** it 
3380: 77 69 74 68 20 74 68 65 20 6e 65 77 20 74 61 62  with the new tab
3390: 6c 65 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  le name..  */.  
33a0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54  if( sqlite3FindT
33b0: 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65  able(db, "sqlite
33c0: 5f 73 65 71 75 65 6e 63 65 22 2c 20 7a 44 62 29  _sequence", zDb)
33d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   ){.    sqlite3N
33e0: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
33f0: 65 2c 0a 20 20 20 20 20 20 20 20 22 55 50 44 41  e,.        "UPDA
3400: 54 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71  TE %Q.sqlite_seq
3410: 75 65 6e 63 65 20 73 65 74 20 6e 61 6d 65 20 3d  uence set name =
3420: 20 25 51 20 57 48 45 52 45 20 6e 61 6d 65 20 3d   %Q WHERE name =
3430: 20 25 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44   %Q",.        zD
3440: 62 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  b, zName, pTab->
3450: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64  zName);.  }.#end
3460: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
3470: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
3480: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
3490: 65 20 54 45 4d 50 20 74 72 69 67 67 65 72 73 20  e TEMP triggers 
34a0: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2c 20 6d  on this table, m
34b0: 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65  odify the sqlite
34c0: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 0a 20 20 2a  _temp_master.  *
34d0: 2a 20 74 61 62 6c 65 2e 20 44 6f 6e 27 74 20 64  * table. Don't d
34e0: 6f 20 74 68 69 73 20 69 66 20 74 68 65 20 74 61  o this if the ta
34f0: 62 6c 65 20 62 65 69 6e 67 20 41 4c 54 45 52 65  ble being ALTERe
3500: 64 20 69 73 20 69 74 73 65 6c 66 20 6c 6f 63 61  d is itself loca
3510: 74 65 64 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20  ted in.  ** the 
3520: 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 0a 20  temp database.. 
3530: 20 2a 2f 0a 20 20 69 66 28 20 28 7a 57 68 65 72   */.  if( (zWher
3540: 65 3d 77 68 65 72 65 54 65 6d 70 54 72 69 67 67  e=whereTempTrigg
3550: 65 72 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  ers(pParse, pTab
3560: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ))!=0 ){.    sql
3570: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
3580: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
3590: 20 22 55 50 44 41 54 45 20 73 71 6c 69 74 65 5f   "UPDATE sqlite_
35a0: 74 65 6d 70 5f 6d 61 73 74 65 72 20 53 45 54 20  temp_master SET 
35b0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73  ".            "s
35c0: 71 6c 20 3d 20 73 71 6c 69 74 65 5f 72 65 6e 61  ql = sqlite_rena
35d0: 6d 65 5f 74 72 69 67 67 65 72 28 73 71 6c 2c 20  me_trigger(sql, 
35e0: 25 51 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20  %Q), ".         
35f0: 20 20 20 22 74 62 6c 5f 6e 61 6d 65 20 3d 20 25     "tbl_name = %
3600: 51 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  Q ".            
3610: 22 57 48 45 52 45 20 25 73 3b 22 2c 20 7a 4e 61  "WHERE %s;", zNa
3620: 6d 65 2c 20 7a 4e 61 6d 65 2c 20 7a 57 68 65 72  me, zName, zWher
3630: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
3640: 66 72 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20  free(zWhere);.  
3650: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
3660: 72 6f 70 20 61 6e 64 20 72 65 6c 6f 61 64 20 74  rop and reload t
3670: 68 65 20 69 6e 74 65 72 6e 61 6c 20 74 61 62 6c  he internal tabl
3680: 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a 20 20 72  e schema. */.  r
3690: 65 6c 6f 61 64 54 61 62 6c 65 53 63 68 65 6d 61  eloadTableSchema
36a0: 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a  (pParse, pTab, z
36b0: 4e 61 6d 65 29 3b 0a 0a 65 78 69 74 5f 72 65 6e  Name);..exit_ren
36c0: 61 6d 65 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c  ame_table:.  sql
36d0: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
36e0: 65 28 70 53 72 63 29 3b 0a 20 20 73 71 6c 69 74  e(pSrc);.  sqlit
36f0: 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
3700: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
3710: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
3720: 64 20 61 66 74 65 72 20 61 6e 20 22 41 4c 54 45  d after an "ALTE
3730: 52 20 54 41 42 4c 45 20 2e 2e 2e 20 41 44 44 22  R TABLE ... ADD"
3740: 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 68 61   statement.** ha
3750: 73 20 62 65 65 6e 20 70 61 72 73 65 64 2e 20 41  s been parsed. A
3760: 72 67 75 6d 65 6e 74 20 70 43 6f 6c 44 65 66 20  rgument pColDef 
3770: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 65 78  contains the tex
3780: 74 20 6f 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20  t of the new.** 
3790: 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f  column definitio
37a0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 54 61 62  n..**.** The Tab
37b0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 50 61  le structure pPa
37c0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 77  rse->pNewTable w
37d0: 61 73 20 65 78 74 65 6e 64 65 64 20 74 6f 20 69  as extended to i
37e0: 6e 63 6c 75 64 65 0a 2a 2a 20 74 68 65 20 6e 65  nclude.** the ne
37f0: 77 20 63 6f 6c 75 6d 6e 20 64 75 72 69 6e 67 20  w column during 
3800: 70 61 72 73 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64  parsing..*/.void
3810: 20 73 71 6c 69 74 65 33 41 6c 74 65 72 46 69 6e   sqlite3AlterFin
3820: 69 73 68 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72  ishAddColumn(Par
3830: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
3840: 6e 20 2a 70 43 6f 6c 44 65 66 29 7b 0a 20 20 54  n *pColDef){.  T
3850: 61 62 6c 65 20 2a 70 4e 65 77 3b 20 20 20 20 20  able *pNew;     
3860: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
3870: 20 6f 66 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   of pParse->pNew
3880: 54 61 62 6c 65 20 2a 2f 0a 20 20 54 61 62 6c 65  Table */.  Table
3890: 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
38a0: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65       /* Table be
38b0: 69 6e 67 20 61 6c 74 65 72 65 64 20 2a 2f 0a 20  ing altered */. 
38c0: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
38d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
38e0: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f  tabase number */
38f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3900: 44 62 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Db;          /* 
3910: 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f  Database name */
3920: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
3930: 54 61 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Tab;         /* 
3940: 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  Table name */.  
3950: 63 68 61 72 20 2a 7a 43 6f 6c 3b 20 20 20 20 20  char *zCol;     
3960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c            /* Nul
3970: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 63 6f 6c  l-terminated col
3980: 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 2a  umn definition *
3990: 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  /.  Column *pCol
39a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
39b0: 20 54 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   The new column 
39c0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 44 66 6c 74  */.  Expr *pDflt
39d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
39e0: 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20  * Default value 
39f0: 66 6f 72 20 74 68 65 20 6e 65 77 20 63 6f 6c 75  for the new colu
3a00: 6d 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  mn */.  sqlite3 
3a10: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
3a20: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
3a30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 3b 20 2a 2f  e connection; */
3a40: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
3a50: 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  nErr ) return;. 
3a60: 20 70 4e 65 77 20 3d 20 70 50 61 72 73 65 2d 3e   pNew = pParse->
3a70: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 61 73 73  pNewTable;.  ass
3a80: 65 72 74 28 20 70 4e 65 77 20 29 3b 0a 0a 20 20  ert( pNew );..  
3a90: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
3aa0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3ab0: 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d  e3BtreeHoldsAllM
3ac0: 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20  utexes(db) );.  
3ad0: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
3ae0: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
3af0: 4e 65 77 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  New->pSchema);. 
3b00: 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69   zDb = db->aDb[i
3b10: 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7a 54 61  Db].zName;.  zTa
3b20: 62 20 3d 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 3b  b = pNew->zName;
3b30: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 4e 65 77 2d  .  pCol = &pNew-
3b40: 3e 61 43 6f 6c 5b 70 4e 65 77 2d 3e 6e 43 6f 6c  >aCol[pNew->nCol
3b50: 2d 31 5d 3b 0a 20 20 70 44 66 6c 74 20 3d 20 70  -1];.  pDflt = p
3b60: 43 6f 6c 2d 3e 70 44 66 6c 74 3b 0a 20 20 70 54  Col->pDflt;.  pT
3b70: 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ab = sqlite3Find
3b80: 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 2c 20  Table(db, zTab, 
3b90: 7a 44 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20  zDb);.  assert( 
3ba0: 70 54 61 62 20 29 3b 0a 0a 23 69 66 6e 64 65 66  pTab );..#ifndef
3bb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
3bc0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20  HORIZATION.  /* 
3bd0: 49 6e 76 6f 6b 65 20 74 68 65 20 61 75 74 68 6f  Invoke the autho
3be0: 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63  rization callbac
3bf0: 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  k. */.  if( sqli
3c00: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
3c10: 72 73 65 2c 20 53 51 4c 49 54 45 5f 41 4c 54 45  rse, SQLITE_ALTE
3c20: 52 5f 54 41 42 4c 45 2c 20 7a 44 62 2c 20 70 54  R_TABLE, zDb, pT
3c30: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20 29 7b  ab->zName, 0) ){
3c40: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
3c50: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
3c60: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
3c70: 75 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 63  ue for the new c
3c80: 6f 6c 75 6d 6e 20 77 61 73 20 73 70 65 63 69 66  olumn was specif
3c90: 69 65 64 20 77 69 74 68 20 61 20 0a 20 20 2a 2a  ied with a .  **
3ca0: 20 6c 69 74 65 72 61 6c 20 4e 55 4c 4c 2c 20 74   literal NULL, t
3cb0: 68 65 6e 20 73 65 74 20 70 44 66 6c 74 20 74 6f  hen set pDflt to
3cc0: 20 30 2e 20 54 68 69 73 20 73 69 6d 70 6c 69 66   0. This simplif
3cd0: 69 65 73 20 63 68 65 63 6b 69 6e 67 0a 20 20 2a  ies checking.  *
3ce0: 2a 20 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c  * for an SQL NUL
3cf0: 4c 20 64 65 66 61 75 6c 74 20 62 65 6c 6f 77 2e  L default below.
3d00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 66 6c  .  */.  if( pDfl
3d10: 74 20 26 26 20 70 44 66 6c 74 2d 3e 6f 70 3d 3d  t && pDflt->op==
3d20: 54 4b 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70  TK_NULL ){.    p
3d30: 44 66 6c 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Dflt = 0;.  }.. 
3d40: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
3d50: 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 69 73  he new column is
3d60: 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64 20 61   not specified a
3d70: 73 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  s PRIMARY KEY or
3d80: 20 55 4e 49 51 55 45 2e 0a 20 20 2a 2a 20 49 66   UNIQUE..  ** If
3d90: 20 74 68 65 72 65 20 69 73 20 61 20 4e 4f 54 20   there is a NOT 
3da0: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2c  NULL constraint,
3db0: 20 74 68 65 6e 20 74 68 65 20 64 65 66 61 75 6c   then the defaul
3dc0: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 0a  t value for the.
3dd0: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6d 75 73 74    ** column must
3de0: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 20 20   not be NULL..  
3df0: 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c 2d 3e 69  */.  if( pCol->i
3e00: 73 50 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20  sPrimKey ){.    
3e10: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3e20: 70 50 61 72 73 65 2c 20 22 43 61 6e 6e 6f 74 20  pParse, "Cannot 
3e30: 61 64 64 20 61 20 50 52 49 4d 41 52 59 20 4b 45  add a PRIMARY KE
3e40: 59 20 63 6f 6c 75 6d 6e 22 29 3b 0a 20 20 20 20  Y column");.    
3e50: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
3e60: 28 20 70 4e 65 77 2d 3e 70 49 6e 64 65 78 20 29  ( pNew->pIndex )
3e70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
3e80: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 43  orMsg(pParse, "C
3e90: 61 6e 6e 6f 74 20 61 64 64 20 61 20 55 4e 49 51  annot add a UNIQ
3ea0: 55 45 20 63 6f 6c 75 6d 6e 22 29 3b 0a 20 20 20  UE column");.   
3eb0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
3ec0: 66 28 20 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c  f( pCol->notNull
3ed0: 20 26 26 20 21 70 44 66 6c 74 20 29 7b 0a 20 20   && !pDflt ){.  
3ee0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3ef0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
3f00: 20 20 20 22 43 61 6e 6e 6f 74 20 61 64 64 20 61     "Cannot add a
3f10: 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   NOT NULL column
3f20: 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 76 61   with default va
3f30: 6c 75 65 20 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  lue NULL");.    
3f40: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
3f50: 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64 65 66  * Ensure the def
3f60: 61 75 6c 74 20 65 78 70 72 65 73 73 69 6f 6e 20  ault expression 
3f70: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  is something tha
3f80: 74 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72  t sqlite3ValueFr
3f90: 6f 6d 45 78 70 72 28 29 0a 20 20 2a 2a 20 63 61  omExpr().  ** ca
3fa0: 6e 20 68 61 6e 64 6c 65 20 28 69 2e 65 2e 20 6e  n handle (i.e. n
3fb0: 6f 74 20 43 55 52 52 45 4e 54 5f 54 49 4d 45 20  ot CURRENT_TIME 
3fc0: 65 74 63 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  etc.).  */.  if(
3fd0: 20 70 44 66 6c 74 20 29 7b 0a 20 20 20 20 73 71   pDflt ){.    sq
3fe0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
3ff0: 6c 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  l;.    if( sqlit
4000: 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  e3ValueFromExpr(
4010: 64 62 2c 20 70 44 66 6c 74 2c 20 53 51 4c 49 54  db, pDflt, SQLIT
4020: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 41  E_UTF8, SQLITE_A
4030: 46 46 5f 4e 4f 4e 45 2c 20 26 70 56 61 6c 29 20  FF_NONE, &pVal) 
4040: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  ){.      db->mal
4050: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
4060: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
4070: 20 7d 0a 20 20 20 20 69 66 28 20 21 70 56 61 6c   }.    if( !pVal
4080: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
4090: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
40a0: 2c 20 22 43 61 6e 6e 6f 74 20 61 64 64 20 61 20  , "Cannot add a 
40b0: 63 6f 6c 75 6d 6e 20 77 69 74 68 20 6e 6f 6e 2d  column with non-
40c0: 63 6f 6e 73 74 61 6e 74 20 64 65 66 61 75 6c 74  constant default
40d0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
40e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
40f0: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
4100: 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f  l);.  }..  /* Mo
4110: 64 69 66 79 20 74 68 65 20 43 52 45 41 54 45 20  dify the CREATE 
4120: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
4130: 20 2a 2f 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c   */.  zCol = sql
4140: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
4150: 2c 20 28 63 68 61 72 2a 29 70 43 6f 6c 44 65 66  , (char*)pColDef
4160: 2d 3e 7a 2c 20 70 43 6f 6c 44 65 66 2d 3e 6e 29  ->z, pColDef->n)
4170: 3b 0a 20 20 69 66 28 20 7a 43 6f 6c 20 29 7b 0a  ;.  if( zCol ){.
4180: 20 20 20 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d      char *zEnd =
4190: 20 26 7a 43 6f 6c 5b 70 43 6f 6c 44 65 66 2d 3e   &zCol[pColDef->
41a0: 6e 2d 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  n-1];.    while(
41b0: 20 28 7a 45 6e 64 3e 7a 43 6f 6c 20 26 26 20 2a   (zEnd>zCol && *
41c0: 7a 45 6e 64 3d 3d 27 3b 27 29 20 7c 7c 20 69 73  zEnd==';') || is
41d0: 73 70 61 63 65 28 2a 28 75 6e 73 69 67 6e 65 64  space(*(unsigned
41e0: 20 63 68 61 72 20 2a 29 7a 45 6e 64 29 20 29 7b   char *)zEnd) ){
41f0: 0a 20 20 20 20 20 20 2a 7a 45 6e 64 2d 2d 20 3d  .      *zEnd-- =
4200: 20 27 5c 30 27 3b 0a 20 20 20 20 7d 0a 20 20 20   '\0';.    }.   
4210: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
4220: 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
4230: 20 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e       "UPDATE %Q.
4240: 25 73 20 53 45 54 20 22 0a 20 20 20 20 20 20 20  %s SET ".       
4250: 20 20 20 22 73 71 6c 20 3d 20 73 75 62 73 74 72     "sql = substr
4260: 28 73 71 6c 2c 31 2c 25 64 29 20 7c 7c 20 27 2c  (sql,1,%d) || ',
4270: 20 27 20 7c 7c 20 25 51 20 7c 7c 20 73 75 62 73   ' || %Q || subs
4280: 74 72 28 73 71 6c 2c 25 64 29 20 22 0a 20 20 20  tr(sql,%d) ".   
4290: 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
42a0: 20 3d 20 27 74 61 62 6c 65 27 20 41 4e 44 20 6e   = 'table' AND n
42b0: 61 6d 65 20 3d 20 25 51 22 2c 20 0a 20 20 20 20  ame = %Q", .    
42c0: 20 20 7a 44 62 2c 20 53 43 48 45 4d 41 5f 54 41    zDb, SCHEMA_TA
42d0: 42 4c 45 28 69 44 62 29 2c 20 70 4e 65 77 2d 3e  BLE(iDb), pNew->
42e0: 61 64 64 43 6f 6c 4f 66 66 73 65 74 2c 20 7a 43  addColOffset, zC
42f0: 6f 6c 2c 20 70 4e 65 77 2d 3e 61 64 64 43 6f 6c  ol, pNew->addCol
4300: 4f 66 66 73 65 74 2b 31 2c 0a 20 20 20 20 20 20  Offset+1,.      
4310: 7a 54 61 62 0a 20 20 20 20 29 3b 0a 20 20 20 20  zTab.    );.    
4320: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
4330: 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  l);.  }..  /* If
4340: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   the default val
4350: 75 65 20 6f 66 20 74 68 65 20 6e 65 77 20 63 6f  ue of the new co
4360: 6c 75 6d 6e 20 69 73 20 4e 55 4c 4c 2c 20 74 68  lumn is NULL, th
4370: 65 6e 20 73 65 74 20 74 68 65 20 66 69 6c 65 0a  en set the file.
4380: 20 20 2a 2a 20 66 6f 72 6d 61 74 20 74 6f 20 32    ** format to 2
4390: 2e 20 49 66 20 74 68 65 20 64 65 66 61 75 6c 74  . If the default
43a0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6e 65   value of the ne
43b0: 77 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20  w column is not 
43c0: 4e 55 4c 4c 2c 0a 20 20 2a 2a 20 74 68 65 20 66  NULL,.  ** the f
43d0: 69 6c 65 20 66 6f 72 6d 61 74 20 62 65 63 6f 6d  ile format becom
43e0: 65 73 20 33 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  es 3..  */.  sql
43f0: 69 74 65 33 4d 69 6e 69 6d 75 6d 46 69 6c 65 46  ite3MinimumFileF
4400: 6f 72 6d 61 74 28 70 50 61 72 73 65 2c 20 69 44  ormat(pParse, iD
4410: 62 2c 20 70 44 66 6c 74 20 3f 20 33 20 3a 20 32  b, pDflt ? 3 : 2
4420: 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 6f 61 64 20  );..  /* Reload 
4430: 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68  the schema of th
4440: 65 20 6d 6f 64 69 66 69 65 64 20 74 61 62 6c 65  e modified table
4450: 2e 20 2a 2f 0a 20 20 72 65 6c 6f 61 64 54 61 62  . */.  reloadTab
4460: 6c 65 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  leSchema(pParse,
4470: 20 70 54 61 62 2c 20 70 54 61 62 2d 3e 7a 4e 61   pTab, pTab->zNa
4480: 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  me);.}../*.** Th
4490: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
44a0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
44b0: 73 65 72 20 61 66 74 65 72 20 74 68 65 20 74 61  ser after the ta
44c0: 62 6c 65 2d 6e 61 6d 65 20 69 6e 0a 2a 2a 20 61  ble-name in.** a
44d0: 6e 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 3c  n "ALTER TABLE <
44e0: 74 61 62 6c 65 2d 6e 61 6d 65 3e 20 41 44 44 22  table-name> ADD"
44f0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
4500: 72 73 65 64 2e 20 41 72 67 75 6d 65 6e 74 20 0a  rsed. Argument .
4510: 2a 2a 20 70 53 72 63 20 69 73 20 74 68 65 20 66  ** pSrc is the f
4520: 75 6c 6c 2d 6e 61 6d 65 20 6f 66 20 74 68 65 20  ull-name of the 
4530: 74 61 62 6c 65 20 62 65 69 6e 67 20 61 6c 74 65  table being alte
4540: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  red..**.** This 
4550: 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 61 20  routine makes a 
4560: 28 70 61 72 74 69 61 6c 29 20 63 6f 70 79 20 6f  (partial) copy o
4570: 66 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  f the Table stru
4580: 63 74 75 72 65 0a 2a 2a 20 66 6f 72 20 74 68 65  cture.** for the
4590: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 61 6c 74   table being alt
45a0: 65 72 65 64 20 61 6e 64 20 73 65 74 73 20 50 61  ered and sets Pa
45b0: 72 73 65 2e 70 4e 65 77 54 61 62 6c 65 20 74 6f  rse.pNewTable to
45c0: 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 69 74 2e   point.** to it.
45d0: 20 52 6f 75 74 69 6e 65 73 20 63 61 6c 6c 65 64   Routines called
45e0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 61   by the parser a
45f0: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66  s the column def
4600: 69 6e 69 74 69 6f 6e 0a 2a 2a 20 69 73 20 70 61  inition.** is pa
4610: 72 73 65 64 20 28 69 2e 65 2e 20 73 71 6c 69 74  rsed (i.e. sqlit
4620: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 29 29 20 61  e3AddColumn()) a
4630: 64 64 20 74 68 65 20 6e 65 77 20 43 6f 6c 75 6d  dd the new Colum
4640: 6e 20 64 61 74 61 20 74 6f 20 0a 2a 2a 20 74 68  n data to .** th
4650: 65 20 63 6f 70 79 2e 20 54 68 65 20 63 6f 70 79  e copy. The copy
4660: 20 6f 66 20 74 68 65 20 54 61 62 6c 65 20 73 74   of the Table st
4670: 72 75 63 74 75 72 65 20 69 73 20 64 65 6c 65 74  ructure is delet
4680: 65 64 20 62 79 20 74 6f 6b 65 6e 69 7a 65 2e 63  ed by tokenize.c
4690: 20 0a 2a 2a 20 61 66 74 65 72 20 70 61 72 73 69   .** after parsi
46a0: 6e 67 20 69 73 20 66 69 6e 69 73 68 65 64 2e 0a  ng is finished..
46b0: 2a 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 73 71  **.** Routine sq
46c0: 6c 69 74 65 33 41 6c 74 65 72 46 69 6e 69 73 68  lite3AlterFinish
46d0: 41 64 64 43 6f 6c 75 6d 6e 28 29 20 77 69 6c 6c  AddColumn() will
46e0: 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f   be called to co
46f0: 6d 70 6c 65 74 65 0a 2a 2a 20 63 6f 64 69 6e 67  mplete.** coding
4700: 20 74 68 65 20 22 41 4c 54 45 52 20 54 41 42 4c   the "ALTER TABL
4710: 45 20 2e 2e 2e 20 41 44 44 22 20 73 74 61 74 65  E ... ADD" state
4720: 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
4730: 6c 69 74 65 33 41 6c 74 65 72 42 65 67 69 6e 41  lite3AlterBeginA
4740: 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a  ddColumn(Parse *
4750: 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
4760: 2a 70 53 72 63 29 7b 0a 20 20 54 61 62 6c 65 20  *pSrc){.  Table 
4770: 2a 70 4e 65 77 3b 0a 20 20 54 61 62 6c 65 20 2a  *pNew;.  Table *
4780: 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  pTab;.  Vdbe *v;
4790: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 69 6e  .  int iDb;.  in
47a0: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f  t i;.  int nAllo
47b0: 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
47c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
47d0: 20 20 2f 2a 20 4c 6f 6f 6b 20 75 70 20 74 68 65    /* Look up the
47e0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 61 6c 74   table being alt
47f0: 65 72 65 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72  ered. */.  asser
4800: 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  t( pParse->pNewT
4810: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  able==0 );.  ass
4820: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
4830: 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73  eHoldsAllMutexes
4840: 28 64 62 29 20 29 3b 0a 20 20 69 66 28 20 64 62  (db) );.  if( db
4850: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
4860: 20 67 6f 74 6f 20 65 78 69 74 5f 62 65 67 69 6e   goto exit_begin
4870: 5f 61 64 64 5f 63 6f 6c 75 6d 6e 3b 0a 20 20 70  _add_column;.  p
4880: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
4890: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
48a0: 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d   pSrc->a[0].zNam
48b0: 65 2c 20 70 53 72 63 2d 3e 61 5b 30 5d 2e 7a 44  e, pSrc->a[0].zD
48c0: 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20  atabase);.  if( 
48d0: 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69  !pTab ) goto exi
48e0: 74 5f 62 65 67 69 6e 5f 61 64 64 5f 63 6f 6c 75  t_begin_add_colu
48f0: 6d 6e 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  mn;..#ifndef SQL
4900: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
4910: 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56 69  TABLE.  if( IsVi
4920: 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
4930: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4940: 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72 74  sg(pParse, "virt
4950: 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e  ual tables may n
4960: 6f 74 20 62 65 20 61 6c 74 65 72 65 64 22 29 3b  ot be altered");
4970: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 62  .    goto exit_b
4980: 65 67 69 6e 5f 61 64 64 5f 63 6f 6c 75 6d 6e 3b  egin_add_column;
4990: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
49a0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73  * Make sure this
49b0: 20 69 73 20 6e 6f 74 20 61 6e 20 61 74 74 65 6d   is not an attem
49c0: 70 74 20 74 6f 20 41 4c 54 45 52 20 61 20 76 69  pt to ALTER a vi
49d0: 65 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ew. */.  if( pTa
49e0: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
49f0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4a00: 67 28 70 50 61 72 73 65 2c 20 22 43 61 6e 6e 6f  g(pParse, "Canno
4a10: 74 20 61 64 64 20 61 20 63 6f 6c 75 6d 6e 20 74  t add a column t
4a20: 6f 20 61 20 76 69 65 77 22 29 3b 0a 20 20 20 20  o a view");.    
4a30: 67 6f 74 6f 20 65 78 69 74 5f 62 65 67 69 6e 5f  goto exit_begin_
4a40: 61 64 64 5f 63 6f 6c 75 6d 6e 3b 0a 20 20 7d 0a  add_column;.  }.
4a50: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
4a60: 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 3e 30 20  >addColOffset>0 
4a70: 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74  );.  iDb = sqlit
4a80: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
4a90: 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
4aa0: 61 29 3b 0a 0a 20 20 2f 2a 20 50 75 74 20 61 20  a);..  /* Put a 
4ab0: 63 6f 70 79 20 6f 66 20 74 68 65 20 54 61 62 6c  copy of the Tabl
4ac0: 65 20 73 74 72 75 63 74 20 69 6e 20 50 61 72 73  e struct in Pars
4ad0: 65 2e 70 4e 65 77 54 61 62 6c 65 20 66 6f 72 20  e.pNewTable for 
4ae0: 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  the.  ** sqlite3
4af0: 41 64 64 43 6f 6c 75 6d 6e 28 29 20 66 75 6e 63  AddColumn() func
4b00: 74 69 6f 6e 20 61 6e 64 20 66 72 69 65 6e 64 73  tion and friends
4b10: 20 74 6f 20 6d 6f 64 69 66 79 2e 0a 20 20 2a 2f   to modify..  */
4b20: 0a 20 20 70 4e 65 77 20 3d 20 28 54 61 62 6c 65  .  pNew = (Table
4b30: 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
4b40: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
4b50: 28 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20  (Table));.  if( 
4b60: 21 70 4e 65 77 20 29 20 67 6f 74 6f 20 65 78 69  !pNew ) goto exi
4b70: 74 5f 62 65 67 69 6e 5f 61 64 64 5f 63 6f 6c 75  t_begin_add_colu
4b80: 6d 6e 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e  mn;.  pParse->pN
4b90: 65 77 54 61 62 6c 65 20 3d 20 70 4e 65 77 3b 0a  ewTable = pNew;.
4ba0: 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31    pNew->nRef = 1
4bb0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 43 6f 6c 20 3d  ;.  pNew->nCol =
4bc0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 61   pTab->nCol;.  a
4bd0: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 6f  ssert( pNew->nCo
4be0: 6c 3e 30 20 29 3b 0a 20 20 6e 41 6c 6c 6f 63 20  l>0 );.  nAlloc 
4bf0: 3d 20 28 28 28 70 4e 65 77 2d 3e 6e 43 6f 6c 2d  = (((pNew->nCol-
4c00: 31 29 2f 38 29 2a 38 29 2b 38 3b 0a 20 20 61 73  1)/8)*8)+8;.  as
4c10: 73 65 72 74 28 20 6e 41 6c 6c 6f 63 3e 3d 70 4e  sert( nAlloc>=pN
4c20: 65 77 2d 3e 6e 43 6f 6c 20 26 26 20 6e 41 6c 6c  ew->nCol && nAll
4c30: 6f 63 25 38 3d 3d 30 20 26 26 20 6e 41 6c 6c 6f  oc%8==0 && nAllo
4c40: 63 2d 70 4e 65 77 2d 3e 6e 43 6f 6c 3c 38 20 29  c-pNew->nCol<8 )
4c50: 3b 0a 20 20 70 4e 65 77 2d 3e 61 43 6f 6c 20 3d  ;.  pNew->aCol =
4c60: 20 28 43 6f 6c 75 6d 6e 2a 29 73 71 6c 69 74 65   (Column*)sqlite
4c70: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
4c80: 2c 20 73 69 7a 65 6f 66 28 43 6f 6c 75 6d 6e 29  , sizeof(Column)
4c90: 2a 6e 41 6c 6c 6f 63 29 3b 0a 20 20 70 4e 65 77  *nAlloc);.  pNew
4ca0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
4cb0: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 54  3DbStrDup(db, pT
4cc0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  ab->zName);.  if
4cd0: 28 20 21 70 4e 65 77 2d 3e 61 43 6f 6c 20 7c 7c  ( !pNew->aCol ||
4ce0: 20 21 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 29 7b   !pNew->zName ){
4cf0: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
4d00: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 67  ailed = 1;.    g
4d10: 6f 74 6f 20 65 78 69 74 5f 62 65 67 69 6e 5f 61  oto exit_begin_a
4d20: 64 64 5f 63 6f 6c 75 6d 6e 3b 0a 20 20 7d 0a 20  dd_column;.  }. 
4d30: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 61 43   memcpy(pNew->aC
4d40: 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 2c 20  ol, pTab->aCol, 
4d50: 73 69 7a 65 6f 66 28 43 6f 6c 75 6d 6e 29 2a 70  sizeof(Column)*p
4d60: 4e 65 77 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 66 6f  New->nCol);.  fo
4d70: 72 28 69 3d 30 3b 20 69 3c 70 4e 65 77 2d 3e 6e  r(i=0; i<pNew->n
4d80: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 43  Col; i++){.    C
4d90: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 26 70  olumn *pCol = &p
4da0: 4e 65 77 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20  New->aCol[i];.  
4db0: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
4dc0: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
4dd0: 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  db, pCol->zName)
4de0: 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 43 6f 6c  ;.    pCol->zCol
4df0: 6c 20 3d 20 30 3b 0a 20 20 20 20 70 43 6f 6c 2d  l = 0;.    pCol-
4e00: 3e 7a 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  >zType = 0;.    
4e10: 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 30 3b  pCol->pDflt = 0;
4e20: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 53 63  .  }.  pNew->pSc
4e30: 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
4e40: 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70  Db].pSchema;.  p
4e50: 4e 65 77 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65  New->addColOffse
4e60: 74 20 3d 20 70 54 61 62 2d 3e 61 64 64 43 6f 6c  t = pTab->addCol
4e70: 4f 66 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e  Offset;.  pNew->
4e80: 6e 52 65 66 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20  nRef = 1;..  /* 
4e90: 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
4ea0: 69 6f 6e 20 61 6e 64 20 69 6e 63 72 65 6d 65 6e  ion and incremen
4eb0: 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  t the schema coo
4ec0: 6b 69 65 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74  kie.  */.  sqlit
4ed0: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
4ee0: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ation(pParse, 0,
4ef0: 20 69 44 62 29 3b 0a 20 20 76 20 3d 20 73 71 6c   iDb);.  v = sql
4f00: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
4f10: 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20  se);.  if( !v ) 
4f20: 67 6f 74 6f 20 65 78 69 74 5f 62 65 67 69 6e 5f  goto exit_begin_
4f30: 61 64 64 5f 63 6f 6c 75 6d 6e 3b 0a 20 20 73 71  add_column;.  sq
4f40: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
4f50: 65 28 64 62 2c 20 76 2c 20 69 44 62 29 3b 0a 0a  e(db, v, iDb);..
4f60: 65 78 69 74 5f 62 65 67 69 6e 5f 61 64 64 5f 63  exit_begin_add_c
4f70: 6f 6c 75 6d 6e 3a 0a 20 20 73 71 6c 69 74 65 33  olumn:.  sqlite3
4f80: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 53  SrcListDelete(pS
4f90: 72 63 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  rc);.  return;.}
4fa0: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49  .#endif  /* SQLI
4fb0: 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 2a  TE_ALTER_TABLE *
4fc0: 2f 0a                                            /.