/ Hex Artifact Content
Login

Artifact deddf439893a8157b19b2b69e9537ed12aa2e4ddf5738141932f6d0330d1bb44:


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 2f 0a 23 69 6e 63 6c  ommand..*/.#incl
01f0: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
0200: 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  "../*.** The cod
0210: 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 6f  e in this file o
0220: 6e 6c 79 20 65 78 69 73 74 73 20 69 66 20 77 65  nly exists if we
0230: 20 61 72 65 20 6e 6f 74 20 6f 6d 69 74 74 69 6e   are not omittin
0240: 67 20 74 68 65 0a 2a 2a 20 41 4c 54 45 52 20 54  g the.** ALTER T
0250: 41 42 4c 45 20 6c 6f 67 69 63 20 66 72 6f 6d 20  ABLE logic from 
0260: 74 68 65 20 62 75 69 6c 64 2e 0a 2a 2f 0a 23 69  the build..*/.#i
0270: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0280: 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 0a 2f 2a  T_ALTERTABLE../*
0290: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e  .** Parameter zN
02a0: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
02b0: 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  of a table that 
02c0: 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 61  is about to be a
02d0: 6c 74 65 72 65 64 0a 2a 2a 20 28 65 69 74 68 65  ltered.** (eithe
02e0: 72 20 77 69 74 68 20 41 4c 54 45 52 20 54 41 42  r with ALTER TAB
02f0: 4c 45 20 2e 2e 2e 20 52 45 4e 41 4d 45 20 54 4f  LE ... RENAME TO
0300: 20 6f 72 20 41 4c 54 45 52 20 54 41 42 4c 45 20   or ALTER TABLE 
0310: 2e 2e 2e 20 41 44 44 20 43 4f 4c 55 4d 4e 29 2e  ... ADD COLUMN).
0320: 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65  .** If the table
0330: 20 69 73 20 61 20 73 79 73 74 65 6d 20 74 61 62   is a system tab
0340: 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  le, this functio
0350: 6e 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f  n leaves an erro
0360: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20  r message.** in 
0370: 70 50 61 72 73 65 2d 3e 7a 45 72 72 20 28 73 79  pParse->zErr (sy
0380: 73 74 65 6d 20 74 61 62 6c 65 73 20 6d 61 79 20  stem tables may 
0390: 6e 6f 74 20 62 65 20 61 6c 74 65 72 65 64 29 20  not be altered) 
03a0: 61 6e 64 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  and returns non-
03b0: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  zero..**.** Or, 
03c0: 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20  if zName is not 
03d0: 61 20 73 79 73 74 65 6d 20 74 61 62 6c 65 2c 20  a system table, 
03e0: 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
03f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0400: 69 73 41 6c 74 65 72 61 62 6c 65 54 61 62 6c 65  isAlterableTable
0410: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
0420: 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20  Table *pTab){.  
0430: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
0440: 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
0450: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
0460: 29 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ) .#ifndef SQLIT
0470: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
0480: 42 4c 45 0a 20 20 20 7c 7c 20 28 20 28 70 54 61  BLE.   || ( (pTa
0490: 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
04a0: 5f 53 68 61 64 6f 77 29 20 0a 20 20 20 20 20 26  _Shadow) .     &
04b0: 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  & (pParse->db->f
04c0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44 65  lags & SQLITE_De
04d0: 66 65 6e 73 69 76 65 29 0a 20 20 20 20 20 26 26  fensive).     &&
04e0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 56 64   pParse->db->nVd
04f0: 62 65 45 78 65 63 3d 3d 30 0a 20 20 20 29 0a 23  beExec==0.   ).#
0500: 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 73  endif.  ){.    s
0510: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
0520: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
0530: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 74 65   may not be alte
0540: 72 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  red", pTab->zNam
0550: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
0560: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
0570: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
0580: 61 74 65 20 63 6f 64 65 20 74 6f 20 76 65 72 69  ate code to veri
0590: 66 79 20 74 68 61 74 20 74 68 65 20 73 63 68 65  fy that the sche
05a0: 6d 61 73 20 6f 66 20 64 61 74 61 62 61 73 65 20  mas of database 
05b0: 7a 44 62 20 61 6e 64 2c 20 69 66 0a 2a 2a 20 62  zDb and, if.** b
05c0: 54 65 6d 70 20 69 73 20 6e 6f 74 20 74 72 75 65  Temp is not true
05d0: 2c 20 64 61 74 61 62 61 73 65 20 22 74 65 6d 70  , database "temp
05e0: 22 2c 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20  ", can still be 
05f0: 70 61 72 73 65 64 2e 20 54 68 69 73 20 69 73 0a  parsed. This is.
0600: 2a 2a 20 63 61 6c 6c 65 64 20 61 74 20 74 68 65  ** called at the
0610: 20 65 6e 64 20 6f 66 20 74 68 65 20 67 65 6e 65   end of the gene
0620: 72 61 74 69 6f 6e 20 6f 66 20 61 6e 20 41 4c 54  ration of an ALT
0630: 45 52 20 54 41 42 4c 45 20 2e 2e 2e 20 52 45 4e  ER TABLE ... REN
0640: 41 4d 45 20 2e 2e 2e 0a 2a 2a 20 73 74 61 74 65  AME ....** state
0650: 6d 65 6e 74 20 74 6f 20 65 6e 73 75 72 65 20 74  ment to ensure t
0660: 68 61 74 20 74 68 65 20 6f 70 65 72 61 74 69 6f  hat the operatio
0670: 6e 20 68 61 73 20 6e 6f 74 20 72 65 6e 64 65 72  n has not render
0680: 65 64 20 61 6e 79 20 73 63 68 65 6d 61 0a 2a 2a  ed any schema.**
0690: 20 6f 62 6a 65 63 74 73 20 75 6e 75 73 61 62 6c   objects unusabl
06a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
06b0: 64 20 72 65 6e 61 6d 65 54 65 73 74 53 63 68 65  d renameTestSche
06c0: 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
06d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
06e0: 62 2c 20 69 6e 74 20 62 54 65 6d 70 29 7b 0a 20  b, int bTemp){. 
06f0: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
0700: 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
0710: 20 20 20 22 53 45 4c 45 43 54 20 31 20 22 0a 20     "SELECT 1 ". 
0720: 20 20 20 20 20 22 46 52 4f 4d 20 5c 22 25 77 5c       "FROM \"%w\
0730: 22 2e 25 73 20 22 0a 20 20 20 20 20 20 22 57 48  ".%s ".      "WH
0740: 45 52 45 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b  ERE name NOT LIK
0750: 45 20 27 73 71 6c 69 74 65 58 5f 25 25 27 20 45  E 'sqliteX_%%' E
0760: 53 43 41 50 45 20 27 58 27 22 0a 20 20 20 20 20  SCAPE 'X'".     
0770: 20 22 20 41 4e 44 20 73 71 6c 20 4e 4f 54 20 4c   " AND sql NOT L
0780: 49 4b 45 20 27 63 72 65 61 74 65 20 76 69 72 74  IKE 'create virt
0790: 75 61 6c 25 25 27 22 0a 20 20 20 20 20 20 22 20  ual%%'".      " 
07a0: 41 4e 44 20 73 71 6c 69 74 65 5f 72 65 6e 61 6d  AND sqlite_renam
07b0: 65 5f 74 65 73 74 28 25 51 2c 20 73 71 6c 2c 20  e_test(%Q, sql, 
07c0: 74 79 70 65 2c 20 6e 61 6d 65 2c 20 25 64 29 3d  type, name, %d)=
07d0: 4e 55 4c 4c 20 22 2c 0a 20 20 20 20 20 20 7a 44  NULL ",.      zD
07e0: 62 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20  b, MASTER_NAME, 
07f0: 0a 20 20 20 20 20 20 7a 44 62 2c 20 62 54 65 6d  .      zDb, bTem
0800: 70 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 62 54  p.  );..  if( bT
0810: 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  emp==0 ){.    sq
0820: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
0830: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
0840: 20 20 22 53 45 4c 45 43 54 20 31 20 22 0a 20 20    "SELECT 1 ".  
0850: 20 20 20 20 20 20 22 46 52 4f 4d 20 74 65 6d 70        "FROM temp
0860: 2e 25 73 20 22 0a 20 20 20 20 20 20 20 20 22 57  .%s ".        "W
0870: 48 45 52 45 20 6e 61 6d 65 20 4e 4f 54 20 4c 49  HERE name NOT LI
0880: 4b 45 20 27 73 71 6c 69 74 65 58 5f 25 25 27 20  KE 'sqliteX_%%' 
0890: 45 53 43 41 50 45 20 27 58 27 22 0a 20 20 20 20  ESCAPE 'X'".    
08a0: 20 20 20 20 22 20 41 4e 44 20 73 71 6c 20 4e 4f      " AND sql NO
08b0: 54 20 4c 49 4b 45 20 27 63 72 65 61 74 65 20 76  T LIKE 'create v
08c0: 69 72 74 75 61 6c 25 25 27 22 0a 20 20 20 20 20  irtual%%'".     
08d0: 20 20 20 22 20 41 4e 44 20 73 71 6c 69 74 65 5f     " AND sqlite_
08e0: 72 65 6e 61 6d 65 5f 74 65 73 74 28 25 51 2c 20  rename_test(%Q, 
08f0: 73 71 6c 2c 20 74 79 70 65 2c 20 6e 61 6d 65 2c  sql, type, name,
0900: 20 31 29 3d 4e 55 4c 4c 20 22 2c 0a 20 20 20 20   1)=NULL ",.    
0910: 20 20 20 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c      MASTER_NAME,
0920: 20 7a 44 62 20 0a 20 20 20 20 29 3b 0a 20 20 7d   zDb .    );.  }
0930: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
0940: 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6c 6f 61  te code to reloa
0950: 64 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  d the schema for
0960: 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 41   database iDb. A
0970: 6e 64 2c 20 69 66 20 69 44 62 21 3d 31 2c 20 66  nd, if iDb!=1, f
0980: 6f 72 0a 2a 2a 20 74 68 65 20 74 65 6d 70 20 64  or.** the temp d
0990: 61 74 61 62 61 73 65 20 61 73 20 77 65 6c 6c 2e  atabase as well.
09a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
09b0: 72 65 6e 61 6d 65 52 65 6c 6f 61 64 53 63 68 65  renameReloadSche
09c0: 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
09d0: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
09e0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
09f0: 70 56 64 62 65 3b 0a 20 20 69 66 28 20 76 20 29  pVdbe;.  if( v )
0a00: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61  {.    sqlite3Cha
0a10: 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
0a20: 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
0a30: 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65 53  te3VdbeAddParseS
0a40: 63 68 65 6d 61 4f 70 28 70 50 61 72 73 65 2c 20  chemaOp(pParse, 
0a50: 69 44 62 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  iDb, 0);.    if(
0a60: 20 69 44 62 21 3d 31 20 29 20 73 71 6c 69 74 65   iDb!=1 ) sqlite
0a70: 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68  3VdbeAddParseSch
0a80: 65 6d 61 4f 70 28 70 50 61 72 73 65 2c 20 31 2c  emaOp(pParse, 1,
0a90: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
0aa0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
0ab0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
0ac0: 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 78 78   "ALTER TABLE xx
0ad0: 78 20 52 45 4e 41 4d 45 20 54 4f 20 79 79 79 22  x RENAME TO yyy"
0ae0: 20 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a   .** command. .*
0af0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 6c  /.void sqlite3Al
0b00: 74 65 72 52 65 6e 61 6d 65 54 61 62 6c 65 28 0a  terRenameTable(.
0b10: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
0b30: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 2e 20 2a  arser context. *
0b40: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  /.  SrcList *pSr
0b50: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
0b60: 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20 72 65   The table to re
0b70: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  name. */.  Token
0b80: 20 2a 70 4e 61 6d 65 20 20 20 20 20 20 20 20 20   *pName         
0b90: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
0ba0: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 2a 2f 0a 29  table name. */.)
0bb0: 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  {.  int iDb;    
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0bd0: 20 44 61 74 61 62 61 73 65 20 74 68 61 74 20 63   Database that c
0be0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c  ontains the tabl
0bf0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62  e */.  char *zDb
0c00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0c10: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74 61   /* Name of data
0c20: 62 61 73 65 20 69 44 62 20 2a 2f 0a 20 20 54 61  base iDb */.  Ta
0c30: 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
0c40: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
0c50: 20 62 65 69 6e 67 20 72 65 6e 61 6d 65 64 20 2a   being renamed *
0c60: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  /.  char *zName 
0c70: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
0c80: 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61 74 65 64   NULL-terminated
0c90: 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 4e 61 6d   version of pNam
0ca0: 65 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 20  e */ .  sqlite3 
0cb0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
0cc0: 3b 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f  ; /* Database co
0cd0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
0ce0: 74 20 6e 54 61 62 4e 61 6d 65 3b 20 20 20 20 20  t nTabName;     
0cf0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
0d00: 72 20 6f 66 20 55 54 46 2d 38 20 63 68 61 72 61  r of UTF-8 chara
0d10: 63 74 65 72 73 20 69 6e 20 7a 54 61 62 4e 61 6d  cters in zTabNam
0d20: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
0d30: 72 20 2a 7a 54 61 62 4e 61 6d 65 3b 20 20 20 20  r *zTabName;    
0d40: 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 61 6d   /* Original nam
0d50: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  e of the table *
0d60: 2f 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 56  /.  Vdbe *v;.  V
0d70: 54 61 62 6c 65 20 2a 70 56 54 61 62 20 3d 20 30  Table *pVTab = 0
0d80: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d  ;        /* Non-
0d90: 7a 65 72 6f 20 69 66 20 74 68 69 73 20 69 73 20  zero if this is 
0da0: 61 20 76 2d 74 61 62 20 77 69 74 68 20 61 6e 20  a v-tab with an 
0db0: 78 52 65 6e 61 6d 65 28 29 20 2a 2f 0a 20 20 75  xRename() */.  u
0dc0: 33 32 20 73 61 76 65 64 44 62 46 6c 61 67 73 3b  32 savedDbFlags;
0dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65           /* Save
0de0: 64 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 6d  d value of db->m
0df0: 44 62 46 6c 61 67 73 20 2a 2f 0a 0a 20 20 73 61  DbFlags */..  sa
0e00: 76 65 64 44 62 46 6c 61 67 73 20 3d 20 64 62 2d  vedDbFlags = db-
0e10: 3e 6d 44 62 46 6c 61 67 73 3b 20 20 0a 20 20 69  >mDbFlags;  .  i
0e20: 66 28 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c  f( NEVER(db->mal
0e30: 6c 6f 63 46 61 69 6c 65 64 29 20 29 20 67 6f 74  locFailed) ) got
0e40: 6f 20 65 78 69 74 5f 72 65 6e 61 6d 65 5f 74 61  o exit_rename_ta
0e50: 62 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ble;.  assert( p
0e60: 53 72 63 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  Src->nSrc==1 );.
0e70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
0e80: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
0e90: 74 65 78 65 73 28 70 50 61 72 73 65 2d 3e 64 62  texes(pParse->db
0ea0: 29 20 29 3b 0a 0a 20 20 70 54 61 62 20 3d 20 73  ) );..  pTab = s
0eb0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
0ec0: 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c  eItem(pParse, 0,
0ed0: 20 26 70 53 72 63 2d 3e 61 5b 30 5d 29 3b 0a 20   &pSrc->a[0]);. 
0ee0: 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74   if( !pTab ) got
0ef0: 6f 20 65 78 69 74 5f 72 65 6e 61 6d 65 5f 74 61  o exit_rename_ta
0f00: 62 6c 65 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  ble;.  iDb = sql
0f10: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
0f20: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
0f30: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
0f40: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
0f50: 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 64  b].zDbSName;.  d
0f60: 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20 44  b->mDbFlags |= D
0f70: 42 46 4c 41 47 5f 50 72 65 66 65 72 42 75 69 6c  BFLAG_PreferBuil
0f80: 74 69 6e 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61  tin;..  /* Get a
0f90: 20 4e 55 4c 4c 20 74 65 72 6d 69 6e 61 74 65 64   NULL terminated
0fa0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
0fb0: 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  new table name. 
0fc0: 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  */.  zName = sql
0fd0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
0fe0: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
0ff0: 69 66 28 20 21 7a 4e 61 6d 65 20 29 20 67 6f 74  if( !zName ) got
1000: 6f 20 65 78 69 74 5f 72 65 6e 61 6d 65 5f 74 61  o exit_rename_ta
1010: 62 6c 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ble;..  /* Check
1020: 20 74 68 61 74 20 61 20 74 61 62 6c 65 20 6f 72   that a table or
1030: 20 69 6e 64 65 78 20 6e 61 6d 65 64 20 27 7a 4e   index named 'zN
1040: 61 6d 65 27 20 64 6f 65 73 20 6e 6f 74 20 61 6c  ame' does not al
1050: 72 65 61 64 79 20 65 78 69 73 74 0a 20 20 2a 2a  ready exist.  **
1060: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
1070: 2e 20 49 66 20 73 6f 2c 20 74 68 69 73 20 69 73  . If so, this is
1080: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a   an error..  */.
1090: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
10a0: 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65  dTable(db, zName
10b0: 2c 20 7a 44 62 29 20 7c 7c 20 73 71 6c 69 74 65  , zDb) || sqlite
10c0: 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
10d0: 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
10e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10f0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
1100: 20 20 20 22 74 68 65 72 65 20 69 73 20 61 6c 72     "there is alr
1110: 65 61 64 79 20 61 6e 6f 74 68 65 72 20 74 61 62  eady another tab
1120: 6c 65 20 6f 72 20 69 6e 64 65 78 20 77 69 74 68  le or index with
1130: 20 74 68 69 73 20 6e 61 6d 65 3a 20 25 73 22 2c   this name: %s",
1140: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74   zName);.    got
1150: 6f 20 65 78 69 74 5f 72 65 6e 61 6d 65 5f 74 61  o exit_rename_ta
1160: 62 6c 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  ble;.  }..  /* M
1170: 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 6e  ake sure it is n
1180: 6f 74 20 61 20 73 79 73 74 65 6d 20 74 61 62 6c  ot a system tabl
1190: 65 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2c  e being altered,
11a0: 20 6f 72 20 61 20 72 65 73 65 72 76 65 64 20 6e   or a reserved n
11b0: 61 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  ame.  ** that th
11c0: 65 20 74 61 62 6c 65 20 69 73 20 62 65 69 6e 67  e table is being
11d0: 20 72 65 6e 61 6d 65 64 20 74 6f 2e 0a 20 20 2a   renamed to..  *
11e0: 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
11f0: 4b 21 3d 69 73 41 6c 74 65 72 61 62 6c 65 54 61  K!=isAlterableTa
1200: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
1210: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
1220: 69 74 5f 72 65 6e 61 6d 65 5f 74 61 62 6c 65 3b  it_rename_table;
1230: 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49 54  .  }.  if( SQLIT
1240: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65  E_OK!=sqlite3Che
1250: 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61  ckObjectName(pPa
1260: 72 73 65 2c 7a 4e 61 6d 65 2c 22 74 61 62 6c 65  rse,zName,"table
1270: 22 2c 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  ",zName) ){.    
1280: 67 6f 74 6f 20 65 78 69 74 5f 72 65 6e 61 6d 65  goto exit_rename
1290: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66  _table;.  }..#if
12a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12b0: 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62  _VIEW.  if( pTab
12c0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
12d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
12e0: 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25  (pParse, "view %
12f0: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 74  s may not be alt
1300: 65 72 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  ered", pTab->zNa
1310: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
1320: 69 74 5f 72 65 6e 61 6d 65 5f 74 61 62 6c 65 3b  it_rename_table;
1330: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
1340: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1350: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
1360: 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 61   /* Invoke the a
1370: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c  uthorization cal
1380: 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20  lback. */.  if( 
1390: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
13a0: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
13b0: 41 4c 54 45 52 5f 54 41 42 4c 45 2c 20 7a 44 62  ALTER_TABLE, zDb
13c0: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
13d0: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  ) ){.    goto ex
13e0: 69 74 5f 72 65 6e 61 6d 65 5f 74 61 62 6c 65 3b  it_rename_table;
13f0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
1400: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1410: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
1420: 69 66 28 20 73 71 6c 69 74 65 33 56 69 65 77 47  if( sqlite3ViewG
1430: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
1440: 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20  arse, pTab) ){. 
1450: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 72 65 6e     goto exit_ren
1460: 61 6d 65 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20  ame_table;.  }. 
1470: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
1480: 54 61 62 29 20 29 7b 0a 20 20 20 20 70 56 54 61  Tab) ){.    pVTa
1490: 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  b = sqlite3GetVT
14a0: 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 3b 0a  able(db, pTab);.
14b0: 20 20 20 20 69 66 28 20 70 56 54 61 62 2d 3e 70      if( pVTab->p
14c0: 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78  Vtab->pModule->x
14d0: 52 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  Rename==0 ){.   
14e0: 20 20 20 70 56 54 61 62 20 3d 20 30 3b 0a 20 20     pVTab = 0;.  
14f0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1500: 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 74 72 61    /* Begin a tra
1510: 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 64 61 74  nsaction for dat
1520: 61 62 61 73 65 20 69 44 62 2e 20 54 68 65 6e 20  abase iDb. Then 
1530: 6d 6f 64 69 66 79 20 74 68 65 20 73 63 68 65 6d  modify the schem
1540: 61 20 63 6f 6f 6b 69 65 0a 20 20 2a 2a 20 28 73  a cookie.  ** (s
1550: 69 6e 63 65 20 74 68 65 20 41 4c 54 45 52 20 54  ince the ALTER T
1560: 41 42 4c 45 20 6d 6f 64 69 66 69 65 73 20 74 68  ABLE modifies th
1570: 65 20 73 63 68 65 6d 61 29 2e 20 43 61 6c 6c 20  e schema). Call 
1580: 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
1590: 29 2c 0a 20 20 2a 2a 20 61 73 20 74 68 65 20 73  ),.  ** as the s
15a0: 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73 20  calar functions 
15b0: 28 65 2e 67 2e 20 73 71 6c 69 74 65 5f 72 65 6e  (e.g. sqlite_ren
15c0: 61 6d 65 5f 74 61 62 6c 65 28 29 29 20 69 6e 76  ame_table()) inv
15d0: 6f 6b 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a  oked by the .  *
15e0: 2a 20 6e 65 73 74 65 64 20 53 51 4c 20 6d 61 79  * nested SQL may
15f0: 20 72 61 69 73 65 20 61 6e 20 65 78 63 65 70 74   raise an except
1600: 69 6f 6e 2e 20 20 2a 2f 0a 20 20 76 20 3d 20 73  ion.  */.  v = s
1610: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1620: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
1630: 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  0 ){.    goto ex
1640: 69 74 5f 72 65 6e 61 6d 65 5f 74 61 62 6c 65 3b  it_rename_table;
1650: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4d 61  .  }.  sqlite3Ma
1660: 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
1670: 0a 20 20 2f 2a 20 66 69 67 75 72 65 20 6f 75 74  .  /* figure out
1680: 20 68 6f 77 20 6d 61 6e 79 20 55 54 46 2d 38 20   how many UTF-8 
1690: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20 69  characters are i
16a0: 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 7a 54 61  n zName */.  zTa
16b0: 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
16c0: 61 6d 65 3b 0a 20 20 6e 54 61 62 4e 61 6d 65 20  ame;.  nTabName 
16d0: 3d 20 73 71 6c 69 74 65 33 55 74 66 38 43 68 61  = sqlite3Utf8Cha
16e0: 72 4c 65 6e 28 7a 54 61 62 4e 61 6d 65 2c 20 2d  rLen(zTabName, -
16f0: 31 29 3b 0a 0a 20 20 2f 2a 20 52 65 77 72 69 74  1);..  /* Rewrit
1700: 65 20 61 6c 6c 20 43 52 45 41 54 45 20 54 41 42  e all CREATE TAB
1710: 4c 45 2c 20 49 4e 44 45 58 2c 20 54 52 49 47 47  LE, INDEX, TRIGG
1720: 45 52 20 6f 72 20 56 49 45 57 20 73 74 61 74 65  ER or VIEW state
1730: 6d 65 6e 74 73 20 69 6e 0a 20 20 2a 2a 20 74 68  ments in.  ** th
1740: 65 20 73 63 68 65 6d 61 20 74 6f 20 75 73 65 20  e schema to use 
1750: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
1760: 6d 65 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  me.  */.  sqlite
1770: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
1780: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 55 50 44  rse, .      "UPD
1790: 41 54 45 20 5c 22 25 77 5c 22 2e 25 73 20 53 45  ATE \"%w\".%s SE
17a0: 54 20 22 0a 20 20 20 20 20 20 22 73 71 6c 20 3d  T ".      "sql =
17b0: 20 73 71 6c 69 74 65 5f 72 65 6e 61 6d 65 5f 74   sqlite_rename_t
17c0: 61 62 6c 65 28 25 51 2c 20 74 79 70 65 2c 20 6e  able(%Q, type, n
17d0: 61 6d 65 2c 20 73 71 6c 2c 20 25 51 2c 20 25 51  ame, sql, %Q, %Q
17e0: 2c 20 25 64 29 20 22 0a 20 20 20 20 20 20 22 57  , %d) ".      "W
17f0: 48 45 52 45 20 28 74 79 70 65 21 3d 27 69 6e 64  HERE (type!='ind
1800: 65 78 27 20 4f 52 20 74 62 6c 5f 6e 61 6d 65 3d  ex' OR tbl_name=
1810: 25 51 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  %Q COLLATE nocas
1820: 65 29 22 0a 20 20 20 20 20 20 22 41 4e 44 20 20  e)".      "AND  
1830: 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27   name NOT LIKE '
1840: 73 71 6c 69 74 65 58 5f 25 25 27 20 45 53 43 41  sqliteX_%%' ESCA
1850: 50 45 20 27 58 27 22 0a 20 20 20 20 20 20 2c 20  PE 'X'".      , 
1860: 7a 44 62 2c 20 4d 41 53 54 45 52 5f 4e 41 4d 45  zDb, MASTER_NAME
1870: 2c 20 7a 44 62 2c 20 7a 54 61 62 4e 61 6d 65 2c  , zDb, zTabName,
1880: 20 7a 4e 61 6d 65 2c 20 28 69 44 62 3d 3d 31 29   zName, (iDb==1)
1890: 2c 20 7a 54 61 62 4e 61 6d 65 0a 20 20 29 3b 0a  , zTabName.  );.
18a0: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
18b0: 20 74 62 6c 5f 6e 61 6d 65 20 61 6e 64 20 6e 61   tbl_name and na
18c0: 6d 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  me columns of th
18d0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
18e0: 74 61 62 6c 65 0a 20 20 2a 2a 20 61 73 20 72 65  table.  ** as re
18f0: 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 73 71  quired.  */.  sq
1900: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
1910: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22  (pParse,.      "
1920: 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45 54  UPDATE %Q.%s SET
1930: 20 22 0a 20 20 20 20 20 20 20 20 20 20 22 74 62   ".          "tb
1940: 6c 5f 6e 61 6d 65 20 3d 20 25 51 2c 20 22 0a 20  l_name = %Q, ". 
1950: 20 20 20 20 20 20 20 20 20 22 6e 61 6d 65 20 3d           "name =
1960: 20 43 41 53 45 20 22 0a 20 20 20 20 20 20 20 20   CASE ".        
1970: 20 20 20 20 22 57 48 45 4e 20 74 79 70 65 3d 27      "WHEN type='
1980: 74 61 62 6c 65 27 20 54 48 45 4e 20 25 51 20 22  table' THEN %Q "
1990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 57 48  .            "WH
19a0: 45 4e 20 6e 61 6d 65 20 4c 49 4b 45 20 27 73 71  EN name LIKE 'sq
19b0: 6c 69 74 65 58 5f 61 75 74 6f 69 6e 64 65 78 25  liteX_autoindex%
19c0: 25 27 20 45 53 43 41 50 45 20 27 58 27 20 22 0a  %' ESCAPE 'X' ".
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20              "   
19e0: 20 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65    AND type='inde
19f0: 78 27 20 54 48 45 4e 20 22 0a 20 20 20 20 20 20  x' THEN ".      
1a00: 20 20 20 20 20 20 20 22 27 73 71 6c 69 74 65 5f         "'sqlite_
1a10: 61 75 74 6f 69 6e 64 65 78 5f 27 20 7c 7c 20 25  autoindex_' || %
1a20: 51 20 7c 7c 20 73 75 62 73 74 72 28 6e 61 6d 65  Q || substr(name
1a30: 2c 25 64 2b 31 38 29 20 22 0a 20 20 20 20 20 20  ,%d+18) ".      
1a40: 20 20 20 20 20 20 22 45 4c 53 45 20 6e 61 6d 65        "ELSE name
1a50: 20 45 4e 44 20 22 0a 20 20 20 20 20 20 22 57 48   END ".      "WH
1a60: 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20  ERE tbl_name=%Q 
1a70: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 20 41  COLLATE nocase A
1a80: 4e 44 20 22 0a 20 20 20 20 20 20 20 20 20 20 22  ND ".          "
1a90: 28 74 79 70 65 3d 27 74 61 62 6c 65 27 20 4f 52  (type='table' OR
1aa0: 20 74 79 70 65 3d 27 69 6e 64 65 78 27 20 4f 52   type='index' OR
1ab0: 20 74 79 70 65 3d 27 74 72 69 67 67 65 72 27 29   type='trigger')
1ac0: 3b 22 2c 20 0a 20 20 20 20 20 20 7a 44 62 2c 20  ;", .      zDb, 
1ad0: 4d 41 53 54 45 52 5f 4e 41 4d 45 2c 20 0a 20 20  MASTER_NAME, .  
1ae0: 20 20 20 20 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65      zName, zName
1af0: 2c 20 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  , zName, .      
1b00: 6e 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 4e 61  nTabName, zTabNa
1b10: 6d 65 0a 20 20 29 3b 0a 0a 23 69 66 6e 64 65 66  me.  );..#ifndef
1b20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1b30: 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 2f 2a 20  OINCREMENT.  /* 
1b40: 49 66 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  If the sqlite_se
1b50: 71 75 65 6e 63 65 20 74 61 62 6c 65 20 65 78 69  quence table exi
1b60: 73 74 73 20 69 6e 20 74 68 69 73 20 64 61 74 61  sts in this data
1b70: 62 61 73 65 2c 20 74 68 65 6e 20 75 70 64 61 74  base, then updat
1b80: 65 20 0a 20 20 2a 2a 20 69 74 20 77 69 74 68 20  e .  ** it with 
1b90: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
1ba0: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  me..  */.  if( s
1bb0: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
1bc0: 64 62 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75  db, "sqlite_sequ
1bd0: 65 6e 63 65 22 2c 20 7a 44 62 29 20 29 7b 0a 20  ence", zDb) ){. 
1be0: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
1bf0: 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
1c00: 20 20 20 20 20 20 22 55 50 44 41 54 45 20 5c 22        "UPDATE \"
1c10: 25 77 5c 22 2e 73 71 6c 69 74 65 5f 73 65 71 75  %w\".sqlite_sequ
1c20: 65 6e 63 65 20 73 65 74 20 6e 61 6d 65 20 3d 20  ence set name = 
1c30: 25 51 20 57 48 45 52 45 20 6e 61 6d 65 20 3d 20  %Q WHERE name = 
1c40: 25 51 22 2c 0a 20 20 20 20 20 20 20 20 7a 44 62  %Q",.        zDb
1c50: 2c 20 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  , zName, pTab->z
1c60: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Name);.  }.#endi
1c70: 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74  f..  /* If the t
1c80: 61 62 6c 65 20 62 65 69 6e 67 20 72 65 6e 61 6d  able being renam
1c90: 65 64 20 69 73 20 6e 6f 74 20 69 74 73 65 6c 66  ed is not itself
1ca0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 74 65 6d   part of the tem
1cb0: 70 20 64 61 74 61 62 61 73 65 2c 0a 20 20 2a 2a  p database,.  **
1cc0: 20 65 64 69 74 20 76 69 65 77 20 61 6e 64 20 74   edit view and t
1cd0: 72 69 67 67 65 72 20 64 65 66 69 6e 69 74 69 6f  rigger definitio
1ce0: 6e 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 65  ns within the te
1cf0: 6d 70 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a  mp database .  *
1d00: 2a 20 61 73 20 72 65 71 75 69 72 65 64 2e 20 20  * as required.  
1d10: 2a 2f 0a 20 20 69 66 28 20 69 44 62 21 3d 31 20  */.  if( iDb!=1 
1d20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  ){.    sqlite3Ne
1d30: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
1d40: 2c 20 0a 20 20 20 20 20 20 20 20 22 55 50 44 41  , .        "UPDA
1d50: 54 45 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  TE sqlite_temp_m
1d60: 61 73 74 65 72 20 53 45 54 20 22 0a 20 20 20 20  aster SET ".    
1d70: 20 20 20 20 20 20 20 20 22 73 71 6c 20 3d 20 73          "sql = s
1d80: 71 6c 69 74 65 5f 72 65 6e 61 6d 65 5f 74 61 62  qlite_rename_tab
1d90: 6c 65 28 25 51 2c 20 74 79 70 65 2c 20 6e 61 6d  le(%Q, type, nam
1da0: 65 2c 20 73 71 6c 2c 20 25 51 2c 20 25 51 2c 20  e, sql, %Q, %Q, 
1db0: 31 29 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  1), ".          
1dc0: 20 20 22 74 62 6c 5f 6e 61 6d 65 20 3d 20 22 0a    "tbl_name = ".
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 43                "C
1de0: 41 53 45 20 57 48 45 4e 20 74 62 6c 5f 6e 61 6d  ASE WHEN tbl_nam
1df0: 65 3d 25 51 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  e=%Q COLLATE noc
1e00: 61 73 65 20 41 4e 44 20 22 0a 20 20 20 20 20 20  ase AND ".      
1e10: 20 20 20 20 20 20 20 20 22 20 20 20 20 20 20 20          "       
1e20: 20 20 20 73 71 6c 69 74 65 5f 72 65 6e 61 6d 65     sqlite_rename
1e30: 5f 74 65 73 74 28 25 51 2c 20 73 71 6c 2c 20 74  _test(%Q, sql, t
1e40: 79 70 65 2c 20 6e 61 6d 65 2c 20 31 29 20 22 0a  ype, name, 1) ".
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 54                "T
1e60: 48 45 4e 20 25 51 20 45 4c 53 45 20 74 62 6c 5f  HEN %Q ELSE tbl_
1e70: 6e 61 6d 65 20 45 4e 44 20 22 0a 20 20 20 20 20  name END ".     
1e80: 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79         "WHERE ty
1e90: 70 65 20 49 4e 20 28 27 76 69 65 77 27 2c 20 27  pe IN ('view', '
1ea0: 74 72 69 67 67 65 72 27 29 22 0a 20 20 20 20 20  trigger')".     
1eb0: 20 20 20 2c 20 7a 44 62 2c 20 7a 54 61 62 4e 61     , zDb, zTabNa
1ec0: 6d 65 2c 20 7a 4e 61 6d 65 2c 20 7a 54 61 62 4e  me, zName, zTabN
1ed0: 61 6d 65 2c 20 7a 44 62 2c 20 7a 4e 61 6d 65 29  ame, zDb, zName)
1ee0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1ef0: 68 69 73 20 69 73 20 61 20 76 69 72 74 75 61 6c  his is a virtual
1f00: 20 74 61 62 6c 65 2c 20 69 6e 76 6f 6b 65 20 74   table, invoke t
1f10: 68 65 20 78 52 65 6e 61 6d 65 28 29 20 66 75 6e  he xRename() fun
1f20: 63 74 69 6f 6e 20 69 66 0a 20 20 2a 2a 20 6f 6e  ction if.  ** on
1f30: 65 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68  e is defined. Th
1f40: 65 20 78 52 65 6e 61 6d 65 28 29 20 63 61 6c 6c  e xRename() call
1f50: 62 61 63 6b 20 77 69 6c 6c 20 6d 6f 64 69 66 79  back will modify
1f60: 20 74 68 65 20 6e 61 6d 65 73 0a 20 20 2a 2a 20   the names.  ** 
1f70: 6f 66 20 61 6e 79 20 72 65 73 6f 75 72 63 65 73  of any resources
1f80: 20 75 73 65 64 20 62 79 20 74 68 65 20 76 2d 74   used by the v-t
1f90: 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  able implementat
1fa0: 69 6f 6e 20 28 69 6e 63 6c 75 64 69 6e 67 20 6f  ion (including o
1fb0: 74 68 65 72 0a 20 20 2a 2a 20 53 51 4c 69 74 65  ther.  ** SQLite
1fc0: 20 74 61 62 6c 65 73 29 20 74 68 61 74 20 61 72   tables) that ar
1fd0: 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  e identified by 
1fe0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1ff0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 20  virtual table.. 
2000: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
2010: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
2020: 41 42 4c 45 0a 20 20 69 66 28 20 70 56 54 61 62  ABLE.  if( pVTab
2030: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
2040: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
2050: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
2060: 6f 61 64 53 74 72 69 6e 67 28 76 2c 20 69 2c 20  oadString(v, i, 
2070: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
2080: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2090: 20 4f 50 5f 56 52 65 6e 61 6d 65 2c 20 69 2c 20   OP_VRename, i, 
20a0: 30 2c 20 30 2c 28 63 6f 6e 73 74 20 63 68 61 72  0, 0,(const char
20b0: 2a 29 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42  *)pVTab, P4_VTAB
20c0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
20d0: 20 72 65 6e 61 6d 65 52 65 6c 6f 61 64 53 63 68   renameReloadSch
20e0: 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29  ema(pParse, iDb)
20f0: 3b 0a 20 20 72 65 6e 61 6d 65 54 65 73 74 53 63  ;.  renameTestSc
2100: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 7a 44 62  hema(pParse, zDb
2110: 2c 20 69 44 62 3d 3d 31 29 3b 0a 0a 65 78 69 74  , iDb==1);..exit
2120: 5f 72 65 6e 61 6d 65 5f 74 61 62 6c 65 3a 0a 20  _rename_table:. 
2130: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
2140: 65 6c 65 74 65 28 64 62 2c 20 70 53 72 63 29 3b  elete(db, pSrc);
2150: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
2160: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 64  (db, zName);.  d
2170: 62 2d 3e 6d 44 62 46 6c 61 67 73 20 3d 20 73 61  b->mDbFlags = sa
2180: 76 65 64 44 62 46 6c 61 67 73 3b 0a 7d 0a 0a 2f  vedDbFlags;.}../
2190: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
21a0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  on is called aft
21b0: 65 72 20 61 6e 20 22 41 4c 54 45 52 20 54 41 42  er an "ALTER TAB
21c0: 4c 45 20 2e 2e 2e 20 41 44 44 22 20 73 74 61 74  LE ... ADD" stat
21d0: 65 6d 65 6e 74 0a 2a 2a 20 68 61 73 20 62 65 65  ement.** has bee
21e0: 6e 20 70 61 72 73 65 64 2e 20 41 72 67 75 6d 65  n parsed. Argume
21f0: 6e 74 20 70 43 6f 6c 44 65 66 20 63 6f 6e 74 61  nt pColDef conta
2200: 69 6e 73 20 74 68 65 20 74 65 78 74 20 6f 66 20  ins the text of 
2210: 74 68 65 20 6e 65 77 0a 2a 2a 20 63 6f 6c 75 6d  the new.** colum
2220: 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2a  n definition..**
2230: 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74  .** The Table st
2240: 72 75 63 74 75 72 65 20 70 50 61 72 73 65 2d 3e  ructure pParse->
2250: 70 4e 65 77 54 61 62 6c 65 20 77 61 73 20 65 78  pNewTable was ex
2260: 74 65 6e 64 65 64 20 74 6f 20 69 6e 63 6c 75 64  tended to includ
2270: 65 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 6f 6c  e.** the new col
2280: 75 6d 6e 20 64 75 72 69 6e 67 20 70 61 72 73 69  umn during parsi
2290: 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ng..*/.void sqli
22a0: 74 65 33 41 6c 74 65 72 46 69 6e 69 73 68 41 64  te3AlterFinishAd
22b0: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
22c0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 43  Parse, Token *pC
22d0: 6f 6c 44 65 66 29 7b 0a 20 20 54 61 62 6c 65 20  olDef){.  Table 
22e0: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
22f0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70      /* Copy of p
2300: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
2310: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
2320: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2330: 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e 67 20 61  /* Table being a
2340: 6c 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ltered */.  int 
2350: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
2360: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
2370: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 6f  e number */.  co
2380: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  nst char *zDb;  
2390: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
23a0: 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f  ase name */.  co
23b0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 3b 20  nst char *zTab; 
23c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
23d0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20   name */.  char 
23e0: 2a 7a 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20  *zCol;          
23f0: 20 20 20 20 20 2f 2a 20 4e 75 6c 6c 2d 74 65 72       /* Null-ter
2400: 6d 69 6e 61 74 65 64 20 63 6f 6c 75 6d 6e 20 64  minated column d
2410: 65 66 69 6e 69 74 69 6f 6e 20 2a 2f 0a 20 20 43  efinition */.  C
2420: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 20 20 20 20  olumn *pCol;    
2430: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2440: 6e 65 77 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  new column */.  
2450: 45 78 70 72 20 2a 70 44 66 6c 74 3b 20 20 20 20  Expr *pDflt;    
2460: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66            /* Def
2470: 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
2480: 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 2a 2f  he new column */
2490: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24b0: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
24c0: 6e 65 63 74 69 6f 6e 3b 20 2a 2f 0a 20 20 56 64  nection; */.  Vd
24d0: 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20  be *v;          
24e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
24f0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
2500: 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
2510: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 31  tion */.  int r1
2520: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2530: 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
2540: 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 0a 20   registers */.. 
2550: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
2560: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
2570: 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
2580: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
2590: 6e 3b 0a 20 20 70 4e 65 77 20 3d 20 70 50 61 72  n;.  pNew = pPar
25a0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
25b0: 20 61 73 73 65 72 74 28 20 70 4e 65 77 20 29 3b   assert( pNew );
25c0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
25d0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c  te3BtreeHoldsAll
25e0: 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a 20  Mutexes(db) );. 
25f0: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
2600: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
2610: 70 4e 65 77 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pNew->pSchema);.
2620: 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b    zDb = db->aDb[
2630: 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20  iDb].zDbSName;. 
2640: 20 7a 54 61 62 20 3d 20 26 70 4e 65 77 2d 3e 7a   zTab = &pNew->z
2650: 4e 61 6d 65 5b 31 36 5d 3b 20 20 2f 2a 20 53 6b  Name[16];  /* Sk
2660: 69 70 20 74 68 65 20 22 73 71 6c 69 74 65 5f 61  ip the "sqlite_a
2670: 6c 74 65 72 74 61 62 5f 22 20 70 72 65 66 69 78  ltertab_" prefix
2680: 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a   on the name */.
2690: 20 20 70 43 6f 6c 20 3d 20 26 70 4e 65 77 2d 3e    pCol = &pNew->
26a0: 61 43 6f 6c 5b 70 4e 65 77 2d 3e 6e 43 6f 6c 2d  aCol[pNew->nCol-
26b0: 31 5d 3b 0a 20 20 70 44 66 6c 74 20 3d 20 70 43  1];.  pDflt = pC
26c0: 6f 6c 2d 3e 70 44 66 6c 74 3b 0a 20 20 70 54 61  ol->pDflt;.  pTa
26d0: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
26e0: 61 62 6c 65 28 64 62 2c 20 7a 54 61 62 2c 20 7a  able(db, zTab, z
26f0: 44 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Db);.  assert( p
2700: 54 61 62 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  Tab );..#ifndef 
2710: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
2720: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49  ORIZATION.  /* I
2730: 6e 76 6f 6b 65 20 74 68 65 20 61 75 74 68 6f 72  nvoke the author
2740: 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  ization callback
2750: 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  . */.  if( sqlit
2760: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
2770: 73 65 2c 20 53 51 4c 49 54 45 5f 41 4c 54 45 52  se, SQLITE_ALTER
2780: 5f 54 41 42 4c 45 2c 20 7a 44 62 2c 20 70 54 61  _TABLE, zDb, pTa
2790: 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a  b->zName, 0) ){.
27a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
27b0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
27c0: 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  the default valu
27d0: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 63 6f  e for the new co
27e0: 6c 75 6d 6e 20 77 61 73 20 73 70 65 63 69 66 69  lumn was specifi
27f0: 65 64 20 77 69 74 68 20 61 20 0a 20 20 2a 2a 20  ed with a .  ** 
2800: 6c 69 74 65 72 61 6c 20 4e 55 4c 4c 2c 20 74 68  literal NULL, th
2810: 65 6e 20 73 65 74 20 70 44 66 6c 74 20 74 6f 20  en set pDflt to 
2820: 30 2e 20 54 68 69 73 20 73 69 6d 70 6c 69 66 69  0. This simplifi
2830: 65 73 20 63 68 65 63 6b 69 6e 67 0a 20 20 2a 2a  es checking.  **
2840: 20 66 6f 72 20 61 6e 20 53 51 4c 20 4e 55 4c 4c   for an SQL NULL
2850: 20 64 65 66 61 75 6c 74 20 62 65 6c 6f 77 2e 0a   default below..
2860: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
2870: 44 66 6c 74 3d 3d 30 20 7c 7c 20 70 44 66 6c 74  Dflt==0 || pDflt
2880: 2d 3e 6f 70 3d 3d 54 4b 5f 53 50 41 4e 20 29 3b  ->op==TK_SPAN );
2890: 0a 20 20 69 66 28 20 70 44 66 6c 74 20 26 26 20  .  if( pDflt && 
28a0: 70 44 66 6c 74 2d 3e 70 4c 65 66 74 2d 3e 6f 70  pDflt->pLeft->op
28b0: 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  ==TK_NULL ){.   
28c0: 20 70 44 66 6c 74 20 3d 20 30 3b 0a 20 20 7d 0a   pDflt = 0;.  }.
28d0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
28e0: 20 74 68 65 20 6e 65 77 20 63 6f 6c 75 6d 6e 20   the new column 
28f0: 69 73 20 6e 6f 74 20 73 70 65 63 69 66 69 65 64  is not specified
2900: 20 61 73 20 50 52 49 4d 41 52 59 20 4b 45 59 20   as PRIMARY KEY 
2910: 6f 72 20 55 4e 49 51 55 45 2e 0a 20 20 2a 2a 20  or UNIQUE..  ** 
2920: 49 66 20 74 68 65 72 65 20 69 73 20 61 20 4e 4f  If there is a NO
2930: 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
2940: 74 2c 20 74 68 65 6e 20 74 68 65 20 64 65 66 61  t, then the defa
2950: 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ult value for th
2960: 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6d 75  e.  ** column mu
2970: 73 74 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a  st not be NULL..
2980: 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 6f 6c 2d    */.  if( pCol-
2990: 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46  >colFlags & COLF
29a0: 4c 41 47 5f 50 52 49 4d 4b 45 59 20 29 7b 0a 20  LAG_PRIMKEY ){. 
29b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
29c0: 73 67 28 70 50 61 72 73 65 2c 20 22 43 61 6e 6e  sg(pParse, "Cann
29d0: 6f 74 20 61 64 64 20 61 20 50 52 49 4d 41 52 59  ot add a PRIMARY
29e0: 20 4b 45 59 20 63 6f 6c 75 6d 6e 22 29 3b 0a 20   KEY column");. 
29f0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2a00: 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 64 65   if( pNew->pInde
2a10: 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
2a20: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2a30: 20 22 43 61 6e 6e 6f 74 20 61 64 64 20 61 20 55   "Cannot add a U
2a40: 4e 49 51 55 45 20 63 6f 6c 75 6d 6e 22 29 3b 0a  NIQUE column");.
2a50: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2a60: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
2a70: 26 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b  &SQLITE_ForeignK
2a80: 65 79 73 29 20 26 26 20 70 4e 65 77 2d 3e 70 46  eys) && pNew->pF
2a90: 4b 65 79 20 26 26 20 70 44 66 6c 74 20 29 7b 0a  Key && pDflt ){.
2aa0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
2ab0: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
2ac0: 20 20 20 20 20 22 43 61 6e 6e 6f 74 20 61 64 64       "Cannot add
2ad0: 20 61 20 52 45 46 45 52 45 4e 43 45 53 20 63 6f   a REFERENCES co
2ae0: 6c 75 6d 6e 20 77 69 74 68 20 6e 6f 6e 2d 4e 55  lumn with non-NU
2af0: 4c 4c 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  LL default value
2b00: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
2b10: 20 20 7d 0a 20 20 69 66 28 20 70 43 6f 6c 2d 3e    }.  if( pCol->
2b20: 6e 6f 74 4e 75 6c 6c 20 26 26 20 21 70 44 66 6c  notNull && !pDfl
2b30: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2b40: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2b50: 20 0a 20 20 20 20 20 20 20 20 22 43 61 6e 6e 6f   .        "Canno
2b60: 74 20 61 64 64 20 61 20 4e 4f 54 20 4e 55 4c 4c  t add a NOT NULL
2b70: 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 64 65 66   column with def
2b80: 61 75 6c 74 20 76 61 6c 75 65 20 4e 55 4c 4c 22  ault value NULL"
2b90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
2ba0: 20 7d 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20   }..  /* Ensure 
2bb0: 74 68 65 20 64 65 66 61 75 6c 74 20 65 78 70 72  the default expr
2bc0: 65 73 73 69 6f 6e 20 69 73 20 73 6f 6d 65 74 68  ession is someth
2bd0: 69 6e 67 20 74 68 61 74 20 73 71 6c 69 74 65 33  ing that sqlite3
2be0: 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 29 0a  ValueFromExpr().
2bf0: 20 20 2a 2a 20 63 61 6e 20 68 61 6e 64 6c 65 20    ** can handle 
2c00: 28 69 2e 65 2e 20 6e 6f 74 20 43 55 52 52 45 4e  (i.e. not CURREN
2c10: 54 5f 54 49 4d 45 20 65 74 63 2e 29 0a 20 20 2a  T_TIME etc.).  *
2c20: 2f 0a 20 20 69 66 28 20 70 44 66 6c 74 20 29 7b  /.  if( pDflt ){
2c30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
2c40: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20  ue *pVal = 0;.  
2c50: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63    int rc;.    rc
2c60: 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46   = sqlite3ValueF
2c70: 72 6f 6d 45 78 70 72 28 64 62 2c 20 70 44 66 6c  romExpr(db, pDfl
2c80: 74 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  t, SQLITE_UTF8, 
2c90: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 2c  SQLITE_AFF_BLOB,
2ca0: 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 61 73 73   &pVal);.    ass
2cb0: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
2cc0: 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  OK || rc==SQLITE
2cd0: 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66  _NOMEM );.    if
2ce0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2cf0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2d00: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2d10: 64 20 3d 3d 20 31 20 29 3b 0a 20 20 20 20 20 20  d == 1 );.      
2d20: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
2d30: 20 20 69 66 28 20 21 70 56 61 6c 20 29 7b 0a 20    if( !pVal ){. 
2d40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
2d50: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 43 61  rMsg(pParse, "Ca
2d60: 6e 6e 6f 74 20 61 64 64 20 61 20 63 6f 6c 75 6d  nnot add a colum
2d70: 6e 20 77 69 74 68 20 6e 6f 6e 2d 63 6f 6e 73 74  n with non-const
2d80: 61 6e 74 20 64 65 66 61 75 6c 74 22 29 3b 0a 20  ant default");. 
2d90: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
2da0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61   }.    sqlite3Va
2db0: 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20  lueFree(pVal);. 
2dc0: 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 64 69 66 79 20   }..  /* Modify 
2dd0: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
2de0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 2a 2f 0a 20   statement. */. 
2df0: 20 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 44   zCol = sqlite3D
2e00: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68  bStrNDup(db, (ch
2e10: 61 72 2a 29 70 43 6f 6c 44 65 66 2d 3e 7a 2c 20  ar*)pColDef->z, 
2e20: 70 43 6f 6c 44 65 66 2d 3e 6e 29 3b 0a 20 20 69  pColDef->n);.  i
2e30: 66 28 20 7a 43 6f 6c 20 29 7b 0a 20 20 20 20 63  f( zCol ){.    c
2e40: 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26 7a 43 6f  har *zEnd = &zCo
2e50: 6c 5b 70 43 6f 6c 44 65 66 2d 3e 6e 2d 31 5d 3b  l[pColDef->n-1];
2e60: 0a 20 20 20 20 75 33 32 20 73 61 76 65 64 44 62  .    u32 savedDb
2e70: 46 6c 61 67 73 20 3d 20 64 62 2d 3e 6d 44 62 46  Flags = db->mDbF
2e80: 6c 61 67 73 3b 0a 20 20 20 20 77 68 69 6c 65 28  lags;.    while(
2e90: 20 7a 45 6e 64 3e 7a 43 6f 6c 20 26 26 20 28 2a   zEnd>zCol && (*
2ea0: 7a 45 6e 64 3d 3d 27 3b 27 20 7c 7c 20 73 71 6c  zEnd==';' || sql
2eb0: 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 45 6e  ite3Isspace(*zEn
2ec0: 64 29 29 20 29 7b 0a 20 20 20 20 20 20 2a 7a 45  d)) ){.      *zE
2ed0: 6e 64 2d 2d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  nd-- = '\0';.   
2ee0: 20 7d 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c   }.    db->mDbFl
2ef0: 61 67 73 20 7c 3d 20 44 42 46 4c 41 47 5f 50 72  ags |= DBFLAG_Pr
2f00: 65 66 65 72 42 75 69 6c 74 69 6e 3b 0a 20 20 20  eferBuiltin;.   
2f10: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
2f20: 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
2f30: 20 20 20 20 20 22 55 50 44 41 54 45 20 5c 22 25       "UPDATE \"%
2f40: 77 5c 22 2e 25 73 20 53 45 54 20 22 0a 20 20 20  w\".%s SET ".   
2f50: 20 20 20 20 20 20 20 22 73 71 6c 20 3d 20 73 75         "sql = su
2f60: 62 73 74 72 28 73 71 6c 2c 31 2c 25 64 29 20 7c  bstr(sql,1,%d) |
2f70: 7c 20 27 2c 20 27 20 7c 7c 20 25 51 20 7c 7c 20  | ', ' || %Q || 
2f80: 73 75 62 73 74 72 28 73 71 6c 2c 25 64 29 20 22  substr(sql,%d) "
2f90: 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
2fa0: 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27 20 41  type = 'table' A
2fb0: 4e 44 20 6e 61 6d 65 20 3d 20 25 51 22 2c 20 0a  ND name = %Q", .
2fc0: 20 20 20 20 20 20 7a 44 62 2c 20 4d 41 53 54 45        zDb, MASTE
2fd0: 52 5f 4e 41 4d 45 2c 20 70 4e 65 77 2d 3e 61 64  R_NAME, pNew->ad
2fe0: 64 43 6f 6c 4f 66 66 73 65 74 2c 20 7a 43 6f 6c  dColOffset, zCol
2ff0: 2c 20 70 4e 65 77 2d 3e 61 64 64 43 6f 6c 4f 66  , pNew->addColOf
3000: 66 73 65 74 2b 31 2c 0a 20 20 20 20 20 20 7a 54  fset+1,.      zT
3010: 61 62 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  ab.    );.    sq
3020: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3030: 7a 43 6f 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 6d  zCol);.    db->m
3040: 44 62 46 6c 61 67 73 20 3d 20 73 61 76 65 64 44  DbFlags = savedD
3050: 62 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 2f  bFlags;.  }..  /
3060: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
3070: 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 20 69  schema version i
3080: 73 20 61 74 20 6c 65 61 73 74 20 33 2e 20 20 42  s at least 3.  B
3090: 75 74 20 64 6f 20 6e 6f 74 20 75 70 67 72 61 64  ut do not upgrad
30a0: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 6c 65 73 73  e.  ** from less
30b0: 20 74 68 61 6e 20 33 20 74 6f 20 34 2c 20 61 73   than 3 to 4, as
30c0: 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 72 72 75   that will corru
30d0: 70 74 20 61 6e 79 20 70 72 65 65 78 69 73 74 69  pt any preexisti
30e0: 6e 67 20 44 45 53 43 0a 20 20 2a 2a 20 69 6e 64  ng DESC.  ** ind
30f0: 65 78 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  ex..  */.  v = s
3100: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
3110: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
3120: 7b 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74  {.    r1 = sqlit
3130: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
3140: 72 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rse);.    sqlite
3150: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
3160: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44  P_ReadCookie, iD
3170: 62 2c 20 72 31 2c 20 42 54 52 45 45 5f 46 49 4c  b, r1, BTREE_FIL
3180: 45 5f 46 4f 52 4d 41 54 29 3b 0a 20 20 20 20 73  E_FORMAT);.    s
3190: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
31a0: 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20  ree(v, iDb);.   
31b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
31c0: 70 32 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  p2(v, OP_AddImm,
31d0: 20 72 31 2c 20 2d 32 29 3b 0a 20 20 20 20 73 71   r1, -2);.    sq
31e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
31f0: 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 72 31 2c  v, OP_IfPos, r1,
3200: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
3210: 65 6e 74 41 64 64 72 28 76 29 2b 32 29 3b 0a 20  entAddr(v)+2);. 
3220: 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 28     VdbeCoverage(
3230: 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
3240: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
3250: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
3260: 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41  BTREE_FILE_FORMA
3270: 54 2c 20 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  T, 3);.    sqlit
3280: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
3290: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
32a0: 7d 0a 0a 20 20 2f 2a 20 52 65 6c 6f 61 64 20 74  }..  /* Reload t
32b0: 68 65 20 74 61 62 6c 65 20 64 65 66 69 6e 69 74  he table definit
32c0: 69 6f 6e 20 2a 2f 0a 20 20 72 65 6e 61 6d 65 52  ion */.  renameR
32d0: 65 6c 6f 61 64 53 63 68 65 6d 61 28 70 50 61 72  eloadSchema(pPar
32e0: 73 65 2c 20 69 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  se, iDb);.}../*.
32f0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3300: 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
3310: 65 20 70 61 72 73 65 72 20 61 66 74 65 72 20 74  e parser after t
3320: 68 65 20 74 61 62 6c 65 2d 6e 61 6d 65 20 69 6e  he table-name in
3330: 0a 2a 2a 20 61 6e 20 22 41 4c 54 45 52 20 54 41  .** an "ALTER TA
3340: 42 4c 45 20 3c 74 61 62 6c 65 2d 6e 61 6d 65 3e  BLE <table-name>
3350: 20 41 44 44 22 20 73 74 61 74 65 6d 65 6e 74 20   ADD" statement 
3360: 69 73 20 70 61 72 73 65 64 2e 20 41 72 67 75 6d  is parsed. Argum
3370: 65 6e 74 20 0a 2a 2a 20 70 53 72 63 20 69 73 20  ent .** pSrc is 
3380: 74 68 65 20 66 75 6c 6c 2d 6e 61 6d 65 20 6f 66  the full-name of
3390: 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
33a0: 20 61 6c 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   altered..**.** 
33b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
33c0: 65 73 20 61 20 28 70 61 72 74 69 61 6c 29 20 63  es a (partial) c
33d0: 6f 70 79 20 6f 66 20 74 68 65 20 54 61 62 6c 65  opy of the Table
33e0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 66 6f   structure.** fo
33f0: 72 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  r the table bein
3400: 67 20 61 6c 74 65 72 65 64 20 61 6e 64 20 73 65  g altered and se
3410: 74 73 20 50 61 72 73 65 2e 70 4e 65 77 54 61 62  ts Parse.pNewTab
3420: 6c 65 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74  le to point.** t
3430: 6f 20 69 74 2e 20 52 6f 75 74 69 6e 65 73 20 63  o it. Routines c
3440: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
3450: 73 65 72 20 61 73 20 74 68 65 20 63 6f 6c 75 6d  ser as the colum
3460: 6e 20 64 65 66 69 6e 69 74 69 6f 6e 0a 2a 2a 20  n definition.** 
3470: 69 73 20 70 61 72 73 65 64 20 28 69 2e 65 2e 20  is parsed (i.e. 
3480: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
3490: 28 29 29 20 61 64 64 20 74 68 65 20 6e 65 77 20  ()) add the new 
34a0: 43 6f 6c 75 6d 6e 20 64 61 74 61 20 74 6f 20 0a  Column data to .
34b0: 2a 2a 20 74 68 65 20 63 6f 70 79 2e 20 54 68 65  ** the copy. The
34c0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 54 61 62   copy of the Tab
34d0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  le structure is 
34e0: 64 65 6c 65 74 65 64 20 62 79 20 74 6f 6b 65 6e  deleted by token
34f0: 69 7a 65 2e 63 20 0a 2a 2a 20 61 66 74 65 72 20  ize.c .** after 
3500: 70 61 72 73 69 6e 67 20 69 73 20 66 69 6e 69 73  parsing is finis
3510: 68 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 6f 75 74 69  hed..**.** Routi
3520: 6e 65 20 73 71 6c 69 74 65 33 41 6c 74 65 72 46  ne sqlite3AlterF
3530: 69 6e 69 73 68 41 64 64 43 6f 6c 75 6d 6e 28 29  inishAddColumn()
3540: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
3550: 74 6f 20 63 6f 6d 70 6c 65 74 65 0a 2a 2a 20 63  to complete.** c
3560: 6f 64 69 6e 67 20 74 68 65 20 22 41 4c 54 45 52  oding the "ALTER
3570: 20 54 41 42 4c 45 20 2e 2e 2e 20 41 44 44 22 20   TABLE ... ADD" 
3580: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
3590: 69 64 20 73 71 6c 69 74 65 33 41 6c 74 65 72 42  id sqlite3AlterB
35a0: 65 67 69 6e 41 64 64 43 6f 6c 75 6d 6e 28 50 61  eginAddColumn(Pa
35b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
35c0: 4c 69 73 74 20 2a 70 53 72 63 29 7b 0a 20 20 54  List *pSrc){.  T
35d0: 61 62 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 54 61  able *pNew;.  Ta
35e0: 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 69 6e 74  ble *pTab;.  int
35f0: 20 69 44 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   iDb;.  int i;. 
3600: 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 20 20 73   int nAlloc;.  s
3610: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
3620: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 4c  rse->db;..  /* L
3630: 6f 6f 6b 20 75 70 20 74 68 65 20 74 61 62 6c 65  ook up the table
3640: 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2e 20   being altered. 
3650: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
3660: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d  rse->pNewTable==
3670: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
3680: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
3690: 41 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29  AllMutexes(db) )
36a0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
36b0: 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
36c0: 65 78 69 74 5f 62 65 67 69 6e 5f 61 64 64 5f 63  exit_begin_add_c
36d0: 6f 6c 75 6d 6e 3b 0a 20 20 70 54 61 62 20 3d 20  olumn;.  pTab = 
36e0: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
36f0: 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
3700: 2c 20 26 70 53 72 63 2d 3e 61 5b 30 5d 29 3b 0a  , &pSrc->a[0]);.
3710: 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f    if( !pTab ) go
3720: 74 6f 20 65 78 69 74 5f 62 65 67 69 6e 5f 61 64  to exit_begin_ad
3730: 64 5f 63 6f 6c 75 6d 6e 3b 0a 0a 23 69 66 6e 64  d_column;..#ifnd
3740: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
3750: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
3760: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
3770: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
3780: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3790: 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73   "virtual tables
37a0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 74 65   may not be alte
37b0: 72 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  red");.    goto 
37c0: 65 78 69 74 5f 62 65 67 69 6e 5f 61 64 64 5f 63  exit_begin_add_c
37d0: 6f 6c 75 6d 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  olumn;.  }.#endi
37e0: 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
37f0: 65 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 6e  e this is not an
3800: 20 61 74 74 65 6d 70 74 20 74 6f 20 41 4c 54 45   attempt to ALTE
3810: 52 20 61 20 76 69 65 77 2e 20 2a 2f 0a 20 20 69  R a view. */.  i
3820: 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  f( pTab->pSelect
3830: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
3840: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3850: 22 43 61 6e 6e 6f 74 20 61 64 64 20 61 20 63 6f  "Cannot add a co
3860: 6c 75 6d 6e 20 74 6f 20 61 20 76 69 65 77 22 29  lumn to a view")
3870: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
3880: 62 65 67 69 6e 5f 61 64 64 5f 63 6f 6c 75 6d 6e  begin_add_column
3890: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 53 51 4c 49  ;.  }.  if( SQLI
38a0: 54 45 5f 4f 4b 21 3d 69 73 41 6c 74 65 72 61 62  TE_OK!=isAlterab
38b0: 6c 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  leTable(pParse, 
38c0: 70 54 61 62 29 20 29 7b 0a 20 20 20 20 67 6f 74  pTab) ){.    got
38d0: 6f 20 65 78 69 74 5f 62 65 67 69 6e 5f 61 64 64  o exit_begin_add
38e0: 5f 63 6f 6c 75 6d 6e 3b 0a 20 20 7d 0a 0a 20 20  _column;.  }..  
38f0: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 61 64  assert( pTab->ad
3900: 64 43 6f 6c 4f 66 66 73 65 74 3e 30 20 29 3b 0a  dColOffset>0 );.
3910: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
3920: 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
3930: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
3940: 0a 0a 20 20 2f 2a 20 50 75 74 20 61 20 63 6f 70  ..  /* Put a cop
3950: 79 20 6f 66 20 74 68 65 20 54 61 62 6c 65 20 73  y of the Table s
3960: 74 72 75 63 74 20 69 6e 20 50 61 72 73 65 2e 70  truct in Parse.p
3970: 4e 65 77 54 61 62 6c 65 20 66 6f 72 20 74 68 65  NewTable for the
3980: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 64 64  .  ** sqlite3Add
3990: 43 6f 6c 75 6d 6e 28 29 20 66 75 6e 63 74 69 6f  Column() functio
39a0: 6e 20 61 6e 64 20 66 72 69 65 6e 64 73 20 74 6f  n and friends to
39b0: 20 6d 6f 64 69 66 79 2e 20 20 42 75 74 20 6d 6f   modify.  But mo
39c0: 64 69 66 79 0a 20 20 2a 2a 20 74 68 65 20 6e 61  dify.  ** the na
39d0: 6d 65 20 62 79 20 61 64 64 69 6e 67 20 61 6e 20  me by adding an 
39e0: 22 73 71 6c 69 74 65 5f 61 6c 74 65 72 74 61 62  "sqlite_altertab
39f0: 5f 22 20 70 72 65 66 69 78 2e 20 20 42 79 20 61  _" prefix.  By a
3a00: 64 64 69 6e 67 20 74 68 69 73 0a 20 20 2a 2a 20  dding this.  ** 
3a10: 70 72 65 66 69 78 2c 20 77 65 20 69 6e 73 75 72  prefix, we insur
3a20: 65 20 74 68 61 74 20 74 68 65 20 6e 61 6d 65 20  e that the name 
3a30: 77 69 6c 6c 20 6e 6f 74 20 63 6f 6c 6c 69 64 65  will not collide
3a40: 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e   with an existin
3a50: 67 0a 20 20 2a 2a 20 74 61 62 6c 65 20 62 65 63  g.  ** table bec
3a60: 61 75 73 65 20 75 73 65 72 20 74 61 62 6c 65 20  ause user table 
3a70: 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  are not allowed 
3a80: 74 6f 20 68 61 76 65 20 74 68 65 20 22 73 71 6c  to have the "sql
3a90: 69 74 65 5f 22 0a 20 20 2a 2a 20 70 72 65 66 69  ite_".  ** prefi
3aa0: 78 20 6f 6e 20 74 68 65 69 72 20 6e 61 6d 65 2e  x on their name.
3ab0: 0a 20 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 28  .  */.  pNew = (
3ac0: 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 33 44 62  Table*)sqlite3Db
3ad0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
3ae0: 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20  izeof(Table));. 
3af0: 20 69 66 28 20 21 70 4e 65 77 20 29 20 67 6f 74   if( !pNew ) got
3b00: 6f 20 65 78 69 74 5f 62 65 67 69 6e 5f 61 64 64  o exit_begin_add
3b10: 5f 63 6f 6c 75 6d 6e 3b 0a 20 20 70 50 61 72 73  _column;.  pPars
3b20: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 70  e->pNewTable = p
3b30: 4e 65 77 3b 0a 20 20 70 4e 65 77 2d 3e 6e 54 61  New;.  pNew->nTa
3b40: 62 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77  bRef = 1;.  pNew
3b50: 2d 3e 6e 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e  ->nCol = pTab->n
3b60: 43 6f 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Col;.  assert( p
3b70: 4e 65 77 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20  New->nCol>0 );. 
3b80: 20 6e 41 6c 6c 6f 63 20 3d 20 28 28 28 70 4e 65   nAlloc = (((pNe
3b90: 77 2d 3e 6e 43 6f 6c 2d 31 29 2f 38 29 2a 38 29  w->nCol-1)/8)*8)
3ba0: 2b 38 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 41  +8;.  assert( nA
3bb0: 6c 6c 6f 63 3e 3d 70 4e 65 77 2d 3e 6e 43 6f 6c  lloc>=pNew->nCol
3bc0: 20 26 26 20 6e 41 6c 6c 6f 63 25 38 3d 3d 30 20   && nAlloc%8==0 
3bd0: 26 26 20 6e 41 6c 6c 6f 63 2d 70 4e 65 77 2d 3e  && nAlloc-pNew->
3be0: 6e 43 6f 6c 3c 38 20 29 3b 0a 20 20 70 4e 65 77  nCol<8 );.  pNew
3bf0: 2d 3e 61 43 6f 6c 20 3d 20 28 43 6f 6c 75 6d 6e  ->aCol = (Column
3c00: 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  *)sqlite3DbMallo
3c10: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
3c20: 28 43 6f 6c 75 6d 6e 29 2a 6e 41 6c 6c 6f 63 29  (Column)*nAlloc)
3c30: 3b 0a 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20  ;.  pNew->zName 
3c40: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
3c50: 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 6c 74  (db, "sqlite_alt
3c60: 65 72 74 61 62 5f 25 73 22 2c 20 70 54 61 62 2d  ertab_%s", pTab-
3c70: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21  >zName);.  if( !
3c80: 70 4e 65 77 2d 3e 61 43 6f 6c 20 7c 7c 20 21 70  pNew->aCol || !p
3c90: 4e 65 77 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20  New->zName ){.  
3ca0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
3cb0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
3cc0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 62 65 67 69    goto exit_begi
3cd0: 6e 5f 61 64 64 5f 63 6f 6c 75 6d 6e 3b 0a 20 20  n_add_column;.  
3ce0: 7d 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  }.  memcpy(pNew-
3cf0: 3e 61 43 6f 6c 2c 20 70 54 61 62 2d 3e 61 43 6f  >aCol, pTab->aCo
3d00: 6c 2c 20 73 69 7a 65 6f 66 28 43 6f 6c 75 6d 6e  l, sizeof(Column
3d10: 29 2a 70 4e 65 77 2d 3e 6e 43 6f 6c 29 3b 0a 20  )*pNew->nCol);. 
3d20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 65 77   for(i=0; i<pNew
3d30: 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
3d40: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
3d50: 20 26 70 4e 65 77 2d 3e 61 43 6f 6c 5b 69 5d 3b   &pNew->aCol[i];
3d60: 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  .    pCol->zName
3d70: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
3d80: 75 70 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  up(db, pCol->zNa
3d90: 6d 65 29 3b 0a 20 20 20 20 70 43 6f 6c 2d 3e 7a  me);.    pCol->z
3da0: 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 70 43  Coll = 0;.    pC
3db0: 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 30 3b 0a 20  ol->pDflt = 0;. 
3dc0: 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 53 63 68 65   }.  pNew->pSche
3dd0: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
3de0: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 4e 65  ].pSchema;.  pNe
3df0: 77 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20  w->addColOffset 
3e00: 3d 20 70 54 61 62 2d 3e 61 64 64 43 6f 6c 4f 66  = pTab->addColOf
3e10: 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 54  fset;.  pNew->nT
3e20: 61 62 52 65 66 20 3d 20 31 3b 0a 0a 65 78 69 74  abRef = 1;..exit
3e30: 5f 62 65 67 69 6e 5f 61 64 64 5f 63 6f 6c 75 6d  _begin_add_colum
3e40: 6e 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  n:.  sqlite3SrcL
3e50: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  istDelete(db, pS
3e60: 72 63 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  rc);.  return;.}
3e70: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
3e80: 72 20 70 54 61 62 20 69 73 20 74 68 65 20 73 75  r pTab is the su
3e90: 62 6a 65 63 74 20 6f 66 20 61 6e 20 41 4c 54 45  bject of an ALTE
3ea0: 52 20 54 41 42 4c 45 20 2e 2e 2e 20 52 45 4e 41  R TABLE ... RENA
3eb0: 4d 45 20 43 4f 4c 55 4d 4e 0a 2a 2a 20 63 6f 6d  ME COLUMN.** com
3ec0: 6d 61 6e 64 2e 20 54 68 69 73 20 66 75 6e 63 74  mand. This funct
3ed0: 69 6f 6e 20 63 68 65 63 6b 73 20 69 66 20 74 68  ion checks if th
3ee0: 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69 65  e table is a vie
3ef0: 77 20 6f 72 20 76 69 72 74 75 61 6c 0a 2a 2a 20  w or virtual.** 
3f00: 74 61 62 6c 65 20 28 63 6f 6c 75 6d 6e 73 20 6f  table (columns o
3f10: 66 20 76 69 65 77 73 20 6f 72 20 76 69 72 74 75  f views or virtu
3f20: 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f  al tables may no
3f30: 74 20 62 65 20 72 65 6e 61 6d 65 64 29 2e 20 49  t be renamed). I
3f40: 66 20 73 6f 2c 0a 2a 2a 20 69 74 20 6c 6f 61 64  f so,.** it load
3f50: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
3f60: 67 65 20 69 6e 74 6f 20 70 50 61 72 73 65 20 61  ge into pParse a
3f70: 6e 64 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  nd returns non-z
3f80: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ero..**.** Or, i
3f90: 66 20 70 54 61 62 20 69 73 20 6e 6f 74 20 61 20  f pTab is not a 
3fa0: 76 69 65 77 20 6f 72 20 76 69 72 74 75 61 6c 20  view or virtual 
3fb0: 74 61 62 6c 65 2c 20 7a 65 72 6f 20 69 73 20 72  table, zero is r
3fc0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 23 69 66 20  eturned..*/.#if 
3fd0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
3fe0: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
3ff0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
4000: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
4010: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 52 65  .static int isRe
4020: 61 6c 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  alTable(Parse *p
4030: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
4040: 61 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ab){.  const cha
4050: 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a 23 69  r *zType = 0;.#i
4060: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4070: 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54 61  T_VIEW.  if( pTa
4080: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
4090: 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22    zType = "view"
40a0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
40b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
40c0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
40d0: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
40e0: 61 62 29 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  ab) ){.    zType
40f0: 20 3d 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c   = "virtual tabl
4100: 65 22 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  e";.  }.#endif. 
4110: 20 69 66 28 20 7a 54 79 70 65 20 29 7b 0a 20 20   if( zType ){.  
4120: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4130: 67 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  g(.        pPars
4140: 65 2c 20 22 63 61 6e 6e 6f 74 20 72 65 6e 61 6d  e, "cannot renam
4150: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 25 73 20  e columns of %s 
4160: 5c 22 25 73 5c 22 22 2c 20 7a 54 79 70 65 2c 20  \"%s\"", zType, 
4170: 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  pTab->zName.    
4180: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
4190: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
41a0: 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 21 64 65 66  .}.#else /* !def
41b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
41c0: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
41d0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
41e0: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a  IRTUALTABLE) */.
41f0: 23 20 64 65 66 69 6e 65 20 69 73 52 65 61 6c 54  # define isRealT
4200: 61 62 6c 65 28 78 2c 79 29 20 28 30 29 0a 23 65  able(x,y) (0).#e
4210: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 61 6e 64  ndif../*.** Hand
4220: 6c 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  les the followin
4230: 67 20 70 61 72 73 65 72 20 72 65 64 75 63 74 69  g parser reducti
4240: 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 63 6d 64 20 3a  on:.**.**  cmd :
4250: 3a 3d 20 41 4c 54 45 52 20 54 41 42 4c 45 20 70  := ALTER TABLE p
4260: 53 72 63 20 52 45 4e 41 4d 45 20 43 4f 4c 55 4d  Src RENAME COLUM
4270: 4e 20 70 4f 6c 64 20 54 4f 20 70 4e 65 77 0a 2a  N pOld TO pNew.*
4280: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 6c  /.void sqlite3Al
4290: 74 65 72 52 65 6e 61 6d 65 43 6f 6c 75 6d 6e 28  terRenameColumn(
42a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
42b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
42c0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
42d0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
42e0: 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20  st *pSrc,       
42f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
4300: 62 6c 65 20 62 65 69 6e 67 20 61 6c 74 65 72 65  ble being altere
4310: 64 2e 20 20 70 53 72 63 2d 3e 6e 53 72 63 3d 3d  d.  pSrc->nSrc==
4320: 31 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f  1 */.  Token *pO
4330: 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ld,             
4340: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
4350: 66 20 63 6f 6c 75 6d 6e 20 62 65 69 6e 67 20 63  f column being c
4360: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 54 6f 6b 65  hanged */.  Toke
4370: 6e 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20  n *pNew         
4380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4390: 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a  ew column name *
43a0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
43b0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
43c0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
43d0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
43e0: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20  .  Table *pTab; 
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 2f 2a 20 54 61 62 6c 65 20 62 65 69 6e     /* Table bein
4410: 67 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 69  g updated */.  i
4420: 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4440: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d  * Index of colum
4450: 6e 20 62 65 69 6e 67 20 72 65 6e 61 6d 65 64 20  n being renamed 
4460: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 6c 64 20  */.  char *zOld 
4470: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
4480: 20 20 20 20 20 2f 2a 20 4f 6c 64 20 63 6f 6c 75       /* Old colu
4490: 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61  mn name */.  cha
44a0: 72 20 2a 7a 4e 65 77 20 3d 20 30 3b 20 20 20 20  r *zNew = 0;    
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
44c0: 4e 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  New column name 
44d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
44e0: 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *zDb;           
44f0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
4500: 73 63 68 65 6d 61 20 63 6f 6e 74 61 69 6e 69 6e  schema containin
4510: 67 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  g the table */. 
4520: 20 69 6e 74 20 69 53 63 68 65 6d 61 3b 20 20 20   int iSchema;   
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4540: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
4550: 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 69 6e 74   schema */.  int
4560: 20 62 51 75 6f 74 65 3b 20 20 20 20 20 20 20 20   bQuote;        
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4580: 54 72 75 65 20 74 6f 20 71 75 6f 74 65 20 74 68  True to quote th
4590: 65 20 6e 65 77 20 6e 61 6d 65 20 2a 2f 0a 0a 20  e new name */.. 
45a0: 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74   /* Locate the t
45b0: 61 62 6c 65 20 74 6f 20 62 65 20 61 6c 74 65 72  able to be alter
45c0: 65 64 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73  ed */.  pTab = s
45d0: 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
45e0: 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30 2c  eItem(pParse, 0,
45f0: 20 26 70 53 72 63 2d 3e 61 5b 30 5d 29 3b 0a 20   &pSrc->a[0]);. 
4600: 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74   if( !pTab ) got
4610: 6f 20 65 78 69 74 5f 72 65 6e 61 6d 65 5f 63 6f  o exit_rename_co
4620: 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a 20 43 61 6e 6e  lumn;..  /* Cann
4630: 6f 74 20 61 6c 74 65 72 20 61 20 73 79 73 74 65  ot alter a syste
4640: 6d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66 28  m table */.  if(
4650: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 69 73 41 6c   SQLITE_OK!=isAl
4660: 74 65 72 61 62 6c 65 54 61 62 6c 65 28 70 50 61  terableTable(pPa
4670: 72 73 65 2c 20 70 54 61 62 29 20 29 20 67 6f 74  rse, pTab) ) got
4680: 6f 20 65 78 69 74 5f 72 65 6e 61 6d 65 5f 63 6f  o exit_rename_co
4690: 6c 75 6d 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49  lumn;.  if( SQLI
46a0: 54 45 5f 4f 4b 21 3d 69 73 52 65 61 6c 54 61 62  TE_OK!=isRealTab
46b0: 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  le(pParse, pTab)
46c0: 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 72 65 6e   ) goto exit_ren
46d0: 61 6d 65 5f 63 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f  ame_column;..  /
46e0: 2a 20 57 68 69 63 68 20 73 63 68 65 6d 61 20 68  * Which schema h
46f0: 6f 6c 64 73 20 74 68 65 20 74 61 62 6c 65 20 74  olds the table t
4700: 6f 20 62 65 20 61 6c 74 65 72 65 64 20 2a 2f 20  o be altered */ 
4710: 20 0a 20 20 69 53 63 68 65 6d 61 20 3d 20 73 71   .  iSchema = sq
4720: 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
4730: 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
4740: 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
4750: 20 69 53 63 68 65 6d 61 3e 3d 30 20 29 3b 0a 20   iSchema>=0 );. 
4760: 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69   zDb = db->aDb[i
4770: 53 63 68 65 6d 61 5d 2e 7a 44 62 53 4e 61 6d 65  Schema].zDbSName
4780: 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
4790: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
47a0: 54 49 4f 4e 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65  TION.  /* Invoke
47b0: 20 74 68 65 20 61 75 74 68 6f 72 69 7a 61 74 69   the authorizati
47c0: 6f 6e 20 63 61 6c 6c 62 61 63 6b 2e 20 2a 2f 0a  on callback. */.
47d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
47e0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
47f0: 51 4c 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c  QLITE_ALTER_TABL
4800: 45 2c 20 7a 44 62 2c 20 70 54 61 62 2d 3e 7a 4e  E, zDb, pTab->zN
4810: 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 67  ame, 0) ){.    g
4820: 6f 74 6f 20 65 78 69 74 5f 72 65 6e 61 6d 65 5f  oto exit_rename_
4830: 63 6f 6c 75 6d 6e 3b 0a 20 20 7d 0a 23 65 6e 64  column;.  }.#end
4840: 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75  if..  /* Make su
4850: 72 65 20 74 68 65 20 6f 6c 64 20 6e 61 6d 65 20  re the old name 
4860: 72 65 61 6c 6c 79 20 69 73 20 61 20 63 6f 6c 75  really is a colu
4870: 6d 6e 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 74  mn name in the t
4880: 61 62 6c 65 20 74 6f 20 62 65 0a 20 20 2a 2a 20  able to be.  ** 
4890: 61 6c 74 65 72 65 64 2e 20 20 53 65 74 20 69 43  altered.  Set iC
48a0: 6f 6c 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64  ol to be the ind
48b0: 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
48c0: 20 62 65 69 6e 67 20 72 65 6e 61 6d 65 64 20 2a   being renamed *
48d0: 2f 0a 20 20 7a 4f 6c 64 20 3d 20 73 71 6c 69 74  /.  zOld = sqlit
48e0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
48f0: 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 69 66 28  db, pOld);.  if(
4900: 20 21 7a 4f 6c 64 20 29 20 67 6f 74 6f 20 65 78   !zOld ) goto ex
4910: 69 74 5f 72 65 6e 61 6d 65 5f 63 6f 6c 75 6d 6e  it_rename_column
4920: 3b 0a 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20  ;.  for(iCol=0; 
4930: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
4940: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 69 66   iCol++){.    if
4950: 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  ( 0==sqlite3StrI
4960: 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  Cmp(pTab->aCol[i
4970: 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 7a 4f 6c 64  Col].zName, zOld
4980: 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ) ) break;.  }. 
4990: 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d   if( iCol==pTab-
49a0: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 73 71 6c  >nCol ){.    sql
49b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
49c0: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f  rse, "no such co
49d0: 6c 75 6d 6e 3a 20 5c 22 25 73 5c 22 22 2c 20 7a  lumn: \"%s\"", z
49e0: 4f 6c 64 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  Old);.    goto e
49f0: 78 69 74 5f 72 65 6e 61 6d 65 5f 63 6f 6c 75 6d  xit_rename_colum
4a00: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20  n;.  }..  /* Do 
4a10: 74 68 65 20 72 65 6e 61 6d 65 20 6f 70 65 72 61  the rename opera
4a20: 74 69 6f 6e 20 75 73 69 6e 67 20 61 20 72 65 63  tion using a rec
4a30: 75 72 73 69 76 65 20 55 50 44 41 54 45 20 73 74  ursive UPDATE st
4a40: 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 20 20 2a  atement that.  *
4a50: 2a 20 75 73 65 73 20 74 68 65 20 73 71 6c 69 74  * uses the sqlit
4a60: 65 5f 72 65 6e 61 6d 65 5f 63 6f 6c 75 6d 6e 28  e_rename_column(
4a70: 29 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74  ) SQL function t
4a80: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6e 65  o compute the ne
4a90: 77 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 73 74  w.  ** CREATE st
4aa0: 61 74 65 6d 65 6e 74 20 74 65 78 74 20 66 6f 72  atement text for
4ab0: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
4ac0: 65 72 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20  er table..  */. 
4ad0: 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
4ae0: 28 70 50 61 72 73 65 29 3b 0a 20 20 7a 4e 65 77  (pParse);.  zNew
4af0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
4b00: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 65 77  omToken(db, pNew
4b10: 29 3b 0a 20 20 69 66 28 20 21 7a 4e 65 77 20 29  );.  if( !zNew )
4b20: 20 67 6f 74 6f 20 65 78 69 74 5f 72 65 6e 61 6d   goto exit_renam
4b30: 65 5f 63 6f 6c 75 6d 6e 3b 0a 20 20 61 73 73 65  e_column;.  asse
4b40: 72 74 28 20 70 4e 65 77 2d 3e 6e 3e 30 20 29 3b  rt( pNew->n>0 );
4b50: 0a 20 20 62 51 75 6f 74 65 20 3d 20 73 71 6c 69  .  bQuote = sqli
4b60: 74 65 33 49 73 71 75 6f 74 65 28 70 4e 65 77 2d  te3Isquote(pNew-
4b70: 3e 7a 5b 30 5d 29 3b 0a 20 20 73 71 6c 69 74 65  >z[0]);.  sqlite
4b80: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
4b90: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 55 50 44  rse, .      "UPD
4ba0: 41 54 45 20 5c 22 25 77 5c 22 2e 25 73 20 53 45  ATE \"%w\".%s SE
4bb0: 54 20 22 0a 20 20 20 20 20 20 22 73 71 6c 20 3d  T ".      "sql =
4bc0: 20 73 71 6c 69 74 65 5f 72 65 6e 61 6d 65 5f 63   sqlite_rename_c
4bd0: 6f 6c 75 6d 6e 28 73 71 6c 2c 20 74 79 70 65 2c  olumn(sql, type,
4be0: 20 6e 61 6d 65 2c 20 25 51 2c 20 25 51 2c 20 25   name, %Q, %Q, %
4bf0: 64 2c 20 25 51 2c 20 25 64 2c 20 25 64 29 20 22  d, %Q, %d, %d) "
4c00: 0a 20 20 20 20 20 20 22 57 48 45 52 45 20 6e 61  .      "WHERE na
4c10: 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c  me NOT LIKE 'sql
4c20: 69 74 65 58 5f 25 25 27 20 45 53 43 41 50 45 20  iteX_%%' ESCAPE 
4c30: 27 58 27 20 22 0a 20 20 20 20 20 20 22 20 41 4e  'X' ".      " AN
4c40: 44 20 28 74 79 70 65 20 21 3d 20 27 69 6e 64 65  D (type != 'inde
4c50: 78 27 20 4f 52 20 74 62 6c 5f 6e 61 6d 65 20 3d  x' OR tbl_name =
4c60: 20 25 51 29 22 0a 20 20 20 20 20 20 22 20 41 4e   %Q)".      " AN
4c70: 44 20 73 71 6c 20 4e 4f 54 20 4c 49 4b 45 20 27  D sql NOT LIKE '
4c80: 63 72 65 61 74 65 20 76 69 72 74 75 61 6c 25 25  create virtual%%
4c90: 27 22 2c 0a 20 20 20 20 20 20 7a 44 62 2c 20 4d  '",.      zDb, M
4ca0: 41 53 54 45 52 5f 4e 41 4d 45 2c 20 0a 20 20 20  ASTER_NAME, .   
4cb0: 20 20 20 7a 44 62 2c 20 70 54 61 62 2d 3e 7a 4e     zDb, pTab->zN
4cc0: 61 6d 65 2c 20 69 43 6f 6c 2c 20 7a 4e 65 77 2c  ame, iCol, zNew,
4cd0: 20 62 51 75 6f 74 65 2c 20 69 53 63 68 65 6d 61   bQuote, iSchema
4ce0: 3d 3d 31 2c 0a 20 20 20 20 20 20 70 54 61 62 2d  ==1,.      pTab-
4cf0: 3e 7a 4e 61 6d 65 0a 20 20 29 3b 0a 0a 20 20 73  >zName.  );..  s
4d00: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
4d10: 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
4d20: 20 22 55 50 44 41 54 45 20 74 65 6d 70 2e 25 73   "UPDATE temp.%s
4d30: 20 53 45 54 20 22 0a 20 20 20 20 20 20 22 73 71   SET ".      "sq
4d40: 6c 20 3d 20 73 71 6c 69 74 65 5f 72 65 6e 61 6d  l = sqlite_renam
4d50: 65 5f 63 6f 6c 75 6d 6e 28 73 71 6c 2c 20 74 79  e_column(sql, ty
4d60: 70 65 2c 20 6e 61 6d 65 2c 20 25 51 2c 20 25 51  pe, name, %Q, %Q
4d70: 2c 20 25 64 2c 20 25 51 2c 20 25 64 2c 20 31 29  , %d, %Q, %d, 1)
4d80: 20 22 0a 20 20 20 20 20 20 22 57 48 45 52 45 20   ".      "WHERE 
4d90: 74 79 70 65 20 49 4e 20 28 27 74 72 69 67 67 65  type IN ('trigge
4da0: 72 27 2c 20 27 76 69 65 77 27 29 22 2c 0a 20 20  r', 'view')",.  
4db0: 20 20 20 20 4d 41 53 54 45 52 5f 4e 41 4d 45 2c      MASTER_NAME,
4dc0: 20 0a 20 20 20 20 20 20 7a 44 62 2c 20 70 54 61   .      zDb, pTa
4dd0: 62 2d 3e 7a 4e 61 6d 65 2c 20 69 43 6f 6c 2c 20  b->zName, iCol, 
4de0: 7a 4e 65 77 2c 20 62 51 75 6f 74 65 0a 20 20 29  zNew, bQuote.  )
4df0: 3b 0a 0a 20 20 2f 2a 20 44 72 6f 70 20 61 6e 64  ;..  /* Drop and
4e00: 20 72 65 6c 6f 61 64 20 74 68 65 20 64 61 74 61   reload the data
4e10: 62 61 73 65 20 73 63 68 65 6d 61 2e 20 2a 2f 0a  base schema. */.
4e20: 20 20 72 65 6e 61 6d 65 52 65 6c 6f 61 64 53 63    renameReloadSc
4e30: 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 53 63  hema(pParse, iSc
4e40: 68 65 6d 61 29 3b 0a 20 20 72 65 6e 61 6d 65 54  hema);.  renameT
4e50: 65 73 74 53 63 68 65 6d 61 28 70 50 61 72 73 65  estSchema(pParse
4e60: 2c 20 7a 44 62 2c 20 69 53 63 68 65 6d 61 3d 3d  , zDb, iSchema==
4e70: 31 29 3b 0a 0a 20 65 78 69 74 5f 72 65 6e 61 6d  1);.. exit_renam
4e80: 65 5f 63 6f 6c 75 6d 6e 3a 0a 20 20 73 71 6c 69  e_column:.  sqli
4e90: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
4ea0: 28 64 62 2c 20 70 53 72 63 29 3b 0a 20 20 73 71  (db, pSrc);.  sq
4eb0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4ec0: 7a 4f 6c 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  zOld);.  sqlite3
4ed0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 65 77 29  DbFree(db, zNew)
4ee0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
4ef0: 2a 0a 2a 2a 20 45 61 63 68 20 52 65 6e 61 6d 65  *.** Each Rename
4f00: 54 6f 6b 65 6e 20 6f 62 6a 65 63 74 20 6d 61 70  Token object map
4f10: 73 20 61 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  s an element of 
4f20: 74 68 65 20 70 61 72 73 65 20 74 72 65 65 20 69  the parse tree i
4f30: 6e 74 6f 0a 2a 2a 20 74 68 65 20 74 6f 6b 65 6e  nto.** the token
4f40: 20 74 68 61 74 20 67 65 6e 65 72 61 74 65 64 20   that generated 
4f50: 74 68 61 74 20 65 6c 65 6d 65 6e 74 2e 20 20 54  that element.  T
4f60: 68 65 20 70 61 72 73 65 20 74 72 65 65 20 65 6c  he parse tree el
4f70: 65 6d 65 6e 74 0a 2a 2a 20 6d 69 67 68 74 20 62  ement.** might b
4f80: 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20  e one of:.**.** 
4f90: 20 20 20 20 2a 20 20 41 20 70 6f 69 6e 74 65 72      *  A pointer
4fa0: 20 74 6f 20 61 6e 20 45 78 70 72 20 74 68 61 74   to an Expr that
4fb0: 20 72 65 70 72 65 73 65 6e 74 73 20 61 6e 20 49   represents an I
4fc0: 44 0a 2a 2a 20 20 20 20 20 2a 20 20 54 68 65 20  D.**     *  The 
4fd0: 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  name of a table 
4fe0: 63 6f 6c 75 6d 6e 20 69 6e 20 43 6f 6c 75 6d 6e  column in Column
4ff0: 2e 7a 4e 61 6d 65 0a 2a 2a 0a 2a 2a 20 41 20 6c  .zName.**.** A l
5000: 69 73 74 20 6f 66 20 52 65 6e 61 6d 65 54 6f 6b  ist of RenameTok
5010: 65 6e 20 6f 62 6a 65 63 74 73 20 63 61 6e 20 62  en objects can b
5020: 65 20 63 6f 6e 73 74 72 75 63 74 65 64 20 64 75  e constructed du
5030: 72 69 6e 67 20 70 61 72 73 69 6e 67 2e 0a 2a 2a  ring parsing..**
5040: 20 45 61 63 68 20 6e 65 77 20 6f 62 6a 65 63 74   Each new object
5050: 20 69 73 20 63 72 65 61 74 65 64 20 62 79 20 73   is created by s
5060: 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
5070: 6e 4d 61 70 28 29 2e 0a 2a 2a 20 41 73 20 74 68  nMap()..** As th
5080: 65 20 70 61 72 73 65 20 74 72 65 65 20 69 73 20  e parse tree is 
5090: 74 72 61 6e 73 66 6f 72 6d 65 64 2c 20 74 68 65  transformed, the
50a0: 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f   sqlite3RenameTo
50b0: 6b 65 6e 52 65 6d 61 70 28 29 0a 2a 2a 20 72 6f  kenRemap().** ro
50c0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
50d0: 20 6b 65 65 70 20 74 68 65 20 6d 61 70 70 69 6e   keep the mappin
50e0: 67 20 63 75 72 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a  g current..**.**
50f0: 20 41 66 74 65 72 20 74 68 65 20 70 61 72 73 65   After the parse
5100: 20 66 69 6e 69 73 68 65 73 2c 20 72 65 6e 61 6d   finishes, renam
5110: 65 54 6f 6b 65 6e 46 69 6e 64 28 29 20 72 6f 75  eTokenFind() rou
5120: 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64  tine can be used
5130: 0a 2a 2a 20 74 6f 20 6c 6f 6f 6b 20 75 70 20 74  .** to look up t
5140: 68 65 20 61 63 74 75 61 6c 20 74 6f 6b 65 6e 20  he actual token 
5150: 76 61 6c 75 65 20 74 68 61 74 20 63 72 65 61 74  value that creat
5160: 65 64 20 73 6f 6d 65 20 65 6c 65 6d 65 6e 74 20  ed some element 
5170: 69 6e 0a 2a 2a 20 74 68 65 20 70 61 72 73 65 20  in.** the parse 
5180: 74 72 65 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tree..*/.struct 
5190: 52 65 6e 61 6d 65 54 6f 6b 65 6e 20 7b 0a 20 20  RenameToken {.  
51a0: 76 6f 69 64 20 2a 70 3b 20 20 20 20 20 20 20 20  void *p;        
51b0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20         /* Parse 
51c0: 74 72 65 65 20 65 6c 65 6d 65 6e 74 20 63 72 65  tree element cre
51d0: 61 74 65 64 20 62 79 20 74 6f 6b 65 6e 20 74 20  ated by token t 
51e0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 74 3b 20 20 20  */.  Token t;   
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
5200: 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 63 72  he token that cr
5210: 65 61 74 65 64 20 70 61 72 73 65 20 74 72 65 65  eated parse tree
5220: 20 65 6c 65 6d 65 6e 74 20 70 20 2a 2f 0a 20 20   element p */.  
5230: 52 65 6e 61 6d 65 54 6f 6b 65 6e 20 2a 70 4e 65  RenameToken *pNe
5240: 78 74 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20 69  xt;    /* Next i
5250: 73 20 61 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  s a list of all 
5260: 52 65 6e 61 6d 65 54 6f 6b 65 6e 20 6f 62 6a 65  RenameToken obje
5270: 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  cts */.};../*.**
5280: 20 54 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20   The context of 
5290: 61 6e 20 41 4c 54 45 52 20 54 41 42 4c 45 20 52  an ALTER TABLE R
52a0: 45 4e 41 4d 45 20 43 4f 4c 55 4d 4e 20 6f 70 65  ENAME COLUMN ope
52b0: 72 61 74 69 6f 6e 20 74 68 61 74 20 67 65 74 73  ration that gets
52c0: 20 70 61 73 73 65 64 0a 2a 2a 20 64 6f 77 6e 20   passed.** down 
52d0: 69 6e 74 6f 20 74 68 65 20 57 61 6c 6b 65 72 2e  into the Walker.
52e0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
52f0: 63 74 20 52 65 6e 61 6d 65 43 74 78 20 52 65 6e  ct RenameCtx Ren
5300: 61 6d 65 43 74 78 3b 0a 73 74 72 75 63 74 20 52  ameCtx;.struct R
5310: 65 6e 61 6d 65 43 74 78 20 7b 0a 20 20 52 65 6e  enameCtx {.  Ren
5320: 61 6d 65 54 6f 6b 65 6e 20 2a 70 4c 69 73 74 3b  ameToken *pList;
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5340: 4c 69 73 74 20 6f 66 20 74 6f 6b 65 6e 73 20 74  List of tokens t
5350: 6f 20 6f 76 65 72 77 72 69 74 65 20 2a 2f 0a 20  o overwrite */. 
5360: 20 69 6e 74 20 6e 4c 69 73 74 3b 20 20 20 20 20   int nList;     
5370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5380: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 6f   /* Number of to
5390: 6b 65 6e 73 20 69 6e 20 70 4c 69 73 74 20 2a 2f  kens in pList */
53a0: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53c0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
53d0: 6f 6c 75 6d 6e 20 62 65 69 6e 67 20 72 65 6e 61  olumn being rena
53e0: 6d 65 64 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  med */.  Table *
53f0: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
5400: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
5410: 65 20 62 65 69 6e 67 20 41 4c 54 45 52 65 64 20  e being ALTERed 
5420: 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  */ .  const char
5430: 20 2a 7a 4f 6c 64 3b 20 20 20 20 20 20 20 20 20   *zOld;         
5440: 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20 63 6f 6c        /* Old col
5450: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a  umn name */.};..
5460: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
5470: 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  BUG./*.** This f
5480: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
5490: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 20 49  for debugging. I
54a0: 74 20 70 65 72 66 6f 72 6d 73 20 74 77 6f 20 74  t performs two t
54b0: 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e  asks:.**.**   1.
54c0: 20 43 68 65 63 6b 73 20 74 68 61 74 20 70 6f 69   Checks that poi
54d0: 6e 74 65 72 20 70 50 74 72 20 64 6f 65 73 20 6e  nter pPtr does n
54e0: 6f 74 20 61 6c 72 65 61 64 79 20 61 70 70 65 61  ot already appea
54f0: 72 20 69 6e 20 74 68 65 20 0a 2a 2a 20 20 20 20  r in the .**    
5500: 20 20 72 65 6e 61 6d 65 2d 74 6f 6b 65 6e 20 6c    rename-token l
5510: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20  ist..**.**   2. 
5520: 44 65 72 65 66 65 72 65 6e 63 65 73 20 65 61 63  Dereferences eac
5530: 68 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  h pointer in the
5540: 20 72 65 6e 61 6d 65 2d 74 6f 6b 65 6e 20 6c 69   rename-token li
5550: 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  st..**.** The se
5560: 63 6f 6e 64 20 69 73 20 6d 6f 73 74 20 65 66 66  cond is most eff
5570: 65 63 74 69 76 65 20 77 68 65 6e 20 64 65 62 75  ective when debu
5580: 67 67 69 6e 67 20 75 6e 64 65 72 20 76 61 6c 67  gging under valg
5590: 72 69 6e 64 20 6f 72 0a 2a 2a 20 61 64 64 72 65  rind or.** addre
55a0: 73 73 2d 73 61 6e 69 74 69 7a 65 72 20 6f 72 20  ss-sanitizer or 
55b0: 73 69 6d 69 6c 61 72 2e 20 49 66 20 61 6e 79 20  similar. If any 
55c0: 6f 66 20 74 68 65 73 65 20 70 6f 69 6e 74 65 72  of these pointer
55d0: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 0a 2a 2a 20  s no longer .** 
55e0: 70 6f 69 6e 74 20 74 6f 20 76 61 6c 69 64 20 6f  point to valid o
55f0: 62 6a 65 63 74 73 2c 20 61 6e 20 65 78 63 65 70  bjects, an excep
5600: 74 69 6f 6e 20 69 73 20 72 61 69 73 65 64 20 62  tion is raised b
5610: 79 20 74 68 65 20 6d 65 6d 6f 72 79 2d 63 68 65  y the memory-che
5620: 63 6b 69 6e 67 20 0a 2a 2a 20 74 6f 6f 6c 2e 0a  cking .** tool..
5630: 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 20  **.** The point 
5640: 6f 66 20 74 68 69 73 20 69 73 20 74 6f 20 70 72  of this is to pr
5650: 65 76 65 6e 74 20 63 6f 6d 70 61 72 69 73 6f 6e  event comparison
5660: 73 20 6f 66 20 69 6e 76 61 6c 69 64 20 70 6f 69  s of invalid poi
5670: 6e 74 65 72 20 76 61 6c 75 65 73 2e 0a 2a 2a 20  nter values..** 
5680: 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73  Even though this
5690: 20 61 6c 77 61 79 73 20 73 65 65 6d 73 20 74 6f   always seems to
56a0: 20 77 6f 72 6b 2c 20 69 74 20 69 73 20 75 6e 64   work, it is und
56b0: 65 66 69 6e 65 64 20 61 63 63 6f 72 64 69 6e 67  efined according
56c0: 20 74 6f 20 74 68 65 0a 2a 2a 20 43 20 73 74 61   to the.** C sta
56d0: 6e 64 61 72 64 2e 20 45 78 61 6d 70 6c 65 20 6f  ndard. Example o
56e0: 66 20 75 6e 64 65 66 69 6e 65 64 20 63 6f 6d 70  f undefined comp
56f0: 61 72 69 73 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20  arison:.**.**   
5700: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 78    sqlite3_free(x
5710: 29 3b 0a 2a 2a 20 20 20 20 20 69 66 28 20 78 3d  );.**     if( x=
5720: 3d 79 20 29 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  =y ) ....**.** T
5730: 65 63 68 6e 69 63 61 6c 6c 79 2c 20 61 73 20 78  echnically, as x
5740: 20 6e 6f 20 6c 6f 6e 67 65 72 20 70 6f 69 6e 74   no longer point
5750: 73 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 6f  s into a valid o
5760: 62 6a 65 63 74 20 6f 72 20 74 6f 20 74 68 65 20  bject or to the 
5770: 62 79 74 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  byte.** followin
5780: 67 20 61 20 76 61 6c 69 64 20 6f 62 6a 65 63 74  g a valid object
5790: 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20  , it may not be 
57a0: 75 73 65 64 20 69 6e 20 63 6f 6d 70 61 72 69 73  used in comparis
57b0: 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  on operations..*
57c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
57d0: 6e 61 6d 65 54 6f 6b 65 6e 43 68 65 63 6b 41 6c  nameTokenCheckAl
57e0: 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  l(Parse *pParse,
57f0: 20 76 6f 69 64 20 2a 70 50 74 72 29 7b 0a 20 20   void *pPtr){.  
5800: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
5810: 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 64  ==0 && pParse->d
5820: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
5830: 3d 30 20 29 7b 0a 20 20 20 20 52 65 6e 61 6d 65  =0 ){.    Rename
5840: 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 20 20 75 38  Token *p;.    u8
5850: 20 69 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28   i = 0;.    for(
5860: 70 3d 70 50 61 72 73 65 2d 3e 70 52 65 6e 61 6d  p=pParse->pRenam
5870: 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
5880: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
5890: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  p ){.        ass
58a0: 65 72 74 28 20 70 2d 3e 70 21 3d 70 50 74 72 20  ert( p->p!=pPtr 
58b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  );.        i += 
58c0: 2a 28 75 38 2a 29 28 70 2d 3e 70 29 3b 0a 20 20  *(u8*)(p->p);.  
58d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
58e0: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
58f0: 20 72 65 6e 61 6d 65 54 6f 6b 65 6e 43 68 65 63   renameTokenChec
5900: 6b 41 6c 6c 28 78 2c 79 29 0a 23 65 6e 64 69 66  kAll(x,y).#endif
5910: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72  ../*.** Remember
5920: 20 74 68 61 74 20 74 68 65 20 70 61 72 73 65 72   that the parser
5930: 20 74 72 65 65 20 65 6c 65 6d 65 6e 74 20 70 50   tree element pP
5940: 74 72 20 77 61 73 20 63 72 65 61 74 65 64 20 75  tr was created u
5950: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f 6b 65  sing.** the toke
5960: 6e 20 70 54 6f 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20  n pToken..**.** 
5970: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
5980: 63 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  construct a new 
5990: 52 65 6e 61 6d 65 54 6f 6b 65 6e 20 6f 62 6a 65  RenameToken obje
59a0: 63 74 20 61 6e 64 20 61 64 64 20 69 74 0a 2a 2a  ct and add it.**
59b0: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
59c0: 52 65 6e 61 6d 65 54 6f 6b 65 6e 20 6f 62 6a 65  RenameToken obje
59d0: 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 62 65  cts currently be
59e0: 69 6e 67 20 62 75 69 6c 74 20 75 70 0a 2a 2a 20  ing built up.** 
59f0: 69 6e 20 70 50 61 72 73 65 2d 3e 70 52 65 6e 61  in pParse->pRena
5a00: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50  me..**.** The pP
5a10: 74 72 20 61 72 67 75 6d 65 6e 74 20 69 73 20 72  tr argument is r
5a20: 65 74 75 72 6e 65 64 20 73 6f 20 74 68 61 74 20  eturned so that 
5a30: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
5a40: 20 62 65 20 75 73 65 64 0a 2a 2a 20 77 69 74 68   be used.** with
5a50: 20 74 61 69 6c 20 72 65 63 75 72 73 69 6f 6e 20   tail recursion 
5a60: 69 6e 20 74 6f 6b 65 6e 45 78 70 72 28 29 20 72  in tokenExpr() r
5a70: 6f 75 74 69 6e 65 2c 20 66 6f 72 20 61 20 73 6d  outine, for a sm
5a80: 61 6c 6c 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  all performance.
5a90: 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e 0a  ** improvement..
5aa0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
5ab0: 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 50  RenameTokenMap(P
5ac0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 76 6f  arse *pParse, vo
5ad0: 69 64 20 2a 70 50 74 72 2c 20 54 6f 6b 65 6e 20  id *pPtr, Token 
5ae0: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 52 65 6e 61  *pToken){.  Rena
5af0: 6d 65 54 6f 6b 65 6e 20 2a 70 4e 65 77 3b 0a 20  meToken *pNew;. 
5b00: 20 61 73 73 65 72 74 28 20 70 50 74 72 20 7c 7c   assert( pPtr ||
5b10: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
5b20: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72  locFailed );.  r
5b30: 65 6e 61 6d 65 54 6f 6b 65 6e 43 68 65 63 6b 41  enameTokenCheckA
5b40: 6c 6c 28 70 50 61 72 73 65 2c 20 70 50 74 72 29  ll(pParse, pPtr)
5b50: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
5b60: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
5b70: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
5b80: 66 28 52 65 6e 61 6d 65 54 6f 6b 65 6e 29 29 3b  f(RenameToken));
5b90: 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
5ba0: 20 20 20 70 4e 65 77 2d 3e 70 20 3d 20 70 50 74     pNew->p = pPt
5bb0: 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 20 3d  r;.    pNew->t =
5bc0: 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 20 20 70 4e   *pToken;.    pN
5bd0: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 72  ew->pNext = pPar
5be0: 73 65 2d 3e 70 52 65 6e 61 6d 65 3b 0a 20 20 20  se->pRename;.   
5bf0: 20 70 50 61 72 73 65 2d 3e 70 52 65 6e 61 6d 65   pParse->pRename
5c00: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20   = pNew;.  }..  
5c10: 72 65 74 75 72 6e 20 70 50 74 72 3b 0a 7d 0a 0a  return pPtr;.}..
5c20: 2f 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75  /*.** It is assu
5c30: 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69  med that there i
5c40: 73 20 61 6c 72 65 61 64 79 20 61 20 52 65 6e 61  s already a Rena
5c50: 6d 65 54 6f 6b 65 6e 20 6f 62 6a 65 63 74 20 61  meToken object a
5c60: 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
5c70: 68 20 70 61 72 73 65 20 74 72 65 65 20 65 6c 65  h parse tree ele
5c80: 6d 65 6e 74 20 70 46 72 6f 6d 2e 20 54 68 69 73  ment pFrom. This
5c90: 20 66 75 6e 63 74 69 6f 6e 20 72 65 6d 61 70 73   function remaps
5ca0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
5cb0: 74 6f 6b 65 6e 0a 2a 2a 20 74 6f 20 70 61 72 73  token.** to pars
5cc0: 65 20 74 72 65 65 20 65 6c 65 6d 65 6e 74 20 70  e tree element p
5cd0: 54 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  To..*/.void sqli
5ce0: 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65  te3RenameTokenRe
5cf0: 6d 61 70 28 50 61 72 73 65 20 2a 70 50 61 72 73  map(Parse *pPars
5d00: 65 2c 20 76 6f 69 64 20 2a 70 54 6f 2c 20 76 6f  e, void *pTo, vo
5d10: 69 64 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 52 65  id *pFrom){.  Re
5d20: 6e 61 6d 65 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20  nameToken *p;.  
5d30: 72 65 6e 61 6d 65 54 6f 6b 65 6e 43 68 65 63 6b  renameTokenCheck
5d40: 41 6c 6c 28 70 50 61 72 73 65 2c 20 70 54 6f 29  All(pParse, pTo)
5d50: 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 72 73 65  ;.  for(p=pParse
5d60: 2d 3e 70 52 65 6e 61 6d 65 3b 20 70 3b 20 70 3d  ->pRename; p; p=
5d70: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
5d80: 66 28 20 70 2d 3e 70 3d 3d 70 46 72 6f 6d 20 29  f( p->p==pFrom )
5d90: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 20 3d 20 70  {.      p->p = p
5da0: 54 6f 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  To;.      break;
5db0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
5dc0: 0a 2a 2a 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62  .** Walker callb
5dd0: 61 63 6b 20 75 73 65 64 20 62 79 20 73 71 6c 69  ack used by sqli
5de0: 74 65 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d  te3RenameExprUnm
5df0: 61 70 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ap()..*/.static 
5e00: 69 6e 74 20 72 65 6e 61 6d 65 55 6e 6d 61 70 45  int renameUnmapE
5e10: 78 70 72 43 62 28 57 61 6c 6b 65 72 20 2a 70 57  xprCb(Walker *pW
5e20: 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
5e30: 70 72 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  pr){.  Parse *pP
5e40: 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
5e50: 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74 65  pParse;.  sqlite
5e60: 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61  3RenameTokenRema
5e70: 70 28 70 50 61 72 73 65 2c 20 30 2c 20 28 76 6f  p(pParse, 0, (vo
5e80: 69 64 2a 29 70 45 78 70 72 29 3b 0a 20 20 72 65  id*)pExpr);.  re
5e90: 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75  turn WRC_Continu
5ea0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  e;.}../*.** Walk
5eb0: 65 72 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64  er callback used
5ec0: 20 62 79 20 73 71 6c 69 74 65 33 52 65 6e 61 6d   by sqlite3Renam
5ed0: 65 45 78 70 72 55 6e 6d 61 70 28 29 2e 0a 2a 2f  eExprUnmap()..*/
5ee0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6e 61  .static int rena
5ef0: 6d 65 55 6e 6d 61 70 53 65 6c 65 63 74 43 62 28  meUnmapSelectCb(
5f00: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
5f10: 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 50   Select *p){.  P
5f20: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
5f30: 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
5f40: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 41    int i;.  if( A
5f50: 4c 57 41 59 53 28 70 2d 3e 70 45 4c 69 73 74 29  LWAYS(p->pEList)
5f60: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
5f70: 20 2a 70 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   *pList = p->pEL
5f80: 69 73 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ist;.    for(i=0
5f90: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
5fa0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
5fb0: 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  ( pList->a[i].zN
5fc0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
5fd0: 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
5fe0: 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 30  nRemap(pParse, 0
5ff0: 2c 20 28 76 6f 69 64 2a 29 70 4c 69 73 74 2d 3e  , (void*)pList->
6000: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
6010: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6020: 20 69 66 28 20 41 4c 57 41 59 53 28 70 2d 3e 70   if( ALWAYS(p->p
6030: 53 72 63 29 20 29 7b 20 20 2f 2a 20 45 76 65 72  Src) ){  /* Ever
6040: 79 20 53 65 6c 65 63 74 20 61 73 20 61 20 53 72  y Select as a Sr
6050: 63 4c 69 73 74 2c 20 65 76 65 6e 20 69 66 20 69  cList, even if i
6060: 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20  t is empty */.  
6070: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
6080: 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 66  = p->pSrc;.    f
6090: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e  or(i=0; i<pSrc->
60a0: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
60b0: 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54    sqlite3RenameT
60c0: 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65  okenRemap(pParse
60d0: 2c 20 30 2c 20 28 76 6f 69 64 2a 29 70 53 72 63  , 0, (void*)pSrc
60e0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
60f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6100: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
6110: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
6120: 61 6c 6c 20 6e 6f 64 65 73 20 74 68 61 74 20 61  all nodes that a
6130: 72 65 20 70 61 72 74 20 6f 66 20 65 78 70 72 65  re part of expre
6140: 73 73 69 6f 6e 20 70 45 78 70 72 20 66 72 6f 6d  ssion pExpr from
6150: 20 74 68 65 20 72 65 6e 61 6d 65 20 6c 69 73 74   the rename list
6160: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
6170: 33 52 65 6e 61 6d 65 45 78 70 72 55 6e 6d 61 70  3RenameExprUnmap
6180: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6190: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
61a0: 57 61 6c 6b 65 72 20 73 57 61 6c 6b 65 72 3b 0a  Walker sWalker;.
61b0: 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c 6b 65    memset(&sWalke
61c0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57 61 6c  r, 0, sizeof(Wal
61d0: 6b 65 72 29 29 3b 0a 20 20 73 57 61 6c 6b 65 72  ker));.  sWalker
61e0: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
61f0: 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70  ;.  sWalker.xExp
6200: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 6e 61  rCallback = rena
6210: 6d 65 55 6e 6d 61 70 45 78 70 72 43 62 3b 0a 20  meUnmapExprCb;. 
6220: 20 73 57 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74   sWalker.xSelect
6230: 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 6e 61 6d  Callback = renam
6240: 65 55 6e 6d 61 70 53 65 6c 65 63 74 43 62 3b 0a  eUnmapSelectCb;.
6250: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
6260: 72 28 26 73 57 61 6c 6b 65 72 2c 20 70 45 78 70  r(&sWalker, pExp
6270: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  r);.}../*.** Rem
6280: 6f 76 65 20 61 6c 6c 20 6e 6f 64 65 73 20 74 68  ove all nodes th
6290: 61 74 20 61 72 65 20 70 61 72 74 20 6f 66 20 65  at are part of e
62a0: 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20 70  xpression-list p
62b0: 45 4c 69 73 74 20 66 72 6f 6d 20 74 68 65 20 0a  EList from the .
62c0: 2a 2a 20 72 65 6e 61 6d 65 20 6c 69 73 74 2e 0a  ** rename list..
62d0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
62e0: 65 6e 61 6d 65 45 78 70 72 6c 69 73 74 55 6e 6d  enameExprlistUnm
62f0: 61 70 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ap(Parse *pParse
6300: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69  , ExprList *pELi
6310: 73 74 29 7b 0a 20 20 69 66 28 20 70 45 4c 69 73  st){.  if( pELis
6320: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
6330: 20 20 20 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b      Walker sWalk
6340: 65 72 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  er;.    memset(&
6350: 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65  sWalker, 0, size
6360: 6f 66 28 57 61 6c 6b 65 72 29 29 3b 0a 20 20 20  of(Walker));.   
6370: 20 73 57 61 6c 6b 65 72 2e 70 50 61 72 73 65 20   sWalker.pParse 
6380: 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 57  = pParse;.    sW
6390: 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
63a0: 61 63 6b 20 3d 20 72 65 6e 61 6d 65 55 6e 6d 61  ack = renameUnma
63b0: 70 45 78 70 72 43 62 3b 0a 20 20 20 20 73 71 6c  pExprCb;.    sql
63c0: 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74  ite3WalkExprList
63d0: 28 26 73 57 61 6c 6b 65 72 2c 20 70 45 4c 69 73  (&sWalker, pELis
63e0: 74 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  t);.    for(i=0;
63f0: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
6400: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
6410: 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
6420: 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 30 2c  Remap(pParse, 0,
6430: 20 28 76 6f 69 64 2a 29 70 45 4c 69 73 74 2d 3e   (void*)pEList->
6440: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
6450: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
6460: 46 72 65 65 20 74 68 65 20 6c 69 73 74 20 6f 66  Free the list of
6470: 20 52 65 6e 61 6d 65 54 6f 6b 65 6e 20 6f 62 6a   RenameToken obj
6480: 65 63 74 73 20 67 69 76 65 6e 20 69 6e 20 74 68  ects given in th
6490: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
64a0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
64b0: 20 72 65 6e 61 6d 65 54 6f 6b 65 6e 46 72 65 65   renameTokenFree
64c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 52 65  (sqlite3 *db, Re
64d0: 6e 61 6d 65 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  nameToken *pToke
64e0: 6e 29 7b 0a 20 20 52 65 6e 61 6d 65 54 6f 6b 65  n){.  RenameToke
64f0: 6e 20 2a 70 4e 65 78 74 3b 0a 20 20 52 65 6e 61  n *pNext;.  Rena
6500: 6d 65 54 6f 6b 65 6e 20 2a 70 3b 0a 20 20 66 6f  meToken *p;.  fo
6510: 72 28 70 3d 70 54 6f 6b 65 6e 3b 20 70 3b 20 70  r(p=pToken; p; p
6520: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
6530: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
6540: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
6550: 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  (db, p);.  }.}..
6560: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65  /*.** Search the
6570: 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 70 61   Parse object pa
6580: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
6590: 74 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 61  t argument for a
65a0: 20 52 65 6e 61 6d 65 54 6f 6b 65 6e 0a 2a 2a 20   RenameToken.** 
65b0: 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
65c0: 64 20 77 69 74 68 20 70 61 72 73 65 20 74 72 65  d with parse tre
65d0: 65 20 65 6c 65 6d 65 6e 74 20 70 50 74 72 2e 20  e element pPtr. 
65e0: 49 66 20 66 6f 75 6e 64 2c 20 72 65 6d 6f 76 65  If found, remove
65f0: 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20   it.** from the 
6600: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 61 6e 64  Parse object and
6610: 20 61 64 64 20 69 74 20 74 6f 20 74 68 65 20 6c   add it to the l
6620: 69 73 74 20 6d 61 69 6e 74 61 69 6e 65 64 20 62  ist maintained b
6630: 79 20 74 68 65 0a 2a 2a 20 52 65 6e 61 6d 65 43  y the.** RenameC
6640: 74 78 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64  tx object passed
6650: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
6660: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
6670: 69 63 20 76 6f 69 64 20 72 65 6e 61 6d 65 54 6f  ic void renameTo
6680: 6b 65 6e 46 69 6e 64 28 50 61 72 73 65 20 2a 70  kenFind(Parse *p
6690: 50 61 72 73 65 2c 20 73 74 72 75 63 74 20 52 65  Parse, struct Re
66a0: 6e 61 6d 65 43 74 78 20 2a 70 43 74 78 2c 20 76  nameCtx *pCtx, v
66b0: 6f 69 64 20 2a 70 50 74 72 29 7b 0a 20 20 52 65  oid *pPtr){.  Re
66c0: 6e 61 6d 65 54 6f 6b 65 6e 20 2a 2a 70 70 3b 0a  nameToken **pp;.
66d0: 20 20 61 73 73 65 72 74 28 20 70 50 74 72 21 3d    assert( pPtr!=
66e0: 30 20 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  0 );.  for(pp=&p
66f0: 50 61 72 73 65 2d 3e 70 52 65 6e 61 6d 65 3b 20  Parse->pRename; 
6700: 28 2a 70 70 29 3b 20 70 70 3d 26 28 2a 70 70 29  (*pp); pp=&(*pp)
6710: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
6720: 28 20 28 2a 70 70 29 2d 3e 70 3d 3d 70 50 74 72  ( (*pp)->p==pPtr
6730: 20 29 7b 0a 20 20 20 20 20 20 52 65 6e 61 6d 65   ){.      Rename
6740: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20  Token *pToken = 
6750: 2a 70 70 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d  *pp;.      *pp =
6760: 20 70 54 6f 6b 65 6e 2d 3e 70 4e 65 78 74 3b 0a   pToken->pNext;.
6770: 20 20 20 20 20 20 70 54 6f 6b 65 6e 2d 3e 70 4e        pToken->pN
6780: 65 78 74 20 3d 20 70 43 74 78 2d 3e 70 4c 69 73  ext = pCtx->pLis
6790: 74 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 70  t;.      pCtx->p
67a0: 4c 69 73 74 20 3d 20 70 54 6f 6b 65 6e 3b 0a 20  List = pToken;. 
67b0: 20 20 20 20 20 70 43 74 78 2d 3e 6e 4c 69 73 74       pCtx->nList
67c0: 2b 2b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ++;.      break;
67d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
67e0: 0a 2a 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f  .** Iterate thro
67f0: 75 67 68 20 74 68 65 20 53 65 6c 65 63 74 20 6f  ugh the Select o
6800: 62 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20  bjects that are 
6810: 70 61 72 74 20 6f 66 20 57 49 54 48 20 63 6c 61  part of WITH cla
6820: 75 73 65 73 20 61 74 74 61 63 68 65 64 0a 2a 2a  uses attached.**
6830: 20 74 6f 20 73 65 6c 65 63 74 20 73 74 61 74 65   to select state
6840: 6d 65 6e 74 20 70 53 65 6c 65 63 74 2e 0a 2a 2f  ment pSelect..*/
6850: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6e  .static void ren
6860: 61 6d 65 57 61 6c 6b 57 69 74 68 28 57 61 6c 6b  ameWalkWith(Walk
6870: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c  er *pWalker, Sel
6880: 65 63 74 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20  ect *pSelect){. 
6890: 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70 57   if( pSelect->pW
68a0: 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ith ){.    int i
68b0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
68c0: 3c 70 53 65 6c 65 63 74 2d 3e 70 57 69 74 68 2d  <pSelect->pWith-
68d0: 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCte; i++){.   
68e0: 20 20 20 53 65 6c 65 63 74 20 2a 70 20 3d 20 70     Select *p = p
68f0: 53 65 6c 65 63 74 2d 3e 70 57 69 74 68 2d 3e 61  Select->pWith->a
6900: 5b 69 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  [i].pSelect;.   
6910: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73     NameContext s
6920: 4e 43 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  NC;.      memset
6930: 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
6940: 28 73 4e 43 29 29 3b 0a 20 20 20 20 20 20 73 4e  (sNC));.      sN
6950: 43 2e 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b  C.pParse = pWalk
6960: 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  er->pParse;.    
6970: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
6980: 72 65 70 28 73 4e 43 2e 70 50 61 72 73 65 2c 20  rep(sNC.pParse, 
6990: 70 2c 20 26 73 4e 43 29 3b 0a 20 20 20 20 20 20  p, &sNC);.      
69a0: 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
69b0: 74 28 70 57 61 6c 6b 65 72 2c 20 70 29 3b 0a 20  t(pWalker, p);. 
69c0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
69d0: 2a 20 54 68 69 73 20 69 73 20 61 20 57 61 6c 6b  * This is a Walk
69e0: 65 72 20 73 65 6c 65 63 74 20 63 61 6c 6c 62 61  er select callba
69f0: 63 6b 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 68  ck. It does noth
6a00: 69 6e 67 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20  ing. It is only 
6a10: 72 65 71 75 69 72 65 64 0a 2a 2a 20 62 65 63 61  required.** beca
6a20: 75 73 65 20 77 69 74 68 6f 75 74 20 61 20 64 75  use without a du
6a30: 6d 6d 79 20 63 61 6c 6c 62 61 63 6b 2c 20 73 71  mmy callback, sq
6a40: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 20  lite3WalkExpr() 
6a50: 61 6e 64 20 73 69 6d 69 6c 61 72 20 64 6f 20 6e  and similar do n
6a60: 6f 74 0a 2a 2a 20 64 65 73 63 65 6e 64 20 69 6e  ot.** descend in
6a70: 74 6f 20 73 75 62 2d 73 65 6c 65 63 74 20 73 74  to sub-select st
6a80: 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  atements..*/.sta
6a90: 74 69 63 20 69 6e 74 20 72 65 6e 61 6d 65 43 6f  tic int renameCo
6aa0: 6c 75 6d 6e 53 65 6c 65 63 74 43 62 28 57 61 6c  lumnSelectCb(Wal
6ab0: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
6ac0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 72 65 6e 61  lect *p){.  rena
6ad0: 6d 65 57 61 6c 6b 57 69 74 68 28 70 57 61 6c 6b  meWalkWith(pWalk
6ae0: 65 72 2c 20 70 29 3b 0a 20 20 72 65 74 75 72 6e  er, p);.  return
6af0: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
6b00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
6b10: 61 20 57 61 6c 6b 65 72 20 65 78 70 72 65 73 73  a Walker express
6b20: 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a  ion callback..**
6b30: 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 54 4b  .** For every TK
6b40: 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 20 69 6e 20  _COLUMN node in 
6b50: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
6b60: 72 65 65 2c 20 73 65 61 72 63 68 20 74 6f 20 73  ree, search to s
6b70: 65 65 0a 2a 2a 20 69 66 20 74 68 65 20 63 6f 6c  ee.** if the col
6b80: 75 6d 6e 20 62 65 69 6e 67 20 72 65 66 65 72 65  umn being refere
6b90: 6e 63 65 73 20 69 73 20 74 68 65 20 63 6f 6c 75  nces is the colu
6ba0: 6d 6e 20 62 65 69 6e 67 20 72 65 6e 61 6d 65 64  mn being renamed
6bb0: 20 62 79 20 61 6e 0a 2a 2a 20 41 4c 54 45 52 20   by an.** ALTER 
6bc0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
6bd0: 20 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e    If it is, then
6be0: 20 61 74 74 61 63 68 20 69 74 73 20 61 73 73 6f   attach its asso
6bf0: 63 69 61 74 65 64 0a 2a 2a 20 52 65 6e 61 6d 65  ciated.** Rename
6c00: 54 6f 6b 65 6e 20 6f 62 6a 65 63 74 20 74 6f 20  Token object to 
6c10: 74 68 65 20 6c 69 73 74 20 6f 66 20 52 65 6e 61  the list of Rena
6c20: 6d 65 54 6f 6b 65 6e 20 6f 62 6a 65 63 74 73 20  meToken objects 
6c30: 62 65 69 6e 67 0a 2a 2a 20 63 6f 6e 73 74 72 75  being.** constru
6c40: 63 74 65 64 20 69 6e 20 52 65 6e 61 6d 65 43 74  cted in RenameCt
6c50: 78 20 6f 62 6a 65 63 74 20 61 74 20 70 57 61 6c  x object at pWal
6c60: 6b 65 72 2d 3e 75 2e 70 52 65 6e 61 6d 65 2e 0a  ker->u.pRename..
6c70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
6c80: 6e 61 6d 65 43 6f 6c 75 6d 6e 45 78 70 72 43 62  nameColumnExprCb
6c90: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
6ca0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
6cb0: 20 20 52 65 6e 61 6d 65 43 74 78 20 2a 70 20 3d    RenameCtx *p =
6cc0: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 52 65 6e   pWalker->u.pRen
6cd0: 61 6d 65 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ame;.  if( pExpr
6ce0: 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 49 47 47 45 52  ->op==TK_TRIGGER
6cf0: 20 0a 20 20 20 26 26 20 70 45 78 70 72 2d 3e 69   .   && pExpr->i
6d00: 43 6f 6c 75 6d 6e 3d 3d 70 2d 3e 69 43 6f 6c 20  Column==p->iCol 
6d10: 0a 20 20 20 26 26 20 70 57 61 6c 6b 65 72 2d 3e  .   && pWalker->
6d20: 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
6d30: 54 61 62 3d 3d 70 2d 3e 70 54 61 62 0a 20 20 29  Tab==p->pTab.  )
6d40: 7b 0a 20 20 20 20 72 65 6e 61 6d 65 54 6f 6b 65  {.    renameToke
6d50: 6e 46 69 6e 64 28 70 57 61 6c 6b 65 72 2d 3e 70  nFind(pWalker->p
6d60: 50 61 72 73 65 2c 20 70 2c 20 28 76 6f 69 64 2a  Parse, p, (void*
6d70: 29 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65  )pExpr);.  }else
6d80: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d   if( pExpr->op==
6d90: 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 26 26  TK_COLUMN .   &&
6da0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d   pExpr->iColumn=
6db0: 3d 70 2d 3e 69 43 6f 6c 20 0a 20 20 20 26 26 20  =p->iCol .   && 
6dc0: 70 2d 3e 70 54 61 62 3d 3d 70 45 78 70 72 2d 3e  p->pTab==pExpr->
6dd0: 79 2e 70 54 61 62 0a 20 20 29 7b 0a 20 20 20 20  y.pTab.  ){.    
6de0: 72 65 6e 61 6d 65 54 6f 6b 65 6e 46 69 6e 64 28  renameTokenFind(
6df0: 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 2c  pWalker->pParse,
6e00: 20 70 2c 20 28 76 6f 69 64 2a 29 70 45 78 70 72   p, (void*)pExpr
6e10: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
6e20: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
6e30: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 52 65 6e 61 6d  ./*.** The Renam
6e40: 65 43 74 78 20 63 6f 6e 74 61 69 6e 73 20 61 20  eCtx contains a 
6e50: 6c 69 73 74 20 6f 66 20 74 6f 6b 65 6e 73 20 74  list of tokens t
6e60: 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 61 20  hat reference a 
6e70: 63 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 69  column that.** i
6e80: 73 20 62 65 69 6e 67 20 72 65 6e 61 6d 65 64 20  s being renamed 
6e90: 62 79 20 61 6e 20 41 4c 54 45 52 20 54 41 42 4c  by an ALTER TABL
6ea0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65  E statement.  Re
6eb0: 74 75 72 6e 20 74 68 65 20 22 6c 61 73 74 22 0a  turn the "last".
6ec0: 2a 2a 20 52 65 6e 61 6d 65 54 6f 6b 65 6e 20 69  ** RenameToken i
6ed0: 6e 20 74 68 65 20 52 65 6e 61 6d 65 43 74 78 20  n the RenameCtx 
6ee0: 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 61 74 20  and remove that 
6ef0: 52 65 6e 61 6d 65 54 6f 6b 65 6e 20 66 72 6f 6d  RenameToken from
6f00: 20 74 68 65 0a 2a 2a 20 52 65 6e 61 6d 65 43 6f   the.** RenameCo
6f10: 6e 74 65 78 74 2e 20 20 22 4c 61 73 74 22 20 6d  ntext.  "Last" m
6f20: 65 61 6e 73 20 74 68 65 20 6c 61 73 74 20 52 65  eans the last Re
6f30: 6e 61 6d 65 54 6f 6b 65 6e 20 65 6e 63 6f 75 6e  nameToken encoun
6f40: 74 65 72 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68  tered when.** th
6f50: 65 20 69 6e 70 75 74 20 53 51 4c 20 69 73 20 70  e input SQL is p
6f60: 61 72 73 65 64 20 66 72 6f 6d 20 6c 65 66 74 20  arsed from left 
6f70: 74 6f 20 72 69 67 68 74 2e 20 20 52 65 70 65 61  to right.  Repea
6f80: 74 65 64 20 63 61 6c 6c 73 20 74 6f 20 74 68 69  ted calls to thi
6f90: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
6fa0: 75 72 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 6e  urn all column n
6fb0: 61 6d 65 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68  ame tokens in th
6fc0: 65 20 6f 72 64 65 72 20 74 68 61 74 20 74 68 65  e order that the
6fd0: 79 20 61 72 65 20 65 6e 63 6f 75 6e 74 65 72 65  y are encountere
6fe0: 64 0a 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 20  d.** in the SQL 
6ff0: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  statement..*/.st
7000: 61 74 69 63 20 52 65 6e 61 6d 65 54 6f 6b 65 6e  atic RenameToken
7010: 20 2a 72 65 6e 61 6d 65 43 6f 6c 75 6d 6e 54 6f   *renameColumnTo
7020: 6b 65 6e 4e 65 78 74 28 52 65 6e 61 6d 65 43 74  kenNext(RenameCt
7030: 78 20 2a 70 43 74 78 29 7b 0a 20 20 52 65 6e 61  x *pCtx){.  Rena
7040: 6d 65 54 6f 6b 65 6e 20 2a 70 42 65 73 74 20 3d  meToken *pBest =
7050: 20 70 43 74 78 2d 3e 70 4c 69 73 74 3b 0a 20 20   pCtx->pList;.  
7060: 52 65 6e 61 6d 65 54 6f 6b 65 6e 20 2a 70 54 6f  RenameToken *pTo
7070: 6b 65 6e 3b 0a 20 20 52 65 6e 61 6d 65 54 6f 6b  ken;.  RenameTok
7080: 65 6e 20 2a 2a 70 70 3b 0a 0a 20 20 66 6f 72 28  en **pp;..  for(
7090: 70 54 6f 6b 65 6e 3d 70 42 65 73 74 2d 3e 70 4e  pToken=pBest->pN
70a0: 65 78 74 3b 20 70 54 6f 6b 65 6e 3b 20 70 54 6f  ext; pToken; pTo
70b0: 6b 65 6e 3d 70 54 6f 6b 65 6e 2d 3e 70 4e 65 78  ken=pToken->pNex
70c0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 54 6f 6b  t){.    if( pTok
70d0: 65 6e 2d 3e 74 2e 7a 3e 70 42 65 73 74 2d 3e 74  en->t.z>pBest->t
70e0: 2e 7a 20 29 20 70 42 65 73 74 20 3d 20 70 54 6f  .z ) pBest = pTo
70f0: 6b 65 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70  ken;.  }.  for(p
7100: 70 3d 26 70 43 74 78 2d 3e 70 4c 69 73 74 3b 20  p=&pCtx->pList; 
7110: 2a 70 70 21 3d 70 42 65 73 74 3b 20 70 70 3d 26  *pp!=pBest; pp=&
7120: 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 3b 0a 20  (*pp)->pNext);. 
7130: 20 2a 70 70 20 3d 20 70 42 65 73 74 2d 3e 70 4e   *pp = pBest->pN
7140: 65 78 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20 70  ext;..  return p
7150: 42 65 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  Best;.}../*.** A
7160: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  n error occured 
7170: 77 68 69 6c 65 20 70 61 72 73 69 6e 67 20 6f 72  while parsing or
7180: 20 6f 74 68 65 72 77 69 73 65 20 70 72 6f 63 65   otherwise proce
7190: 73 73 69 6e 67 20 61 20 64 61 74 61 62 61 73 65  ssing a database
71a0: 0a 2a 2a 20 6f 62 6a 65 63 74 20 28 65 69 74 68  .** object (eith
71b0: 65 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  er pParse->pNewT
71c0: 61 62 6c 65 2c 20 70 4e 65 77 49 6e 64 65 78 20  able, pNewIndex 
71d0: 6f 72 20 70 4e 65 77 54 72 69 67 67 65 72 29 20  or pNewTrigger) 
71e0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 0a 2a 2a  as part of an.**
71f0: 20 41 4c 54 45 52 20 54 41 42 4c 45 20 52 45 4e   ALTER TABLE REN
7200: 41 4d 45 20 43 4f 4c 55 4d 4e 20 70 72 6f 67 72  AME COLUMN progr
7210: 61 6d 2e 20 54 68 65 20 65 72 72 6f 72 20 6d 65  am. The error me
7220: 73 73 61 67 65 20 65 6d 69 74 74 65 64 20 62 79  ssage emitted by
7230: 20 74 68 65 0a 2a 2a 20 73 75 62 2d 72 6f 75 74   the.** sub-rout
7240: 69 6e 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ine is currently
7250: 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 72 73   stored in pPars
7260: 65 2d 3e 7a 45 72 72 4d 73 67 2e 20 54 68 69 73  e->zErrMsg. This
7270: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 64 64   function.** add
7280: 73 20 63 6f 6e 74 65 78 74 20 74 6f 20 74 68 65  s context to the
7290: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61   error message a
72a0: 6e 64 20 74 68 65 6e 20 73 74 6f 72 65 73 20 69  nd then stores i
72b0: 74 20 69 6e 20 70 43 74 78 2e 0a 2a 2f 0a 73 74  t in pCtx..*/.st
72c0: 61 74 69 63 20 76 6f 69 64 20 72 65 6e 61 6d 65  atic void rename
72d0: 43 6f 6c 75 6d 6e 50 61 72 73 65 45 72 72 6f 72  ColumnParseError
72e0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
72f0: 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
7300: 74 20 62 50 6f 73 74 2c 0a 20 20 73 71 6c 69 74  t bPost,.  sqlit
7310: 65 33 5f 76 61 6c 75 65 20 2a 70 54 79 70 65 2c  e3_value *pType,
7320: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
7330: 20 2a 70 4f 62 6a 65 63 74 2c 0a 20 20 50 61 72   *pObject,.  Par
7340: 73 65 20 2a 70 50 61 72 73 65 0a 29 7b 0a 20 20  se *pParse.){.  
7350: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 20 3d  const char *zT =
7360: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
7370: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
7380: 28 70 54 79 70 65 29 3b 0a 20 20 63 6f 6e 73 74  (pType);.  const
7390: 20 63 68 61 72 20 2a 7a 4e 20 3d 20 28 63 6f 6e   char *zN = (con
73a0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
73b0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 4f 62 6a  _value_text(pObj
73c0: 65 63 74 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45  ect);.  char *zE
73d0: 72 72 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71  rr;..  zErr = sq
73e0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 65  lite3_mprintf("e
73f0: 72 72 6f 72 20 69 6e 20 25 73 20 25 73 25 73 3a  rror in %s %s%s:
7400: 20 25 73 22 2c 20 0a 20 20 20 20 20 20 7a 54 2c   %s", .      zT,
7410: 20 7a 4e 2c 20 28 62 50 6f 73 74 20 3f 20 22 20   zN, (bPost ? " 
7420: 61 66 74 65 72 20 72 65 6e 61 6d 65 22 20 3a 20  after rename" : 
7430: 22 22 29 2c 0a 20 20 20 20 20 20 70 50 61 72 73  ""),.      pPars
7440: 65 2d 3e 7a 45 72 72 4d 73 67 0a 20 20 29 3b 0a  e->zErrMsg.  );.
7450: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7460: 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 7a 45 72  _error(pCtx, zEr
7470: 72 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65  r, -1);.  sqlite
7480: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 7d 0a  3_free(zErr);.}.
7490: 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 65 61 63 68 20  ./*.** For each 
74a0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 74 68 65 20  name in the the 
74b0: 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 20  expression-list 
74c0: 70 45 4c 69 73 74 20 28 69 2e 65 2e 20 65 61 63  pEList (i.e. eac
74d0: 68 0a 2a 2a 20 70 45 4c 69 73 74 2d 3e 61 5b 69  h.** pEList->a[i
74e0: 5d 2e 7a 4e 61 6d 65 29 20 74 68 61 74 20 6d 61  ].zName) that ma
74f0: 74 63 68 65 73 20 74 68 65 20 73 74 72 69 6e 67  tches the string
7500: 20 69 6e 20 7a 4f 6c 64 2c 20 65 78 74 72 61 63   in zOld, extrac
7510: 74 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73  t the .** corres
7520: 70 6f 6e 64 69 6e 67 20 72 65 6e 61 6d 65 2d 74  ponding rename-t
7530: 6f 6b 65 6e 20 66 72 6f 6d 20 50 61 72 73 65 20  oken from Parse 
7540: 6f 62 6a 65 63 74 20 70 50 61 72 73 65 20 61 6e  object pParse an
7550: 64 20 61 64 64 20 69 74 0a 2a 2a 20 74 6f 20 74  d add it.** to t
7560: 68 65 20 52 65 6e 61 6d 65 43 74 78 20 70 43 74  he RenameCtx pCt
7570: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
7580: 64 20 72 65 6e 61 6d 65 43 6f 6c 75 6d 6e 45 6c  d renameColumnEl
7590: 69 73 74 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  istNames(.  Pars
75a0: 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 52 65  e *pParse, .  Re
75b0: 6e 61 6d 65 43 74 78 20 2a 70 43 74 78 2c 20 0a  nameCtx *pCtx, .
75c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
75d0: 73 74 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  st, .  const cha
75e0: 72 20 2a 7a 4f 6c 64 0a 29 7b 0a 20 20 69 66 28  r *zOld.){.  if(
75f0: 20 70 45 4c 69 73 74 20 29 7b 0a 20 20 20 20 69   pEList ){.    i
7600: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
7610: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
7620: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
7630: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 45  char *zName = pE
7640: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
7650: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  ;.      if( 0==s
7660: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
7670: 4e 61 6d 65 2c 20 7a 4f 6c 64 29 20 29 7b 0a 20  Name, zOld) ){. 
7680: 20 20 20 20 20 20 20 72 65 6e 61 6d 65 54 6f 6b         renameTok
7690: 65 6e 46 69 6e 64 28 70 50 61 72 73 65 2c 20 70  enFind(pParse, p
76a0: 43 74 78 2c 20 28 76 6f 69 64 2a 29 7a 4e 61 6d  Ctx, (void*)zNam
76b0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
76c0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
76d0: 6f 72 20 65 61 63 68 20 6e 61 6d 65 20 69 6e 20  or each name in 
76e0: 74 68 65 20 74 68 65 20 69 64 2d 6c 69 73 74 20  the the id-list 
76f0: 70 49 64 4c 69 73 74 20 28 69 2e 65 2e 20 65 61  pIdList (i.e. ea
7700: 63 68 20 70 49 64 4c 69 73 74 2d 3e 61 5b 69 5d  ch pIdList->a[i]
7710: 2e 7a 4e 61 6d 65 29 20 0a 2a 2a 20 74 68 61 74  .zName) .** that
7720: 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 74 72   matches the str
7730: 69 6e 67 20 69 6e 20 7a 4f 6c 64 2c 20 65 78 74  ing in zOld, ext
7740: 72 61 63 74 20 74 68 65 20 63 6f 72 72 65 73 70  ract the corresp
7750: 6f 6e 64 69 6e 67 20 72 65 6e 61 6d 65 2d 74 6f  onding rename-to
7760: 6b 65 6e 20 0a 2a 2a 20 66 72 6f 6d 20 50 61 72  ken .** from Par
7770: 73 65 20 6f 62 6a 65 63 74 20 70 50 61 72 73 65  se object pParse
7780: 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f 20 74   and add it to t
7790: 68 65 20 52 65 6e 61 6d 65 43 74 78 20 70 43 74  he RenameCtx pCt
77a0: 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
77b0: 64 20 72 65 6e 61 6d 65 43 6f 6c 75 6d 6e 49 64  d renameColumnId
77c0: 6c 69 73 74 4e 61 6d 65 73 28 0a 20 20 50 61 72  listNames(.  Par
77d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 52  se *pParse, .  R
77e0: 65 6e 61 6d 65 43 74 78 20 2a 70 43 74 78 2c 20  enameCtx *pCtx, 
77f0: 0a 20 20 49 64 4c 69 73 74 20 2a 70 49 64 4c 69  .  IdList *pIdLi
7800: 73 74 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  st, .  const cha
7810: 72 20 2a 7a 4f 6c 64 0a 29 7b 0a 20 20 69 66 28  r *zOld.){.  if(
7820: 20 70 49 64 4c 69 73 74 20 29 7b 0a 20 20 20 20   pIdList ){.    
7830: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
7840: 3d 30 3b 20 69 3c 70 49 64 4c 69 73 74 2d 3e 6e  =0; i<pIdList->n
7850: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; i++){.      
7860: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49  char *zName = pI
7870: 64 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  dList->a[i].zNam
7880: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  e;.      if( 0==
7890: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
78a0: 7a 4e 61 6d 65 2c 20 7a 4f 6c 64 29 20 29 7b 0a  zName, zOld) ){.
78b0: 20 20 20 20 20 20 20 20 72 65 6e 61 6d 65 54 6f          renameTo
78c0: 6b 65 6e 46 69 6e 64 28 70 50 61 72 73 65 2c 20  kenFind(pParse, 
78d0: 70 43 74 78 2c 20 28 76 6f 69 64 2a 29 7a 4e 61  pCtx, (void*)zNa
78e0: 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
78f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
7900: 50 61 72 73 65 20 74 68 65 20 53 51 4c 20 73 74  Parse the SQL st
7910: 61 74 65 6d 65 6e 74 20 7a 53 71 6c 20 75 73 69  atement zSql usi
7920: 6e 67 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  ng Parse object 
7930: 28 2a 70 29 2e 20 54 68 65 20 50 61 72 73 65 20  (*p). The Parse 
7940: 6f 62 6a 65 63 74 0a 2a 2a 20 69 73 20 69 6e 69  object.** is ini
7950: 74 69 61 6c 69 7a 65 64 20 62 79 20 74 68 69 73  tialized by this
7960: 20 66 75 6e 63 74 69 6f 6e 20 62 65 66 6f 72 65   function before
7970: 20 69 74 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a   it is used..*/.
7980: 73 74 61 74 69 63 20 69 6e 74 20 72 65 6e 61 6d  static int renam
7990: 65 50 61 72 73 65 53 71 6c 28 0a 20 20 50 61 72  eParseSql(.  Par
79a0: 73 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  se *p,          
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
79c0: 4d 65 6d 6f 72 79 20 74 6f 20 75 73 65 20 66 6f  Memory to use fo
79d0: 72 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 2a  r Parse object *
79e0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
79f0: 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  zDb,            
7a00: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73      /* Name of s
7a10: 63 68 65 6d 61 20 53 51 4c 20 62 65 6c 6f 6e 67  chema SQL belong
7a20: 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 62 54  s to */.  int bT
7a30: 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
7a40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2d            /* 1 -
7a50: 3e 20 52 45 4e 41 4d 45 20 54 41 42 4c 45 2c 20  > RENAME TABLE, 
7a60: 30 20 2d 3e 20 52 45 4e 41 4d 45 20 43 4f 4c 55  0 -> RENAME COLU
7a70: 4d 4e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  MN */.  sqlite3 
7a80: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
7a90: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
7aa0: 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
7ab0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
7ac0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7ad0: 2f 2a 20 53 51 4c 20 74 6f 20 70 61 72 73 65 20  /* SQL to parse 
7ae0: 2a 2f 0a 20 20 69 6e 74 20 62 54 65 6d 70 20 20  */.  int bTemp  
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b00: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
7b10: 53 51 4c 20 69 73 20 66 72 6f 6d 20 74 65 6d 70  SQL is from temp
7b20: 20 73 63 68 65 6d 61 20 2a 2f 0a 29 7b 0a 20 20   schema */.){.  
7b30: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
7b40: 7a 45 72 72 20 3d 20 30 3b 0a 0a 20 20 64 62 2d  zErr = 0;..  db-
7b50: 3e 69 6e 69 74 2e 69 44 62 20 3d 20 62 54 65 6d  >init.iDb = bTem
7b60: 70 20 3f 20 31 20 3a 20 73 71 6c 69 74 65 33 46  p ? 1 : sqlite3F
7b70: 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44  indDbName(db, zD
7b80: 62 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20  b);..  /* Parse 
7b90: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
7ba0: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
7bb0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
7bc0: 49 66 20 6e 6f 20 65 72 72 6f 72 0a 20 20 2a 2a  If no error.  **
7bd0: 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
7be0: 70 61 72 73 65 20 64 6f 65 73 20 6e 6f 74 20 72  parse does not r
7bf0: 65 73 75 6c 74 20 69 6e 20 61 20 6e 65 77 20 74  esult in a new t
7c00: 61 62 6c 65 2c 20 69 6e 64 65 78 20 6f 72 0a 20  able, index or. 
7c10: 20 2a 2a 20 74 72 69 67 67 65 72 20 6f 62 6a 65   ** trigger obje
7c20: 63 74 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ct, the database
7c30: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74   must be corrupt
7c40: 2e 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 2c  . */.  memset(p,
7c50: 20 30 2c 20 73 69 7a 65 6f 66 28 50 61 72 73 65   0, sizeof(Parse
7c60: 29 29 3b 0a 20 20 70 2d 3e 65 50 61 72 73 65 4d  ));.  p->eParseM
7c70: 6f 64 65 20 3d 20 28 62 54 61 62 6c 65 20 3f 20  ode = (bTable ? 
7c80: 50 41 52 53 45 5f 4d 4f 44 45 5f 52 45 4e 41 4d  PARSE_MODE_RENAM
7c90: 45 5f 54 41 42 4c 45 20 3a 20 50 41 52 53 45 5f  E_TABLE : PARSE_
7ca0: 4d 4f 44 45 5f 52 45 4e 41 4d 45 5f 43 4f 4c 55  MODE_RENAME_COLU
7cb0: 4d 4e 29 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  MN);.  p->db = d
7cc0: 62 3b 0a 20 20 70 2d 3e 6e 51 75 65 72 79 4c 6f  b;.  p->nQueryLo
7cd0: 6f 70 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73  op = 1;.  rc = s
7ce0: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
7cf0: 70 2c 20 7a 53 71 6c 2c 20 26 7a 45 72 72 29 3b  p, zSql, &zErr);
7d00: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a 45  .  assert( p->zE
7d10: 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 20 20 61 73  rrMsg==0 );.  as
7d20: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
7d30: 5f 4f 4b 20 7c 7c 20 7a 45 72 72 3d 3d 30 20 29  _OK || zErr==0 )
7d40: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
7d50: 20 7a 45 72 72 3b 0a 20 20 69 66 28 20 64 62 2d   zErr;.  if( db-
7d60: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
7d70: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
7d80: 4d 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  M;.  if( rc==SQL
7d90: 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 70 2d  ITE_OK .   && p-
7da0: 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20 26 26  >pNewTable==0 &&
7db0: 20 70 2d 3e 70 4e 65 77 49 6e 64 65 78 3d 3d 30   p->pNewIndex==0
7dc0: 20 26 26 20 70 2d 3e 70 4e 65 77 54 72 69 67 67   && p->pNewTrigg
7dd0: 65 72 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20  er==0 .  ){.    
7de0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
7df0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 23  UPT_BKPT;.  }..#
7e00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
7e10: 55 47 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74  UG.  /* Ensure t
7e20: 68 61 74 20 61 6c 6c 20 6d 61 70 70 69 6e 67 73  hat all mappings
7e30: 20 69 6e 20 74 68 65 20 50 61 72 73 65 2e 70 52   in the Parse.pR
7e40: 65 6e 61 6d 65 20 6c 69 73 74 20 72 65 61 6c 6c  ename list reall
7e50: 79 20 64 6f 20 6d 61 70 20 74 6f 0a 20 20 2a 2a  y do map to.  **
7e60: 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 69   a part of the i
7e70: 6e 70 75 74 20 73 74 72 69 6e 67 2e 20 20 2a 2f  nput string.  */
7e80: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7e90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
7ea0: 6e 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 53 74  nSql = sqlite3St
7eb0: 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20  rlen30(zSql);.  
7ec0: 20 20 52 65 6e 61 6d 65 54 6f 6b 65 6e 20 2a 70    RenameToken *p
7ed0: 54 6f 6b 65 6e 3b 0a 20 20 20 20 66 6f 72 28 70  Token;.    for(p
7ee0: 54 6f 6b 65 6e 3d 70 2d 3e 70 52 65 6e 61 6d 65  Token=p->pRename
7ef0: 3b 20 70 54 6f 6b 65 6e 3b 20 70 54 6f 6b 65 6e  ; pToken; pToken
7f00: 3d 70 54 6f 6b 65 6e 2d 3e 70 4e 65 78 74 29 7b  =pToken->pNext){
7f10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
7f20: 54 6f 6b 65 6e 2d 3e 74 2e 7a 3e 3d 7a 53 71 6c  Token->t.z>=zSql
7f30: 20 26 26 20 26 70 54 6f 6b 65 6e 2d 3e 74 2e 7a   && &pToken->t.z
7f40: 5b 70 54 6f 6b 65 6e 2d 3e 74 2e 6e 5d 3c 3d 26  [pToken->t.n]<=&
7f50: 7a 53 71 6c 5b 6e 53 71 6c 5d 20 29 3b 0a 20 20  zSql[nSql] );.  
7f60: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
7f70: 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d    db->init.iDb =
7f80: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
7f90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
7fa0: 75 6e 63 74 69 6f 6e 20 65 64 69 74 73 20 53 51  unction edits SQ
7fb0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 7a 53 71 6c  L statement zSql
7fc0: 2c 20 72 65 70 6c 61 63 69 6e 67 20 65 61 63 68  , replacing each
7fd0: 20 74 6f 6b 65 6e 20 69 64 65 6e 74 69 66 69 65   token identifie
7fe0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 6c 69 6e 6b  d.** by the link
7ff0: 65 64 20 6c 69 73 74 20 70 52 65 6e 61 6d 65 20  ed list pRename 
8000: 77 69 74 68 20 74 68 65 20 74 65 78 74 20 6f 66  with the text of
8010: 20 7a 4e 65 77 2e 20 49 66 20 61 72 67 75 6d 65   zNew. If argume
8020: 6e 74 20 62 51 75 6f 74 65 20 69 73 0a 2a 2a 20  nt bQuote is.** 
8030: 74 72 75 65 2c 20 74 68 65 6e 20 7a 4e 65 77 20  true, then zNew 
8040: 69 73 20 61 6c 77 61 79 73 20 71 75 6f 74 65 64  is always quoted
8050: 20 66 69 72 73 74 2e 20 49 66 20 6e 6f 20 65 72   first. If no er
8060: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
8070: 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6c 6f 61  result.** is loa
8080: 64 65 64 20 69 6e 74 6f 20 63 6f 6e 74 65 78 74  ded into context
8090: 20 6f 62 6a 65 63 74 20 70 43 74 78 20 61 73 20   object pCtx as 
80a0: 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a  the result..**.*
80b0: 2a 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  * Or, if an erro
80c0: 72 20 6f 63 63 75 72 73 20 28 69 2e 65 2e 20 61  r occurs (i.e. a
80d0: 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 29  n OOM condition)
80e0: 2c 20 61 6e 20 65 72 72 6f 72 20 69 73 20 6c 65  , an error is le
80f0: 66 74 20 69 6e 0a 2a 2a 20 70 43 74 78 20 61 6e  ft in.** pCtx an
8100: 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  d an SQLite erro
8110: 72 20 63 6f 64 65 20 72 65 74 75 72 6e 65 64 2e  r code returned.
8120: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
8130: 65 6e 61 6d 65 45 64 69 74 53 71 6c 28 0a 20 20  enameEditSql(.  
8140: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8150: 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20  *pCtx,          
8160: 2f 2a 20 52 65 74 75 72 6e 20 72 65 73 75 6c 74  /* Return result
8170: 20 68 65 72 65 20 2a 2f 0a 20 20 52 65 6e 61 6d   here */.  Renam
8180: 65 43 74 78 20 2a 70 52 65 6e 61 6d 65 2c 20 20  eCtx *pRename,  
8190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
81a0: 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  name context */.
81b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
81c0: 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ql,             
81d0: 20 20 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65    /* SQL stateme
81e0: 6e 74 20 74 6f 20 65 64 69 74 20 2a 2f 0a 20 20  nt to edit */.  
81f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77  const char *zNew
8200: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8210: 2f 2a 20 4e 65 77 20 74 6f 6b 65 6e 20 74 65 78  /* New token tex
8220: 74 20 2a 2f 0a 20 20 69 6e 74 20 62 51 75 6f 74  t */.  int bQuot
8230: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
8240: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
8250: 6f 20 61 6c 77 61 79 73 20 71 75 6f 74 65 20 74  o always quote t
8260: 6f 6b 65 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  oken */.){.  int
8270: 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53   nNew = sqlite3S
8280: 74 72 6c 65 6e 33 30 28 7a 4e 65 77 29 3b 0a 20  trlen30(zNew);. 
8290: 20 69 6e 74 20 6e 53 71 6c 20 3d 20 73 71 6c 69   int nSql = sqli
82a0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 71 6c  te3Strlen30(zSql
82b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  );.  sqlite3 *db
82c0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
82d0: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74  xt_db_handle(pCt
82e0: 78 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  x);.  int rc = S
82f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72  QLITE_OK;.  char
8300: 20 2a 7a 51 75 6f 74 3b 0a 20 20 63 68 61 72 20   *zQuot;.  char 
8310: 2a 7a 4f 75 74 3b 0a 20 20 69 6e 74 20 6e 51 75  *zOut;.  int nQu
8320: 6f 74 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 7a 51  ot;..  /* Set zQ
8330: 75 6f 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  uot to point to 
8340: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
8350: 69 6e 67 20 61 20 71 75 6f 74 65 64 20 63 6f 70  ing a quoted cop
8360: 79 20 6f 66 20 74 68 65 20 0a 20 20 2a 2a 20 69  y of the .  ** i
8370: 64 65 6e 74 69 66 69 65 72 20 7a 4e 65 77 2e 20  dentifier zNew. 
8380: 49 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  If the correspon
8390: 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 72 20  ding identifier 
83a0: 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  in the original 
83b0: 0a 20 20 2a 2a 20 41 4c 54 45 52 20 54 41 42 4c  .  ** ALTER TABL
83c0: 45 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  E statement was 
83d0: 71 75 6f 74 65 64 20 28 62 51 75 6f 74 65 3d 3d  quoted (bQuote==
83e0: 31 29 2c 20 74 68 65 6e 20 73 65 74 20 7a 4e 65  1), then set zNe
83f0: 77 20 74 6f 0a 20 20 2a 2a 20 70 6f 69 6e 74 20  w to.  ** point 
8400: 74 6f 20 7a 51 75 6f 74 20 73 6f 20 74 68 61 74  to zQuot so that
8410: 20 61 6c 6c 20 73 75 62 73 74 69 74 75 74 69 6f   all substitutio
8420: 6e 73 20 61 72 65 20 6d 61 64 65 20 75 73 69 6e  ns are made usin
8430: 67 20 74 68 65 0a 20 20 2a 2a 20 71 75 6f 74 65  g the.  ** quote
8440: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  d version of the
8450: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   new column name
8460: 2e 20 20 2a 2f 0a 20 20 7a 51 75 6f 74 20 3d 20  .  */.  zQuot = 
8470: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
8480: 62 2c 20 22 5c 22 25 77 5c 22 22 2c 20 7a 4e 65  b, "\"%w\"", zNe
8490: 77 29 3b 0a 20 20 69 66 28 20 7a 51 75 6f 74 3d  w);.  if( zQuot=
84a0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
84b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
84c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 51 75 6f   }else{.    nQuo
84d0: 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  t = sqlite3Strle
84e0: 6e 33 30 28 7a 51 75 6f 74 29 3b 0a 20 20 7d 0a  n30(zQuot);.  }.
84f0: 20 20 69 66 28 20 62 51 75 6f 74 65 20 29 7b 0a    if( bQuote ){.
8500: 20 20 20 20 7a 4e 65 77 20 3d 20 7a 51 75 6f 74      zNew = zQuot
8510: 3b 0a 20 20 20 20 6e 4e 65 77 20 3d 20 6e 51 75  ;.    nNew = nQu
8520: 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74  ot;.  }..  /* At
8530: 20 74 68 69 73 20 70 6f 69 6e 74 20 70 52 65 6e   this point pRen
8540: 61 6d 65 2d 3e 70 4c 69 73 74 20 63 6f 6e 74 61  ame->pList conta
8550: 69 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 52 65  ins a list of Re
8560: 6e 61 6d 65 54 6f 6b 65 6e 20 6f 62 6a 65 63 74  nameToken object
8570: 73 0a 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  s.  ** correspon
8580: 64 69 6e 67 20 74 6f 20 61 6c 6c 20 74 6f 6b 65  ding to all toke
8590: 6e 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20  ns in the input 
85a0: 53 51 4c 20 74 68 61 74 20 6d 75 73 74 20 62 65  SQL that must be
85b0: 20 72 65 70 6c 61 63 65 64 0a 20 20 2a 2a 20 77   replaced.  ** w
85c0: 69 74 68 20 74 68 65 20 6e 65 77 20 63 6f 6c 75  ith the new colu
85d0: 6d 6e 20 6e 61 6d 65 2e 20 41 6c 6c 20 74 68 61  mn name. All tha
85e0: 74 20 72 65 6d 61 69 6e 73 20 69 73 20 74 6f 20  t remains is to 
85f0: 63 6f 6e 73 74 72 75 63 74 20 61 6e 64 0a 20 20  construct and.  
8600: 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 65 64  ** return the ed
8610: 69 74 65 64 20 53 51 4c 20 73 74 72 69 6e 67 2e  ited SQL string.
8620: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 51   */.  assert( nQ
8630: 75 6f 74 3e 3d 6e 4e 65 77 20 29 3b 0a 20 20 7a  uot>=nNew );.  z
8640: 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  Out = sqlite3DbM
8650: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 53  allocZero(db, nS
8660: 71 6c 20 2b 20 70 52 65 6e 61 6d 65 2d 3e 6e 4c  ql + pRename->nL
8670: 69 73 74 2a 6e 51 75 6f 74 20 2b 20 31 29 3b 0a  ist*nQuot + 1);.
8680: 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20    if( zOut ){.  
8690: 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 6e 53 71    int nOut = nSq
86a0: 6c 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 4f  l;.    memcpy(zO
86b0: 75 74 2c 20 7a 53 71 6c 2c 20 6e 53 71 6c 29 3b  ut, zSql, nSql);
86c0: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 52 65 6e  .    while( pRen
86d0: 61 6d 65 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  ame->pList ){.  
86e0: 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20      int iOff;   
86f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8700: 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 74 6f 6b  /* Offset of tok
8710: 65 6e 20 74 6f 20 72 65 70 6c 61 63 65 20 69 6e  en to replace in
8720: 20 7a 4f 75 74 20 2a 2f 0a 20 20 20 20 20 20 52   zOut */.      R
8730: 65 6e 61 6d 65 54 6f 6b 65 6e 20 2a 70 42 65 73  enameToken *pBes
8740: 74 20 3d 20 72 65 6e 61 6d 65 43 6f 6c 75 6d 6e  t = renameColumn
8750: 54 6f 6b 65 6e 4e 65 78 74 28 70 52 65 6e 61 6d  TokenNext(pRenam
8760: 65 29 3b 0a 0a 20 20 20 20 20 20 75 33 32 20 6e  e);..      u32 n
8770: 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 20 20 63  Replace;.      c
8780: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 70 6c  onst char *zRepl
8790: 61 63 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ace;.      if( s
87a0: 71 6c 69 74 65 33 49 73 49 64 43 68 61 72 28 2a  qlite3IsIdChar(*
87b0: 70 42 65 73 74 2d 3e 74 2e 7a 29 20 29 7b 0a 20  pBest->t.z) ){. 
87c0: 20 20 20 20 20 20 20 6e 52 65 70 6c 61 63 65 20         nReplace 
87d0: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = nNew;.        
87e0: 7a 52 65 70 6c 61 63 65 20 3d 20 7a 4e 65 77 3b  zReplace = zNew;
87f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8800: 20 20 20 20 20 20 6e 52 65 70 6c 61 63 65 20 3d        nReplace =
8810: 20 6e 51 75 6f 74 3b 0a 20 20 20 20 20 20 20 20   nQuot;.        
8820: 7a 52 65 70 6c 61 63 65 20 3d 20 7a 51 75 6f 74  zReplace = zQuot
8830: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
8840: 20 69 4f 66 66 20 3d 20 70 42 65 73 74 2d 3e 74   iOff = pBest->t
8850: 2e 7a 20 2d 20 7a 53 71 6c 3b 0a 20 20 20 20 20  .z - zSql;.     
8860: 20 69 66 28 20 70 42 65 73 74 2d 3e 74 2e 6e 21   if( pBest->t.n!
8870: 3d 6e 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20  =nReplace ){.   
8880: 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 7a 4f       memmove(&zO
8890: 75 74 5b 69 4f 66 66 20 2b 20 6e 52 65 70 6c 61  ut[iOff + nRepla
88a0: 63 65 5d 2c 20 26 7a 4f 75 74 5b 69 4f 66 66 20  ce], &zOut[iOff 
88b0: 2b 20 70 42 65 73 74 2d 3e 74 2e 6e 5d 2c 20 0a  + pBest->t.n], .
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74              nOut
88d0: 20 2d 20 28 69 4f 66 66 20 2b 20 70 42 65 73 74   - (iOff + pBest
88e0: 2d 3e 74 2e 6e 29 0a 20 20 20 20 20 20 20 20 29  ->t.n).        )
88f0: 3b 0a 20 20 20 20 20 20 20 20 6e 4f 75 74 20 2b  ;.        nOut +
8900: 3d 20 6e 52 65 70 6c 61 63 65 20 2d 20 70 42 65  = nReplace - pBe
8910: 73 74 2d 3e 74 2e 6e 3b 0a 20 20 20 20 20 20 20  st->t.n;.       
8920: 20 7a 4f 75 74 5b 6e 4f 75 74 5d 20 3d 20 27 5c   zOut[nOut] = '\
8930: 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0';.      }.    
8940: 20 20 6d 65 6d 63 70 79 28 26 7a 4f 75 74 5b 69    memcpy(&zOut[i
8950: 4f 66 66 5d 2c 20 7a 52 65 70 6c 61 63 65 2c 20  Off], zReplace, 
8960: 6e 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 20  nReplace);.     
8970: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8980: 62 2c 20 70 42 65 73 74 29 3b 0a 20 20 20 20 7d  b, pBest);.    }
8990: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  ..    sqlite3_re
89a0: 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20  sult_text(pCtx, 
89b0: 7a 4f 75 74 2c 20 2d 31 2c 20 53 51 4c 49 54 45  zOut, -1, SQLITE
89c0: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
89d0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
89e0: 62 2c 20 7a 4f 75 74 29 3b 0a 20 20 7d 65 6c 73  b, zOut);.  }els
89f0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
8a00: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
8a10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
8a20: 75 6f 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  uot);.  return r
8a30: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f  c;.}../*.** Reso
8a40: 6c 76 65 20 61 6c 6c 20 73 79 6d 62 6f 6c 73 20  lve all symbols 
8a50: 69 6e 20 74 68 65 20 74 72 69 67 67 65 72 20 61  in the trigger a
8a60: 74 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72  t pParse->pNewTr
8a70: 69 67 67 65 72 2c 20 61 73 73 75 6d 69 6e 67 0a  igger, assuming.
8a80: 2a 2a 20 69 74 20 77 61 73 20 72 65 61 64 20 66  ** it was read f
8a90: 72 6f 6d 20 74 68 65 20 73 63 68 65 6d 61 20 6f  rom the schema o
8aa0: 66 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20  f database zDb. 
8ab0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
8ac0: 20 69 66 20 0a 2a 2a 20 73 75 63 63 65 73 73 66   if .** successf
8ad0: 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 72  ul. Otherwise, r
8ae0: 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
8af0: 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 6c  error code and l
8b00: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  eave an error.**
8b10: 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68 65 20   message in the 
8b20: 50 61 72 73 65 20 6f 62 6a 65 63 74 2e 0a 2a 2f  Parse object..*/
8b30: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6e 61  .static int rena
8b40: 6d 65 52 65 73 6f 6c 76 65 54 72 69 67 67 65 72  meResolveTrigger
8b50: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
8b60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29  const char *zDb)
8b70: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
8b80: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
8b90: 54 72 69 67 67 65 72 20 2a 70 4e 65 77 20 3d 20  Trigger *pNew = 
8ba0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 72 69 67  pParse->pNewTrig
8bb0: 67 65 72 3b 0a 20 20 54 72 69 67 67 65 72 53 74  ger;.  TriggerSt
8bc0: 65 70 20 2a 70 53 74 65 70 3b 0a 20 20 4e 61 6d  ep *pStep;.  Nam
8bd0: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a 20 20  eContext sNC;.  
8be0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
8bf0: 4f 4b 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73  OK;..  memset(&s
8c00: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
8c10: 43 29 29 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73  C));.  sNC.pPars
8c20: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 61 73  e = pParse;.  as
8c30: 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 54 61 62  sert( pNew->pTab
8c40: 53 63 68 65 6d 61 20 29 3b 0a 20 20 70 50 61 72  Schema );.  pPar
8c50: 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 20  se->pTriggerTab 
8c60: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
8c70: 6c 65 28 64 62 2c 20 70 4e 65 77 2d 3e 74 61 62  le(db, pNew->tab
8c80: 6c 65 2c 20 0a 20 20 20 20 20 20 64 62 2d 3e 61  le, .      db->a
8c90: 44 62 5b 73 71 6c 69 74 65 33 53 63 68 65 6d 61  Db[sqlite3Schema
8ca0: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 4e 65 77  ToIndex(db, pNew
8cb0: 2d 3e 70 54 61 62 53 63 68 65 6d 61 29 5d 2e 7a  ->pTabSchema)].z
8cc0: 44 62 53 4e 61 6d 65 0a 20 20 29 3b 0a 20 20 70  DbSName.  );.  p
8cd0: 50 61 72 73 65 2d 3e 65 54 72 69 67 67 65 72 4f  Parse->eTriggerO
8ce0: 70 20 3d 20 70 4e 65 77 2d 3e 6f 70 3b 0a 20 20  p = pNew->op;.  
8cf0: 2f 2a 20 41 4c 57 41 59 53 28 29 20 62 65 63 61  /* ALWAYS() beca
8d00: 75 73 65 20 69 66 20 74 68 65 20 74 61 62 6c 65  use if the table
8d10: 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72 20   of the trigger 
8d20: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
8d30: 74 68 65 0a 20 20 2a 2a 20 65 72 72 6f 72 20 77  the.  ** error w
8d40: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 68  ould have been h
8d50: 69 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 70  it before this p
8d60: 6f 69 6e 74 20 2a 2f 0a 20 20 69 66 28 20 41 4c  oint */.  if( AL
8d70: 57 41 59 53 28 70 50 61 72 73 65 2d 3e 70 54 72  WAYS(pParse->pTr
8d80: 69 67 67 65 72 54 61 62 29 20 29 7b 0a 20 20 20  iggerTab) ){.   
8d90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 69 65   rc = sqlite3Vie
8da0: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
8db0: 70 50 61 72 73 65 2c 20 70 50 61 72 73 65 2d 3e  pParse, pParse->
8dc0: 70 54 72 69 67 67 65 72 54 61 62 29 3b 0a 20 20  pTriggerTab);.  
8dd0: 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  }..  /* Resolve 
8de0: 73 79 6d 62 6f 6c 73 20 69 6e 20 57 48 45 4e 20  symbols in WHEN 
8df0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
8e00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
8e10: 20 70 4e 65 77 2d 3e 70 57 68 65 6e 20 29 7b 0a   pNew->pWhen ){.
8e20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8e30: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
8e40: 28 26 73 4e 43 2c 20 70 4e 65 77 2d 3e 70 57 68  (&sNC, pNew->pWh
8e50: 65 6e 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  en);.  }..  for(
8e60: 70 53 74 65 70 3d 70 4e 65 77 2d 3e 73 74 65 70  pStep=pNew->step
8e70: 5f 6c 69 73 74 3b 20 72 63 3d 3d 53 51 4c 49 54  _list; rc==SQLIT
8e80: 45 5f 4f 4b 20 26 26 20 70 53 74 65 70 3b 20 70  E_OK && pStep; p
8e90: 53 74 65 70 3d 70 53 74 65 70 2d 3e 70 4e 65 78  Step=pStep->pNex
8ea0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 53 74 65  t){.    if( pSte
8eb0: 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  p->pSelect ){.  
8ec0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
8ed0: 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 53  tPrep(pParse, pS
8ee0: 74 65 70 2d 3e 70 53 65 6c 65 63 74 2c 20 26 73  tep->pSelect, &s
8ef0: 4e 43 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  NC);.      if( p
8f00: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 63  Parse->nErr ) rc
8f10: 20 3d 20 70 50 61 72 73 65 2d 3e 72 63 3b 0a 20   = pParse->rc;. 
8f20: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
8f30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53  =SQLITE_OK && pS
8f40: 74 65 70 2d 3e 7a 54 61 72 67 65 74 20 29 7b 0a  tep->zTarget ){.
8f50: 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
8f60: 72 67 65 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rget = sqlite3Lo
8f70: 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65  cateTable(pParse
8f80: 2c 20 30 2c 20 70 53 74 65 70 2d 3e 7a 54 61 72  , 0, pStep->zTar
8f90: 67 65 74 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20  get, zDb);.     
8fa0: 20 69 66 28 20 70 54 61 72 67 65 74 3d 3d 30 20   if( pTarget==0 
8fb0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
8fc0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
8fd0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53 51      }else if( SQ
8fe0: 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
8ff0: 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
9000: 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  umnNames(pParse,
9010: 20 70 54 61 72 67 65 74 29 29 20 29 7b 0a 20 20   pTarget)) ){.  
9020: 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 73 53        SrcList sS
9030: 72 63 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  rc;.        mems
9040: 65 74 28 26 73 53 72 63 2c 20 30 2c 20 73 69 7a  et(&sSrc, 0, siz
9050: 65 6f 66 28 73 53 72 63 29 29 3b 0a 20 20 20 20  eof(sSrc));.    
9060: 20 20 20 20 73 53 72 63 2e 6e 53 72 63 20 3d 20      sSrc.nSrc = 
9070: 31 3b 0a 20 20 20 20 20 20 20 20 73 53 72 63 2e  1;.        sSrc.
9080: 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 53 74  a[0].zName = pSt
9090: 65 70 2d 3e 7a 54 61 72 67 65 74 3b 0a 20 20 20  ep->zTarget;.   
90a0: 20 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70       sSrc.a[0].p
90b0: 54 61 62 20 3d 20 70 54 61 72 67 65 74 3b 0a 20  Tab = pTarget;. 
90c0: 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72 63 4c         sNC.pSrcL
90d0: 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20 20 20  ist = &sSrc;.   
90e0: 20 20 20 20 20 69 66 28 20 70 53 74 65 70 2d 3e       if( pStep->
90f0: 70 57 68 65 72 65 20 29 7b 0a 20 20 20 20 20 20  pWhere ){.      
9100: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9110: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
9120: 28 26 73 4e 43 2c 20 70 53 74 65 70 2d 3e 70 57  (&sNC, pStep->pW
9130: 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  here);.        }
9140: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
9150: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9160: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
9170: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4c  ite3ResolveExprL
9180: 69 73 74 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  istNames(&sNC, p
9190: 53 74 65 70 2d 3e 70 45 78 70 72 4c 69 73 74 29  Step->pExprList)
91a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
91b0: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 53 74      assert( !pSt
91c0: 65 70 2d 3e 70 55 70 73 65 72 74 20 7c 7c 20 28  ep->pUpsert || (
91d0: 21 70 53 74 65 70 2d 3e 70 57 68 65 72 65 20 26  !pStep->pWhere &
91e0: 26 20 21 70 53 74 65 70 2d 3e 70 45 78 70 72 4c  & !pStep->pExprL
91f0: 69 73 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ist) );.        
9200: 69 66 28 20 70 53 74 65 70 2d 3e 70 55 70 73 65  if( pStep->pUpse
9210: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rt ){.          
9220: 55 70 73 65 72 74 20 2a 70 55 70 73 65 72 74 20  Upsert *pUpsert 
9230: 3d 20 70 53 74 65 70 2d 3e 70 55 70 73 65 72 74  = pStep->pUpsert
9240: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
9250: 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
9260: 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  K );.          p
9270: 55 70 73 65 72 74 2d 3e 70 55 70 73 65 72 74 53  Upsert->pUpsertS
9280: 72 63 20 3d 20 26 73 53 72 63 3b 0a 20 20 20 20  rc = &sSrc;.    
9290: 20 20 20 20 20 20 73 4e 43 2e 75 4e 43 2e 70 55        sNC.uNC.pU
92a0: 70 73 65 72 74 20 3d 20 70 55 70 73 65 72 74 3b  psert = pUpsert;
92b0: 0a 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 6e  .          sNC.n
92c0: 63 46 6c 61 67 73 20 3d 20 4e 43 5f 55 55 70 73  cFlags = NC_UUps
92d0: 65 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ert;.          r
92e0: 63 20 3d 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  c = sqlite3Resol
92f0: 76 65 45 78 70 72 4c 69 73 74 4e 61 6d 65 73 28  veExprListNames(
9300: 26 73 4e 43 2c 20 70 55 70 73 65 72 74 2d 3e 70  &sNC, pUpsert->p
9310: 55 70 73 65 72 74 54 61 72 67 65 74 29 3b 0a 20  UpsertTarget);. 
9320: 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
9330: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9340: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69            ExprLi
9350: 73 74 20 2a 70 55 70 73 65 72 74 53 65 74 20 3d  st *pUpsertSet =
9360: 20 70 55 70 73 65 72 74 2d 3e 70 55 70 73 65 72   pUpsert->pUpser
9370: 74 53 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tSet;.          
9380: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 65    rc = sqlite3Re
9390: 73 6f 6c 76 65 45 78 70 72 4c 69 73 74 4e 61 6d  solveExprListNam
93a0: 65 73 28 26 73 4e 43 2c 20 70 55 70 73 65 72 74  es(&sNC, pUpsert
93b0: 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Set);.          
93c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
93d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
93e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
93f0: 3d 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  = sqlite3Resolve
9400: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
9410: 70 55 70 73 65 72 74 2d 3e 70 55 70 73 65 72 74  pUpsert->pUpsert
9420: 57 68 65 72 65 29 3b 0a 20 20 20 20 20 20 20 20  Where);.        
9430: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
9440: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
9450: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
9460: 63 20 3d 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  c = sqlite3Resol
9470: 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43  veExprNames(&sNC
9480: 2c 20 70 55 70 73 65 72 74 2d 3e 70 55 70 73 65  , pUpsert->pUpse
9490: 72 74 54 61 72 67 65 74 57 68 65 72 65 29 3b 0a  rtTargetWhere);.
94a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
94b0: 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
94c0: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  s = 0;.        }
94d0: 0a 20 20 20 20 20 20 20 20 73 4e 43 2e 70 53 72  .        sNC.pSr
94e0: 63 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  cList = 0;.     
94f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
9500: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
9510: 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ** Invoke sqlite
9520: 33 57 61 6c 6b 45 78 70 72 28 29 20 6f 72 20 73  3WalkExpr() or s
9530: 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
9540: 28 29 20 6f 6e 20 61 6c 6c 20 53 65 6c 65 63 74  () on all Select
9550: 20 6f 72 20 45 78 70 72 0a 2a 2a 20 6f 62 6a 65   or Expr.** obje
9560: 63 74 73 20 74 68 61 74 20 61 72 65 20 70 61 72  cts that are par
9570: 74 20 6f 66 20 74 68 65 20 74 72 69 67 67 65 72  t of the trigger
9580: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
9590: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
95a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
95b0: 65 6e 61 6d 65 57 61 6c 6b 54 72 69 67 67 65 72  enameWalkTrigger
95c0: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
95d0: 2c 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67  , Trigger *pTrig
95e0: 67 65 72 29 7b 0a 20 20 54 72 69 67 67 65 72 53  ger){.  TriggerS
95f0: 74 65 70 20 2a 70 53 74 65 70 3b 0a 0a 20 20 2f  tep *pStep;..  /
9600: 2a 20 46 69 6e 64 20 74 6f 6b 65 6e 73 20 74 6f  * Find tokens to
9610: 20 65 64 69 74 20 69 6e 20 57 48 45 4e 20 63 6c   edit in WHEN cl
9620: 61 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ause */.  sqlite
9630: 33 57 61 6c 6b 45 78 70 72 28 70 57 61 6c 6b 65  3WalkExpr(pWalke
9640: 72 2c 20 70 54 72 69 67 67 65 72 2d 3e 70 57 68  r, pTrigger->pWh
9650: 65 6e 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  en);..  /* Find 
9660: 74 6f 6b 65 6e 73 20 74 6f 20 65 64 69 74 20 69  tokens to edit i
9670: 6e 20 74 72 69 67 67 65 72 20 73 74 65 70 73 20  n trigger steps 
9680: 2a 2f 0a 20 20 66 6f 72 28 70 53 74 65 70 3d 70  */.  for(pStep=p
9690: 54 72 69 67 67 65 72 2d 3e 73 74 65 70 5f 6c 69  Trigger->step_li
96a0: 73 74 3b 20 70 53 74 65 70 3b 20 70 53 74 65 70  st; pStep; pStep
96b0: 3d 70 53 74 65 70 2d 3e 70 4e 65 78 74 29 7b 0a  =pStep->pNext){.
96c0: 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
96d0: 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
96e0: 53 74 65 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Step->pSelect);.
96f0: 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45      sqlite3WalkE
9700: 78 70 72 28 70 57 61 6c 6b 65 72 2c 20 70 53 74  xpr(pWalker, pSt
9710: 65 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20  ep->pWhere);.   
9720: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
9730: 4c 69 73 74 28 70 57 61 6c 6b 65 72 2c 20 70 53  List(pWalker, pS
9740: 74 65 70 2d 3e 70 45 78 70 72 4c 69 73 74 29 3b  tep->pExprList);
9750: 0a 20 20 20 20 69 66 28 20 70 53 74 65 70 2d 3e  .    if( pStep->
9760: 70 55 70 73 65 72 74 20 29 7b 0a 20 20 20 20 20  pUpsert ){.     
9770: 20 55 70 73 65 72 74 20 2a 70 55 70 73 65 72 74   Upsert *pUpsert
9780: 20 3d 20 70 53 74 65 70 2d 3e 70 55 70 73 65 72   = pStep->pUpser
9790: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
97a0: 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 57 61  WalkExprList(pWa
97b0: 6c 6b 65 72 2c 20 70 55 70 73 65 72 74 2d 3e 70  lker, pUpsert->p
97c0: 55 70 73 65 72 74 54 61 72 67 65 74 29 3b 0a 20  UpsertTarget);. 
97d0: 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
97e0: 45 78 70 72 4c 69 73 74 28 70 57 61 6c 6b 65 72  ExprList(pWalker
97f0: 2c 20 70 55 70 73 65 72 74 2d 3e 70 55 70 73 65  , pUpsert->pUpse
9800: 72 74 53 65 74 29 3b 0a 20 20 20 20 20 20 73 71  rtSet);.      sq
9810: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 70 57  lite3WalkExpr(pW
9820: 61 6c 6b 65 72 2c 20 70 55 70 73 65 72 74 2d 3e  alker, pUpsert->
9830: 70 55 70 73 65 72 74 57 68 65 72 65 29 3b 0a 20  pUpsertWhere);. 
9840: 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
9850: 45 78 70 72 28 70 57 61 6c 6b 65 72 2c 20 70 55  Expr(pWalker, pU
9860: 70 73 65 72 74 2d 3e 70 55 70 73 65 72 74 54 61  psert->pUpsertTa
9870: 72 67 65 74 57 68 65 72 65 29 3b 0a 20 20 20 20  rgetWhere);.    
9880: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
9890: 72 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ree the contents
98a0: 20 6f 66 20 50 61 72 73 65 20 6f 62 6a 65 63 74   of Parse object
98b0: 20 28 2a 70 50 61 72 73 65 29 2e 20 44 6f 20 6e   (*pParse). Do n
98c0: 6f 74 20 66 72 65 65 20 74 68 65 20 6d 65 6d 6f  ot free the memo
98d0: 72 79 0a 2a 2a 20 6f 63 63 75 70 69 65 64 20 62  ry.** occupied b
98e0: 79 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  y the Parse obje
98f0: 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 73 74  ct itself..*/.st
9900: 61 74 69 63 20 76 6f 69 64 20 72 65 6e 61 6d 65  atic void rename
9910: 50 61 72 73 65 43 6c 65 61 6e 75 70 28 50 61 72  ParseCleanup(Par
9920: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
9930: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9940: 72 73 65 2d 3e 64 62 3b 0a 20 20 49 6e 64 65 78  rse->db;.  Index
9950: 20 2a 70 49 64 78 3b 0a 20 20 69 66 28 20 70 50   *pIdx;.  if( pP
9960: 61 72 73 65 2d 3e 70 56 64 62 65 20 29 7b 0a 20  arse->pVdbe ){. 
9970: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 69     sqlite3VdbeFi
9980: 6e 61 6c 69 7a 65 28 70 50 61 72 73 65 2d 3e 70  nalize(pParse->p
9990: 56 64 62 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Vdbe);.  }.  sql
99a0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
99b0: 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  db, pParse->pNew
99c0: 54 61 62 6c 65 29 3b 0a 20 20 77 68 69 6c 65 28  Table);.  while(
99d0: 20 28 70 49 64 78 20 3d 20 70 50 61 72 73 65 2d   (pIdx = pParse-
99e0: 3e 70 4e 65 77 49 6e 64 65 78 29 21 3d 30 20 29  >pNewIndex)!=0 )
99f0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e  {.    pParse->pN
9a00: 65 77 49 6e 64 65 78 20 3d 20 70 49 64 78 2d 3e  ewIndex = pIdx->
9a10: 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
9a20: 65 33 46 72 65 65 49 6e 64 65 78 28 64 62 2c 20  e3FreeIndex(db, 
9a30: 70 49 64 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pIdx);.  }.  sql
9a40: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65  ite3DeleteTrigge
9a50: 72 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 4e  r(db, pParse->pN
9a60: 65 77 54 72 69 67 67 65 72 29 3b 0a 20 20 73 71  ewTrigger);.  sq
9a70: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
9a80: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 29  pParse->zErrMsg)
9a90: 3b 0a 20 20 72 65 6e 61 6d 65 54 6f 6b 65 6e 46  ;.  renameTokenF
9aa0: 72 65 65 28 64 62 2c 20 70 50 61 72 73 65 2d 3e  ree(db, pParse->
9ab0: 70 52 65 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  pRename);.  sqli
9ac0: 74 65 33 50 61 72 73 65 72 52 65 73 65 74 28 70  te3ParserReset(p
9ad0: 50 61 72 73 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Parse);.}../*.**
9ae0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a   SQL function:.*
9af0: 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 5f  *.**     sqlite_
9b00: 72 65 6e 61 6d 65 5f 63 6f 6c 75 6d 6e 28 7a 53  rename_column(zS
9b10: 71 6c 2c 20 69 43 6f 6c 2c 20 62 51 75 6f 74 65  ql, iCol, bQuote
9b20: 2c 20 7a 4e 65 77 2c 20 7a 54 61 62 6c 65 2c 20  , zNew, zTable, 
9b30: 7a 4f 6c 64 29 0a 2a 2a 0a 2a 2a 20 20 20 30 2e  zOld).**.**   0.
9b40: 20 7a 53 71 6c 3a 20 20 20 20 20 53 51 4c 20 73   zSql:     SQL s
9b50: 74 61 74 65 6d 65 6e 74 20 74 6f 20 72 65 77 72  tatement to rewr
9b60: 69 74 65 0a 2a 2a 20 20 20 31 2e 20 74 79 70 65  ite.**   1. type
9b70: 3a 20 20 20 20 20 54 79 70 65 20 6f 66 20 6f 62  :     Type of ob
9b80: 6a 65 63 74 20 28 22 74 61 62 6c 65 22 2c 20 22  ject ("table", "
9b90: 76 69 65 77 22 20 65 74 63 2e 29 0a 2a 2a 20 20  view" etc.).**  
9ba0: 20 32 2e 20 6f 62 6a 65 63 74 3a 20 20 20 4e 61   2. object:   Na
9bb0: 6d 65 20 6f 66 20 6f 62 6a 65 63 74 0a 2a 2a 20  me of object.** 
9bc0: 20 20 33 2e 20 44 61 74 61 62 61 73 65 3a 20 44    3. Database: D
9bd0: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 28 65 2e  atabase name (e.
9be0: 67 2e 20 22 6d 61 69 6e 22 29 0a 2a 2a 20 20 20  g. "main").**   
9bf0: 34 2e 20 54 61 62 6c 65 3a 20 20 20 20 54 61 62  4. Table:    Tab
9c00: 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 35 2e 20  le name.**   5. 
9c10: 69 43 6f 6c 3a 20 20 20 20 20 49 6e 64 65 78 20  iCol:     Index 
9c20: 6f 66 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 6e  of column to ren
9c30: 61 6d 65 0a 2a 2a 20 20 20 36 2e 20 7a 4e 65 77  ame.**   6. zNew
9c40: 3a 20 20 20 20 20 4e 65 77 20 63 6f 6c 75 6d 6e  :     New column
9c50: 20 6e 61 6d 65 0a 2a 2a 20 20 20 37 2e 20 62 51   name.**   7. bQ
9c60: 75 6f 74 65 3a 20 20 20 4e 6f 6e 2d 7a 65 72 6f  uote:   Non-zero
9c70: 20 69 66 20 74 68 65 20 6e 65 77 20 63 6f 6c 75   if the new colu
9c80: 6d 6e 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62  mn name should b
9c90: 65 20 71 75 6f 74 65 64 2e 0a 2a 2a 20 20 20 38  e quoted..**   8
9ca0: 2e 20 62 54 65 6d 70 3a 20 20 20 20 54 72 75 65  . bTemp:    True
9cb0: 20 69 66 20 7a 53 71 6c 20 63 6f 6d 65 73 20 66   if zSql comes f
9cc0: 72 6f 6d 20 74 65 6d 70 20 73 63 68 65 6d 61 0a  rom temp schema.
9cd0: 2a 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6c 75 6d  **.** Do a colum
9ce0: 6e 20 72 65 6e 61 6d 65 20 6f 70 65 72 61 74 69  n rename operati
9cf0: 6f 6e 20 6f 6e 20 74 68 65 20 43 52 45 41 54 45  on on the CREATE
9d00: 20 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e   statement given
9d10: 20 69 6e 20 7a 53 71 6c 2e 0a 2a 2a 20 54 68 65   in zSql..** The
9d20: 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20   iCol-th column 
9d30: 28 6c 65 66 74 2d 6d 6f 73 74 20 69 73 20 30 29  (left-most is 0)
9d40: 20 6f 66 20 74 61 62 6c 65 20 7a 54 61 62 6c 65   of table zTable
9d50: 20 69 73 20 72 65 6e 61 6d 65 64 20 66 72 6f 6d   is renamed from
9d60: 20 7a 43 6f 6c 0a 2a 2a 20 69 6e 74 6f 20 7a 4e   zCol.** into zN
9d70: 65 77 2e 20 20 54 68 65 20 6e 61 6d 65 20 73 68  ew.  The name sh
9d80: 6f 75 6c 64 20 62 65 20 71 75 6f 74 65 64 20 69  ould be quoted i
9d90: 66 20 62 51 75 6f 74 65 20 69 73 20 74 72 75 65  f bQuote is true
9da0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
9db0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 69 6e  ction is used in
9dc0: 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 65 20  ternally by the 
9dd0: 41 4c 54 45 52 20 54 41 42 4c 45 20 52 45 4e 41  ALTER TABLE RENA
9de0: 4d 45 20 43 4f 4c 55 4d 4e 20 63 6f 6d 6d 61 6e  ME COLUMN comman
9df0: 64 2e 0a 2a 2a 20 49 74 20 69 73 20 6f 6e 6c 79  d..** It is only
9e00: 20 61 63 63 65 73 73 69 62 6c 65 20 74 6f 20 53   accessible to S
9e10: 51 4c 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  QL created using
9e20: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
9e30: 72 73 65 28 29 2e 20 20 49 74 20 69 73 0a 2a 2a  rse().  It is.**
9e40: 20 6e 6f 74 20 72 65 61 63 68 61 62 6c 65 20 66   not reachable f
9e50: 72 6f 6d 20 6f 72 64 69 6e 61 72 79 20 53 51 4c  rom ordinary SQL
9e60: 20 70 61 73 73 65 64 20 69 6e 74 6f 20 73 71 6c   passed into sql
9e70: 69 74 65 33 5f 70 72 65 70 61 72 65 28 29 2e 0a  ite3_prepare()..
9e80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
9e90: 65 6e 61 6d 65 43 6f 6c 75 6d 6e 46 75 6e 63 28  enameColumnFunc(
9ea0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
9eb0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
9ec0: 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71  nt NotUsed,.  sq
9ed0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
9ee0: 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  gv.){.  sqlite3 
9ef0: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
9f00: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
9f10: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 52 65 6e 61  context);.  Rena
9f20: 6d 65 43 74 78 20 73 43 74 78 3b 0a 20 20 63 6f  meCtx sCtx;.  co
9f30: 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
9f40: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
9f50: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
9f60: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 63 6f 6e  (argv[0]);.  con
9f70: 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 28  st char *zDb = (
9f80: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
9f90: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
9fa0: 72 67 76 5b 33 5d 29 3b 0a 20 20 63 6f 6e 73 74  rgv[3]);.  const
9fb0: 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 20 3d 20   char *zTable = 
9fc0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
9fd0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
9fe0: 61 72 67 76 5b 34 5d 29 3b 0a 20 20 69 6e 74 20  argv[4]);.  int 
9ff0: 69 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 76  iCol = sqlite3_v
a000: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 35 5d  alue_int(argv[5]
a010: 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
a020: 2a 7a 4e 65 77 20 3d 20 28 63 6f 6e 73 74 20 63  *zNew = (const c
a030: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
a040: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 36 5d 29  ue_text(argv[6])
a050: 3b 0a 20 20 69 6e 74 20 62 51 75 6f 74 65 20 3d  ;.  int bQuote =
a060: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
a070: 6e 74 28 61 72 67 76 5b 37 5d 29 3b 0a 20 20 69  nt(argv[7]);.  i
a080: 6e 74 20 62 54 65 6d 70 20 3d 20 73 71 6c 69 74  nt bTemp = sqlit
a090: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
a0a0: 76 5b 38 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63  v[8]);.  const c
a0b0: 68 61 72 20 2a 7a 4f 6c 64 3b 0a 20 20 69 6e 74  har *zOld;.  int
a0c0: 20 72 63 3b 0a 20 20 50 61 72 73 65 20 73 50 61   rc;.  Parse sPa
a0d0: 72 73 65 3b 0a 20 20 57 61 6c 6b 65 72 20 73 57  rse;.  Walker sW
a0e0: 61 6c 6b 65 72 3b 0a 20 20 49 6e 64 65 78 20 2a  alker;.  Index *
a0f0: 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pIdx;.  int i;. 
a100: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 23 69   Table *pTab;.#i
a110: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
a120: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
a130: 20 20 73 71 6c 69 74 65 33 5f 78 61 75 74 68 20    sqlite3_xauth 
a140: 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74  xAuth = db->xAut
a150: 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 55 4e 55  h;.#endif..  UNU
a160: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
a170: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 53  tUsed);.  if( zS
a180: 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ql==0 ) return;.
a190: 20 20 69 66 28 20 7a 54 61 62 6c 65 3d 3d 30 20    if( zTable==0 
a1a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
a1b0: 7a 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  zNew==0 ) return
a1c0: 3b 0a 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29  ;.  if( iCol<0 )
a1d0: 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74   return;.  sqlit
a1e0: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
a1f0: 64 62 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  db);.  pTab = sq
a200: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
a210: 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 44 62 29 3b  b, zTable, zDb);
a220: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c  .  if( pTab==0 |
a230: 7c 20 69 43 6f 6c 3e 3d 70 54 61 62 2d 3e 6e 43  | iCol>=pTab->nC
a240: 6f 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ol ){.    sqlite
a250: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
a260: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  b);.    return;.
a270: 20 20 7d 0a 20 20 7a 4f 6c 64 20 3d 20 70 54 61    }.  zOld = pTa
a280: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e  b->aCol[iCol].zN
a290: 61 6d 65 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  ame;.  memset(&s
a2a0: 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Ctx, 0, sizeof(s
a2b0: 43 74 78 29 29 3b 0a 20 20 73 43 74 78 2e 69 43  Ctx));.  sCtx.iC
a2c0: 6f 6c 20 3d 20 28 28 69 43 6f 6c 3d 3d 70 54 61  ol = ((iCol==pTa
a2d0: 62 2d 3e 69 50 4b 65 79 29 20 3f 20 2d 31 20 3a  b->iPKey) ? -1 :
a2e0: 20 69 43 6f 6c 29 3b 0a 0a 23 69 66 6e 64 65 66   iCol);..#ifndef
a2f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
a300: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 64 62 2d  HORIZATION.  db-
a310: 3e 78 41 75 74 68 20 3d 20 30 3b 0a 23 65 6e 64  >xAuth = 0;.#end
a320: 69 66 0a 20 20 72 63 20 3d 20 72 65 6e 61 6d 65  if.  rc = rename
a330: 50 61 72 73 65 53 71 6c 28 26 73 50 61 72 73 65  ParseSql(&sParse
a340: 2c 20 7a 44 62 2c 20 30 2c 20 64 62 2c 20 7a 53  , zDb, 0, db, zS
a350: 71 6c 2c 20 62 54 65 6d 70 29 3b 0a 0a 20 20 2f  ql, bTemp);..  /
a360: 2a 20 46 69 6e 64 20 74 6f 6b 65 6e 73 20 74 68  * Find tokens th
a370: 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65  at need to be re
a380: 70 6c 61 63 65 64 2e 20 2a 2f 0a 20 20 6d 65 6d  placed. */.  mem
a390: 73 65 74 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c  set(&sWalker, 0,
a3a0: 20 73 69 7a 65 6f 66 28 57 61 6c 6b 65 72 29 29   sizeof(Walker))
a3b0: 3b 0a 20 20 73 57 61 6c 6b 65 72 2e 70 50 61 72  ;.  sWalker.pPar
a3c0: 73 65 20 3d 20 26 73 50 61 72 73 65 3b 0a 20 20  se = &sParse;.  
a3d0: 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c  sWalker.xExprCal
a3e0: 6c 62 61 63 6b 20 3d 20 72 65 6e 61 6d 65 43 6f  lback = renameCo
a3f0: 6c 75 6d 6e 45 78 70 72 43 62 3b 0a 20 20 73 57  lumnExprCb;.  sW
a400: 61 6c 6b 65 72 2e 78 53 65 6c 65 63 74 43 61 6c  alker.xSelectCal
a410: 6c 62 61 63 6b 20 3d 20 72 65 6e 61 6d 65 43 6f  lback = renameCo
a420: 6c 75 6d 6e 53 65 6c 65 63 74 43 62 3b 0a 20 20  lumnSelectCb;.  
a430: 73 57 61 6c 6b 65 72 2e 75 2e 70 52 65 6e 61 6d  sWalker.u.pRenam
a440: 65 20 3d 20 26 73 43 74 78 3b 0a 0a 20 20 73 43  e = &sCtx;..  sC
a450: 74 78 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  tx.pTab = pTab;.
a460: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
a470: 5f 4f 4b 20 29 20 67 6f 74 6f 20 72 65 6e 61 6d  _OK ) goto renam
a480: 65 43 6f 6c 75 6d 6e 46 75 6e 63 5f 64 6f 6e 65  eColumnFunc_done
a490: 3b 0a 20 20 69 66 28 20 73 50 61 72 73 65 2e 70  ;.  if( sParse.p
a4a0: 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  NewTable ){.    
a4b0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
a4c0: 3d 20 73 50 61 72 73 65 2e 70 4e 65 77 54 61 62  = sParse.pNewTab
a4d0: 6c 65 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  le->pSelect;.   
a4e0: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
a4f0: 20 20 20 20 20 20 73 50 61 72 73 65 2e 72 63 20        sParse.rc 
a500: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
a510: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
a520: 50 72 65 70 28 26 73 50 61 72 73 65 2c 20 73 50  Prep(&sParse, sP
a530: 61 72 73 65 2e 70 4e 65 77 54 61 62 6c 65 2d 3e  arse.pNewTable->
a540: 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  pSelect, 0);.   
a550: 20 20 20 72 63 20 3d 20 28 64 62 2d 3e 6d 61 6c     rc = (db->mal
a560: 6c 6f 63 46 61 69 6c 65 64 20 3f 20 53 51 4c 49  locFailed ? SQLI
a570: 54 45 5f 4e 4f 4d 45 4d 20 3a 20 73 50 61 72 73  TE_NOMEM : sPars
a580: 65 2e 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28  e.rc);.      if(
a590: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
a5a0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a5b0: 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 73 57 61  3WalkSelect(&sWa
a5c0: 6c 6b 65 72 2c 20 70 53 65 6c 65 63 74 29 3b 0a  lker, pSelect);.
a5d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
a5e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a5f0: 29 20 67 6f 74 6f 20 72 65 6e 61 6d 65 43 6f 6c  ) goto renameCol
a600: 75 6d 6e 46 75 6e 63 5f 64 6f 6e 65 3b 0a 20 20  umnFunc_done;.  
a610: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
a620: 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c  * A regular tabl
a630: 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62  e */.      int b
a640: 46 4b 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33  FKOnly = sqlite3
a650: 5f 73 74 72 69 63 6d 70 28 7a 54 61 62 6c 65 2c  _stricmp(zTable,
a660: 20 73 50 61 72 73 65 2e 70 4e 65 77 54 61 62 6c   sParse.pNewTabl
a670: 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e->zName);.     
a680: 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
a690: 20 20 20 20 61 73 73 65 72 74 28 20 73 50 61 72      assert( sPar
a6a0: 73 65 2e 70 4e 65 77 54 61 62 6c 65 2d 3e 70 53  se.pNewTable->pS
a6b0: 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  elect==0 );.    
a6c0: 20 20 73 43 74 78 2e 70 54 61 62 20 3d 20 73 50    sCtx.pTab = sP
a6d0: 61 72 73 65 2e 70 4e 65 77 54 61 62 6c 65 3b 0a  arse.pNewTable;.
a6e0: 20 20 20 20 20 20 69 66 28 20 62 46 4b 4f 6e 6c        if( bFKOnl
a6f0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
a700: 72 65 6e 61 6d 65 54 6f 6b 65 6e 46 69 6e 64 28  renameTokenFind(
a710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 73 50  .            &sP
a720: 61 72 73 65 2c 20 26 73 43 74 78 2c 20 28 76 6f  arse, &sCtx, (vo
a730: 69 64 2a 29 73 50 61 72 73 65 2e 70 4e 65 77 54  id*)sParse.pNewT
a740: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  able->aCol[iCol]
a750: 2e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29  .zName.        )
a760: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 43  ;.        if( sC
a770: 74 78 2e 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  tx.iCol<0 ){.   
a780: 20 20 20 20 20 20 20 72 65 6e 61 6d 65 54 6f 6b         renameTok
a790: 65 6e 46 69 6e 64 28 26 73 50 61 72 73 65 2c 20  enFind(&sParse, 
a7a0: 26 73 43 74 78 2c 20 28 76 6f 69 64 2a 29 26 73  &sCtx, (void*)&s
a7b0: 50 61 72 73 65 2e 70 4e 65 77 54 61 62 6c 65 2d  Parse.pNewTable-
a7c0: 3e 69 50 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  >iPKey);.       
a7d0: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
a7e0: 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26  e3WalkExprList(&
a7f0: 73 57 61 6c 6b 65 72 2c 20 73 50 61 72 73 65 2e  sWalker, sParse.
a800: 70 4e 65 77 54 61 62 6c 65 2d 3e 70 43 68 65 63  pNewTable->pChec
a810: 6b 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  k);.        for(
a820: 70 49 64 78 3d 73 50 61 72 73 65 2e 70 4e 65 77  pIdx=sParse.pNew
a830: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
a840: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
a850: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
a860: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
a870: 72 4c 69 73 74 28 26 73 57 61 6c 6b 65 72 2c 20  rList(&sWalker, 
a880: 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 29 3b  pIdx->aColExpr);
a890: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a8a0: 20 20 20 66 6f 72 28 70 49 64 78 3d 73 50 61 72     for(pIdx=sPar
a8b0: 73 65 2e 70 4e 65 77 49 6e 64 65 78 3b 20 70 49  se.pNewIndex; pI
a8c0: 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
a8d0: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  Next){.         
a8e0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
a8f0: 4c 69 73 74 28 26 73 57 61 6c 6b 65 72 2c 20 70  List(&sWalker, p
a900: 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 29 3b 0a  Idx->aColExpr);.
a910: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a920: 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 46 4b  }..      for(pFK
a930: 65 79 3d 73 50 61 72 73 65 2e 70 4e 65 77 54 61  ey=sParse.pNewTa
a940: 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65  ble->pFKey; pFKe
a950: 79 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e  y; pFKey=pFKey->
a960: 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20  pNextFrom){.    
a970: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
a980: 46 4b 65 79 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  FKey->nCol; i++)
a990: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
a9a0: 62 46 4b 4f 6e 6c 79 3d 3d 30 20 26 26 20 70 46  bFKOnly==0 && pF
a9b0: 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72  Key->aCol[i].iFr
a9c0: 6f 6d 3d 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20  om==iCol ){.    
a9d0: 20 20 20 20 20 20 20 20 72 65 6e 61 6d 65 54 6f          renameTo
a9e0: 6b 65 6e 46 69 6e 64 28 26 73 50 61 72 73 65 2c  kenFind(&sParse,
a9f0: 20 26 73 43 74 78 2c 20 28 76 6f 69 64 2a 29 26   &sCtx, (void*)&
aa00: 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 29 3b  pFKey->aCol[i]);
aa10: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
aa20: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71         if( 0==sq
aa30: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 46  lite3_stricmp(pF
aa40: 4b 65 79 2d 3e 7a 54 6f 2c 20 7a 54 61 62 6c 65  Key->zTo, zTable
aa50: 29 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  ).           && 
aa60: 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63  0==sqlite3_stric
aa70: 6d 70 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 69  mp(pFKey->aCol[i
aa80: 5d 2e 7a 43 6f 6c 2c 20 7a 4f 6c 64 29 0a 20 20  ].zCol, zOld).  
aa90: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
aaa0: 20 20 20 20 20 20 20 72 65 6e 61 6d 65 54 6f 6b         renameTok
aab0: 65 6e 46 69 6e 64 28 26 73 50 61 72 73 65 2c 20  enFind(&sParse, 
aac0: 26 73 43 74 78 2c 20 28 76 6f 69 64 2a 29 70 46  &sCtx, (void*)pF
aad0: 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
aae0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  l);.          }.
aaf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ab00: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
ab10: 69 66 28 20 73 50 61 72 73 65 2e 70 4e 65 77 49  if( sParse.pNewI
ab20: 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
ab30: 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28  te3WalkExprList(
ab40: 26 73 57 61 6c 6b 65 72 2c 20 73 50 61 72 73 65  &sWalker, sParse
ab50: 2e 70 4e 65 77 49 6e 64 65 78 2d 3e 61 43 6f 6c  .pNewIndex->aCol
ab60: 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  Expr);.    sqlit
ab70: 65 33 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c  e3WalkExpr(&sWal
ab80: 6b 65 72 2c 20 73 50 61 72 73 65 2e 70 4e 65 77  ker, sParse.pNew
ab90: 49 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78 57  Index->pPartIdxW
aba0: 68 65 72 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  here);.  }else{.
abb0: 20 20 20 20 2f 2a 20 41 20 74 72 69 67 67 65 72      /* A trigger
abc0: 20 2a 2f 0a 20 20 20 20 54 72 69 67 67 65 72 53   */.    TriggerS
abd0: 74 65 70 20 2a 70 53 74 65 70 3b 0a 20 20 20 20  tep *pStep;.    
abe0: 72 63 20 3d 20 72 65 6e 61 6d 65 52 65 73 6f 6c  rc = renameResol
abf0: 76 65 54 72 69 67 67 65 72 28 26 73 50 61 72 73  veTrigger(&sPars
ac00: 65 2c 20 28 62 54 65 6d 70 20 3f 20 30 20 3a 20  e, (bTemp ? 0 : 
ac10: 7a 44 62 29 29 3b 0a 20 20 20 20 69 66 28 20 72  zDb));.    if( r
ac20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
ac30: 6f 74 6f 20 72 65 6e 61 6d 65 43 6f 6c 75 6d 6e  oto renameColumn
ac40: 46 75 6e 63 5f 64 6f 6e 65 3b 0a 0a 20 20 20 20  Func_done;..    
ac50: 66 6f 72 28 70 53 74 65 70 3d 73 50 61 72 73 65  for(pStep=sParse
ac60: 2e 70 4e 65 77 54 72 69 67 67 65 72 2d 3e 73 74  .pNewTrigger->st
ac70: 65 70 5f 6c 69 73 74 3b 20 70 53 74 65 70 3b 20  ep_list; pStep; 
ac80: 70 53 74 65 70 3d 70 53 74 65 70 2d 3e 70 4e 65  pStep=pStep->pNe
ac90: 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
aca0: 53 74 65 70 2d 3e 7a 54 61 72 67 65 74 20 29 7b  Step->zTarget ){
acb0: 20 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20   .        Table 
acc0: 2a 70 54 61 72 67 65 74 20 3d 20 73 71 6c 69 74  *pTarget = sqlit
acd0: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 26 73  e3LocateTable(&s
ace0: 50 61 72 73 65 2c 20 30 2c 20 70 53 74 65 70 2d  Parse, 0, pStep-
acf0: 3e 7a 54 61 72 67 65 74 2c 20 7a 44 62 29 3b 0a  >zTarget, zDb);.
ad00: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 72          if( pTar
ad10: 67 65 74 3d 3d 70 54 61 62 20 29 7b 0a 20 20 20  get==pTab ){.   
ad20: 20 20 20 20 20 20 20 69 66 28 20 70 53 74 65 70         if( pStep
ad30: 2d 3e 70 55 70 73 65 72 74 20 29 7b 0a 20 20 20  ->pUpsert ){.   
ad40: 20 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73           ExprLis
ad50: 74 20 2a 70 55 70 73 65 72 74 53 65 74 20 3d 20  t *pUpsertSet = 
ad60: 70 53 74 65 70 2d 3e 70 55 70 73 65 72 74 2d 3e  pStep->pUpsert->
ad70: 70 55 70 73 65 72 74 53 65 74 3b 0a 20 20 20 20  pUpsertSet;.    
ad80: 20 20 20 20 20 20 20 20 72 65 6e 61 6d 65 43 6f          renameCo
ad90: 6c 75 6d 6e 45 6c 69 73 74 4e 61 6d 65 73 28 26  lumnElistNames(&
ada0: 73 50 61 72 73 65 2c 20 26 73 43 74 78 2c 20 70  sParse, &sCtx, p
adb0: 55 70 73 65 72 74 53 65 74 2c 20 7a 4f 6c 64 29  UpsertSet, zOld)
adc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
add0: 20 20 20 20 20 20 20 20 72 65 6e 61 6d 65 43 6f          renameCo
ade0: 6c 75 6d 6e 49 64 6c 69 73 74 4e 61 6d 65 73 28  lumnIdlistNames(
adf0: 26 73 50 61 72 73 65 2c 20 26 73 43 74 78 2c 20  &sParse, &sCtx, 
ae00: 70 53 74 65 70 2d 3e 70 49 64 4c 69 73 74 2c 20  pStep->pIdList, 
ae10: 7a 4f 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 20  zOld);.         
ae20: 20 72 65 6e 61 6d 65 43 6f 6c 75 6d 6e 45 6c 69   renameColumnEli
ae30: 73 74 4e 61 6d 65 73 28 26 73 50 61 72 73 65 2c  stNames(&sParse,
ae40: 20 26 73 43 74 78 2c 20 70 53 74 65 70 2d 3e 70   &sCtx, pStep->p
ae50: 45 78 70 72 4c 69 73 74 2c 20 7a 4f 6c 64 29 3b  ExprList, zOld);
ae60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
ae70: 20 7d 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f   }.    }...    /
ae80: 2a 20 46 69 6e 64 20 74 6f 6b 65 6e 73 20 74 6f  * Find tokens to
ae90: 20 65 64 69 74 20 69 6e 20 55 50 44 41 54 45 20   edit in UPDATE 
aea0: 4f 46 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20  OF clause */.   
aeb0: 20 69 66 28 20 73 50 61 72 73 65 2e 70 54 72 69   if( sParse.pTri
aec0: 67 67 65 72 54 61 62 3d 3d 70 54 61 62 20 29 7b  ggerTab==pTab ){
aed0: 0a 20 20 20 20 20 20 72 65 6e 61 6d 65 43 6f 6c  .      renameCol
aee0: 75 6d 6e 49 64 6c 69 73 74 4e 61 6d 65 73 28 26  umnIdlistNames(&
aef0: 73 50 61 72 73 65 2c 20 26 73 43 74 78 2c 73 50  sParse, &sCtx,sP
af00: 61 72 73 65 2e 70 4e 65 77 54 72 69 67 67 65 72  arse.pNewTrigger
af10: 2d 3e 70 43 6f 6c 75 6d 6e 73 2c 7a 4f 6c 64 29  ->pColumns,zOld)
af20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
af30: 46 69 6e 64 20 74 6f 6b 65 6e 73 20 74 6f 20 65  Find tokens to e
af40: 64 69 74 20 69 6e 20 76 61 72 69 6f 75 73 20 65  dit in various e
af50: 78 70 72 65 73 73 69 6f 6e 73 20 61 6e 64 20 73  xpressions and s
af60: 65 6c 65 63 74 73 20 2a 2f 0a 20 20 20 20 72 65  elects */.    re
af70: 6e 61 6d 65 57 61 6c 6b 54 72 69 67 67 65 72 28  nameWalkTrigger(
af80: 26 73 57 61 6c 6b 65 72 2c 20 73 50 61 72 73 65  &sWalker, sParse
af90: 2e 70 4e 65 77 54 72 69 67 67 65 72 29 3b 0a 20  .pNewTrigger);. 
afa0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 72 63   }..  assert( rc
afb0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
afc0: 20 72 63 20 3d 20 72 65 6e 61 6d 65 45 64 69 74   rc = renameEdit
afd0: 53 71 6c 28 63 6f 6e 74 65 78 74 2c 20 26 73 43  Sql(context, &sC
afe0: 74 78 2c 20 7a 53 71 6c 2c 20 7a 4e 65 77 2c 20  tx, zSql, zNew, 
aff0: 62 51 75 6f 74 65 29 3b 0a 0a 72 65 6e 61 6d 65  bQuote);..rename
b000: 43 6f 6c 75 6d 6e 46 75 6e 63 5f 64 6f 6e 65 3a  ColumnFunc_done:
b010: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
b020: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
b030: 73 50 61 72 73 65 2e 7a 45 72 72 4d 73 67 20 29  sParse.zErrMsg )
b040: 7b 0a 20 20 20 20 20 20 72 65 6e 61 6d 65 43 6f  {.      renameCo
b050: 6c 75 6d 6e 50 61 72 73 65 45 72 72 6f 72 28 63  lumnParseError(c
b060: 6f 6e 74 65 78 74 2c 20 30 2c 20 61 72 67 76 5b  ontext, 0, argv[
b070: 31 5d 2c 20 61 72 67 76 5b 32 5d 2c 20 26 73 50  1], argv[2], &sP
b080: 61 72 73 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  arse);.    }else
b090: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
b0a0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64  result_error_cod
b0b0: 65 28 63 6f 6e 74 65 78 74 2c 20 72 63 29 3b 0a  e(context, rc);.
b0c0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 6e      }.  }..  ren
b0d0: 61 6d 65 50 61 72 73 65 43 6c 65 61 6e 75 70 28  ameParseCleanup(
b0e0: 26 73 50 61 72 73 65 29 3b 0a 20 20 72 65 6e 61  &sParse);.  rena
b0f0: 6d 65 54 6f 6b 65 6e 46 72 65 65 28 64 62 2c 20  meTokenFree(db, 
b100: 73 43 74 78 2e 70 4c 69 73 74 29 3b 0a 23 69 66  sCtx.pList);.#if
b110: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b120: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
b130: 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75   db->xAuth = xAu
b140: 74 68 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  th;.#endif.  sql
b150: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
b160: 6c 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l(db);.}../*.** 
b170: 57 61 6c 6b 65 72 20 65 78 70 72 65 73 73 69 6f  Walker expressio
b180: 6e 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  n callback used 
b190: 62 79 20 22 52 45 4e 41 4d 45 20 54 41 42 4c 45  by "RENAME TABLE
b1a0: 22 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ". .*/.static in
b1b0: 74 20 72 65 6e 61 6d 65 54 61 62 6c 65 45 78 70  t renameTableExp
b1c0: 72 43 62 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  rCb(Walker *pWal
b1d0: 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
b1e0: 29 7b 0a 20 20 52 65 6e 61 6d 65 43 74 78 20 2a  ){.  RenameCtx *
b1f0: 70 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  p = pWalker->u.p
b200: 52 65 6e 61 6d 65 3b 0a 20 20 69 66 28 20 70 45  Rename;.  if( pE
b210: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
b220: 4d 4e 20 26 26 20 70 2d 3e 70 54 61 62 3d 3d 70  MN && p->pTab==p
b230: 45 78 70 72 2d 3e 79 2e 70 54 61 62 20 29 7b 0a  Expr->y.pTab ){.
b240: 20 20 20 20 72 65 6e 61 6d 65 54 6f 6b 65 6e 46      renameTokenF
b250: 69 6e 64 28 70 57 61 6c 6b 65 72 2d 3e 70 50 61  ind(pWalker->pPa
b260: 72 73 65 2c 20 70 2c 20 28 76 6f 69 64 2a 29 26  rse, p, (void*)&
b270: 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 29 3b 0a  pExpr->y.pTab);.
b280: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
b290: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
b2a0: 0a 2a 2a 20 57 61 6c 6b 65 72 20 73 65 6c 65 63  .** Walker selec
b2b0: 74 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  t callback used 
b2c0: 62 79 20 22 52 45 4e 41 4d 45 20 54 41 42 4c 45  by "RENAME TABLE
b2d0: 22 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ". .*/.static in
b2e0: 74 20 72 65 6e 61 6d 65 54 61 62 6c 65 53 65 6c  t renameTableSel
b2f0: 65 63 74 43 62 28 57 61 6c 6b 65 72 20 2a 70 57  ectCb(Walker *pW
b300: 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
b310: 53 65 6c 65 63 74 29 7b 0a 20 20 69 6e 74 20 69  Select){.  int i
b320: 3b 0a 20 20 52 65 6e 61 6d 65 43 74 78 20 2a 70  ;.  RenameCtx *p
b330: 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 52   = pWalker->u.pR
b340: 65 6e 61 6d 65 3b 0a 20 20 53 72 63 4c 69 73 74  ename;.  SrcList
b350: 20 2a 70 53 72 63 20 3d 20 70 53 65 6c 65 63 74   *pSrc = pSelect
b360: 2d 3e 70 53 72 63 3b 0a 20 20 69 66 28 20 70 53  ->pSrc;.  if( pS
b370: 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  rc==0 ){.    ass
b380: 65 72 74 28 20 70 57 61 6c 6b 65 72 2d 3e 70 50  ert( pWalker->pP
b390: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
b3a0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65  Failed );.    re
b3b0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
b3c0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
b3d0: 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
b3e0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
b3f0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
b400: 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 5d 3b  m = &pSrc->a[i];
b410: 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
b420: 70 54 61 62 3d 3d 70 2d 3e 70 54 61 62 20 29 7b  pTab==p->pTab ){
b430: 0a 20 20 20 20 20 20 72 65 6e 61 6d 65 54 6f 6b  .      renameTok
b440: 65 6e 46 69 6e 64 28 70 57 61 6c 6b 65 72 2d 3e  enFind(pWalker->
b450: 70 50 61 72 73 65 2c 20 70 2c 20 70 49 74 65 6d  pParse, p, pItem
b460: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
b470: 20 20 7d 0a 20 20 72 65 6e 61 6d 65 57 61 6c 6b    }.  renameWalk
b480: 57 69 74 68 28 70 57 61 6c 6b 65 72 2c 20 70 53  With(pWalker, pS
b490: 65 6c 65 63 74 29 3b 0a 0a 20 20 72 65 74 75 72  elect);..  retur
b4a0: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
b4b0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 43  }.../*.** This C
b4c0: 20 66 75 6e 63 74 69 6f 6e 20 69 6d 70 6c 65 6d   function implem
b4d0: 65 6e 74 73 20 61 6e 20 53 51 4c 20 75 73 65 72  ents an SQL user
b4e0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
b4f0: 73 20 75 73 65 64 20 62 79 20 53 51 4c 20 63 6f  s used by SQL co
b500: 64 65 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 20  de.** generated 
b510: 62 79 20 74 68 65 20 41 4c 54 45 52 20 54 41 42  by the ALTER TAB
b520: 4c 45 20 2e 2e 2e 20 52 45 4e 41 4d 45 20 63 6f  LE ... RENAME co
b530: 6d 6d 61 6e 64 20 74 6f 20 6d 6f 64 69 66 79 20  mmand to modify 
b540: 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 0a 2a  the definition.*
b550: 2a 20 6f 66 20 61 6e 79 20 66 6f 72 65 69 67 6e  * of any foreign
b560: 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
b570: 20 74 68 61 74 20 75 73 65 20 74 68 65 20 74 61   that use the ta
b580: 62 6c 65 20 62 65 69 6e 67 20 72 65 6e 61 6d 65  ble being rename
b590: 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 70 61 72  d as the .** par
b5a0: 65 6e 74 20 74 61 62 6c 65 2e 20 49 74 20 69 73  ent table. It is
b5b0: 20 70 61 73 73 65 64 20 74 68 72 65 65 20 61 72   passed three ar
b5c0: 67 75 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  guments:.**.**  
b5d0: 20 30 3a 20 54 68 65 20 64 61 74 61 62 61 73 65   0: The database
b5e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
b5f0: 74 61 62 6c 65 20 62 65 69 6e 67 20 72 65 6e 61  table being rena
b600: 6d 65 64 2e 0a 2a 2a 20 20 20 31 2e 20 74 79 70  med..**   1. typ
b610: 65 3a 20 20 20 20 20 54 79 70 65 20 6f 66 20 6f  e:     Type of o
b620: 62 6a 65 63 74 20 28 22 74 61 62 6c 65 22 2c 20  bject ("table", 
b630: 22 76 69 65 77 22 20 65 74 63 2e 29 0a 2a 2a 20  "view" etc.).** 
b640: 20 20 32 2e 20 6f 62 6a 65 63 74 3a 20 20 20 4e    2. object:   N
b650: 61 6d 65 20 6f 66 20 6f 62 6a 65 63 74 0a 2a 2a  ame of object.**
b660: 20 20 20 33 3a 20 54 68 65 20 63 6f 6d 70 6c 65     3: The comple
b670: 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 73  te text of the s
b680: 63 68 65 6d 61 20 73 74 61 74 65 6d 65 6e 74 20  chema statement 
b690: 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2c 0a  being modified,.
b6a0: 2a 2a 20 20 20 34 3a 20 54 68 65 20 6f 6c 64 20  **   4: The old 
b6b0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
b6c0: 65 20 62 65 69 6e 67 20 72 65 6e 61 6d 65 64 2c  e being renamed,
b6d0: 20 61 6e 64 0a 2a 2a 20 20 20 35 3a 20 54 68 65   and.**   5: The
b6e0: 20 6e 65 77 20 6e 61 6d 65 20 6f 66 20 74 68 65   new name of the
b6f0: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 72 65 6e   table being ren
b700: 61 6d 65 64 2e 0a 2a 2a 20 20 20 36 3a 20 54 72  amed..**   6: Tr
b710: 75 65 20 69 66 20 74 68 65 20 73 63 68 65 6d 61  ue if the schema
b720: 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73   statement comes
b730: 20 66 72 6f 6d 20 74 68 65 20 74 65 6d 70 20 64   from the temp d
b740: 62 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 72 65 74 75  b..**.** It retu
b750: 72 6e 73 20 74 68 65 20 6e 65 77 20 73 63 68 65  rns the new sche
b760: 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 46 6f  ma statement. Fo
b770: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
b780: 20 73 71 6c 69 74 65 5f 72 65 6e 61 6d 65 5f 74   sqlite_rename_t
b790: 61 62 6c 65 28 27 6d 61 69 6e 27 2c 20 27 43 52  able('main', 'CR
b7a0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
b7b0: 52 45 46 45 52 45 4e 43 45 53 20 74 32 29 27 2c  REFERENCES t2)',
b7c0: 27 74 32 27 2c 27 74 33 27 2c 30 29 0a 2a 2a 20  't2','t3',0).** 
b7d0: 20 20 20 20 20 20 2d 3e 20 27 43 52 45 41 54 45        -> 'CREATE
b7e0: 20 54 41 42 4c 45 20 74 31 28 61 20 52 45 46 45   TABLE t1(a REFE
b7f0: 52 45 4e 43 45 53 20 74 33 29 27 0a 2a 2f 0a 73  RENCES t3)'.*/.s
b800: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6e 61 6d  tatic void renam
b810: 65 54 61 62 6c 65 46 75 6e 63 28 0a 20 20 73 71  eTableFunc(.  sq
b820: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
b830: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f  ontext,.  int No
b840: 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65 33  tUsed,.  sqlite3
b850: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
b860: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
b870: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
b880: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65  _db_handle(conte
b890: 78 74 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  xt);.  const cha
b8a0: 72 20 2a 7a 44 62 20 3d 20 28 63 6f 6e 73 74 20  r *zDb = (const 
b8b0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
b8c0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
b8d0: 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
b8e0: 2a 7a 49 6e 70 75 74 20 3d 20 28 63 6f 6e 73 74  *zInput = (const
b8f0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
b900: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 33  alue_text(argv[3
b910: 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ]);.  const char
b920: 20 2a 7a 4f 6c 64 20 3d 20 28 63 6f 6e 73 74 20   *zOld = (const 
b930: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
b940: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 34 5d  lue_text(argv[4]
b950: 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
b960: 2a 7a 4e 65 77 20 3d 20 28 63 6f 6e 73 74 20 63  *zNew = (const c
b970: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
b980: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 35 5d 29  ue_text(argv[5])
b990: 3b 0a 20 20 69 6e 74 20 62 54 65 6d 70 20 3d 20  ;.  int bTemp = 
b9a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
b9b0: 74 28 61 72 67 76 5b 36 5d 29 3b 0a 20 20 55 4e  t(argv[6]);.  UN
b9c0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
b9d0: 6f 74 55 73 65 64 29 3b 0a 0a 20 20 69 66 28 20  otUsed);..  if( 
b9e0: 7a 49 6e 70 75 74 20 26 26 20 7a 4f 6c 64 20 26  zInput && zOld &
b9f0: 26 20 7a 4e 65 77 20 29 7b 0a 20 20 20 20 50 61  & zNew ){.    Pa
ba00: 72 73 65 20 73 50 61 72 73 65 3b 0a 20 20 20 20  rse sParse;.    
ba10: 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
ba20: 62 51 75 6f 74 65 20 3d 20 31 3b 0a 20 20 20 20  bQuote = 1;.    
ba30: 52 65 6e 61 6d 65 43 74 78 20 73 43 74 78 3b 0a  RenameCtx sCtx;.
ba40: 20 20 20 20 57 61 6c 6b 65 72 20 73 57 61 6c 6b      Walker sWalk
ba50: 65 72 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  er;..#ifndef SQL
ba60: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
ba70: 5a 41 54 49 4f 4e 0a 20 20 20 20 73 71 6c 69 74  ZATION.    sqlit
ba80: 65 33 5f 78 61 75 74 68 20 78 41 75 74 68 20 3d  e3_xauth xAuth =
ba90: 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20   db->xAuth;.    
baa0: 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 23  db->xAuth = 0;.#
bab0: 65 6e 64 69 66 0a 0a 20 20 20 20 73 71 6c 69 74  endif..    sqlit
bac0: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
bad0: 64 62 29 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74  db);..    memset
bae0: 28 26 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f  (&sCtx, 0, sizeo
baf0: 66 28 52 65 6e 61 6d 65 43 74 78 29 29 3b 0a 20  f(RenameCtx));. 
bb00: 20 20 20 73 43 74 78 2e 70 54 61 62 20 3d 20 73     sCtx.pTab = s
bb10: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
bb20: 64 62 2c 20 7a 4f 6c 64 2c 20 7a 44 62 29 3b 0a  db, zOld, zDb);.
bb30: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 57 61 6c      memset(&sWal
bb40: 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 57  ker, 0, sizeof(W
bb50: 61 6c 6b 65 72 29 29 3b 0a 20 20 20 20 73 57 61  alker));.    sWa
bb60: 6c 6b 65 72 2e 70 50 61 72 73 65 20 3d 20 26 73  lker.pParse = &s
bb70: 50 61 72 73 65 3b 0a 20 20 20 20 73 57 61 6c 6b  Parse;.    sWalk
bb80: 65 72 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b  er.xExprCallback
bb90: 20 3d 20 72 65 6e 61 6d 65 54 61 62 6c 65 45 78   = renameTableEx
bba0: 70 72 43 62 3b 0a 20 20 20 20 73 57 61 6c 6b 65  prCb;.    sWalke
bbb0: 72 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  r.xSelectCallbac
bbc0: 6b 20 3d 20 72 65 6e 61 6d 65 54 61 62 6c 65 53  k = renameTableS
bbd0: 65 6c 65 63 74 43 62 3b 0a 20 20 20 20 73 57 61  electCb;.    sWa
bbe0: 6c 6b 65 72 2e 75 2e 70 52 65 6e 61 6d 65 20 3d  lker.u.pRename =
bbf0: 20 26 73 43 74 78 3b 0a 0a 20 20 20 20 72 63 20   &sCtx;..    rc 
bc00: 3d 20 72 65 6e 61 6d 65 50 61 72 73 65 53 71 6c  = renameParseSql
bc10: 28 26 73 50 61 72 73 65 2c 20 7a 44 62 2c 20 31  (&sParse, zDb, 1
bc20: 2c 20 64 62 2c 20 7a 49 6e 70 75 74 2c 20 62 54  , db, zInput, bT
bc30: 65 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  emp);..    if( r
bc40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
bc50: 20 20 20 20 20 20 69 6e 74 20 69 73 4c 65 67 61        int isLega
bc60: 63 79 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20  cy = (db->flags 
bc70: 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 41  & SQLITE_LegacyA
bc80: 6c 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  lter);.      if(
bc90: 20 73 50 61 72 73 65 2e 70 4e 65 77 54 61 62 6c   sParse.pNewTabl
bca0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62  e ){.        Tab
bcb0: 6c 65 20 2a 70 54 61 62 20 3d 20 73 50 61 72 73  le *pTab = sPars
bcc0: 65 2e 70 4e 65 77 54 61 62 6c 65 3b 0a 0a 20 20  e.pNewTable;..  
bcd0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e        if( pTab->
bce0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
bcf0: 20 20 20 20 20 69 66 28 20 69 73 4c 65 67 61 63       if( isLegac
bd00: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
bd10: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
bd20: 73 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sNC;.           
bd30: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
bd40: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
bd50: 20 20 20 20 20 20 20 20 20 20 20 73 4e 43 2e 70             sNC.p
bd60: 50 61 72 73 65 20 3d 20 26 73 50 61 72 73 65 3b  Parse = &sParse;
bd70: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ..            sq
bd80: 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
bd90: 26 73 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70  &sParse, pTab->p
bda0: 53 65 6c 65 63 74 2c 20 26 73 4e 43 29 3b 0a 20  Select, &sNC);. 
bdb0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
bdc0: 50 61 72 73 65 2e 6e 45 72 72 20 29 20 72 63 20  Parse.nErr ) rc 
bdd0: 3d 20 73 50 61 72 73 65 2e 72 63 3b 0a 20 20 20  = sParse.rc;.   
bde0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
bdf0: 57 61 6c 6b 53 65 6c 65 63 74 28 26 73 57 61 6c  WalkSelect(&sWal
be00: 6b 65 72 2c 20 70 54 61 62 2d 3e 70 53 65 6c 65  ker, pTab->pSele
be10: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ct);.          }
be20: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
be30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64            /* Mod
be40: 69 66 79 20 61 6e 79 20 46 4b 20 64 65 66 69 6e  ify any FK defin
be50: 69 74 69 6f 6e 73 20 74 6f 20 70 6f 69 6e 74 20  itions to point 
be60: 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  to the new table
be70: 2e 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
be80: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
be90: 5f 4b 45 59 0a 20 20 20 20 20 20 20 20 20 20 69  _KEY.          i
bea0: 66 28 20 69 73 4c 65 67 61 63 79 3d 3d 30 20 7c  f( isLegacy==0 |
beb0: 7c 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  | (db->flags & S
bec0: 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79  QLITE_ForeignKey
bed0: 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s) ){.          
bee0: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20    FKey *pFKey;. 
bef0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 70             for(p
bf00: 46 4b 65 79 3d 70 54 61 62 2d 3e 70 46 4b 65 79  FKey=pTab->pFKey
bf10: 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70  ; pFKey; pFKey=p
bf20: 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29  FKey->pNextFrom)
bf30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
bf40: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
bf50: 63 6d 70 28 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20  cmp(pFKey->zTo, 
bf60: 7a 4f 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  zOld)==0 ){.    
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6e 61              rena
bf80: 6d 65 54 6f 6b 65 6e 46 69 6e 64 28 26 73 50 61  meTokenFind(&sPa
bf90: 72 73 65 2c 20 26 73 43 74 78 2c 20 28 76 6f 69  rse, &sCtx, (voi
bfa0: 64 2a 29 70 46 4b 65 79 2d 3e 7a 54 6f 29 3b 0a  d*)pFKey->zTo);.
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
bfc0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
bfd0: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
bfe0: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ..          /* I
bff0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 74 61  f this is the ta
c000: 62 6c 65 20 62 65 69 6e 67 20 61 6c 74 65 72 65  ble being altere
c010: 64 2c 20 66 69 78 20 61 6e 79 20 74 61 62 6c 65  d, fix any table
c020: 20 72 65 66 73 20 69 6e 20 43 48 45 43 4b 0a 20   refs in CHECK. 
c030: 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72           ** expr
c040: 65 73 73 69 6f 6e 73 2e 20 41 6c 73 6f 20 75 70  essions. Also up
c050: 64 61 74 65 20 74 68 65 20 6e 61 6d 65 20 74 68  date the name th
c060: 61 74 20 61 70 70 65 61 72 73 20 72 69 67 68 74  at appears right
c070: 20 61 66 74 65 72 20 74 68 65 0a 20 20 20 20 20   after the.     
c080: 20 20 20 20 20 2a 2a 20 22 43 52 45 41 54 45 20       ** "CREATE 
c090: 5b 56 49 52 54 55 41 4c 5d 20 54 41 42 4c 45 22  [VIRTUAL] TABLE"
c0a0: 20 62 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   bit. */.       
c0b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
c0c0: 74 72 69 63 6d 70 28 7a 4f 6c 64 2c 20 70 54 61  tricmp(zOld, pTa
c0d0: 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  b->zName)==0 ){.
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 43 74 78              sCtx
c0f0: 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  .pTab = pTab;.  
c100: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 73            if( is
c110: 4c 65 67 61 63 79 3d 3d 30 20 29 7b 0a 20 20 20  Legacy==0 ){.   
c120: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
c130: 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26  e3WalkExprList(&
c140: 73 57 61 6c 6b 65 72 2c 20 70 54 61 62 2d 3e 70  sWalker, pTab->p
c150: 43 68 65 63 6b 29 3b 0a 20 20 20 20 20 20 20 20  Check);.        
c160: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
c170: 20 20 72 65 6e 61 6d 65 54 6f 6b 65 6e 46 69 6e    renameTokenFin
c180: 64 28 26 73 50 61 72 73 65 2c 20 26 73 43 74 78  d(&sParse, &sCtx
c190: 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
c1a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c1b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
c1c0: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 73 50       else if( sP
c1d0: 61 72 73 65 2e 70 4e 65 77 49 6e 64 65 78 20 29  arse.pNewIndex )
c1e0: 7b 0a 20 20 20 20 20 20 20 20 72 65 6e 61 6d 65  {.        rename
c1f0: 54 6f 6b 65 6e 46 69 6e 64 28 26 73 50 61 72 73  TokenFind(&sPars
c200: 65 2c 20 26 73 43 74 78 2c 20 73 50 61 72 73 65  e, &sCtx, sParse
c210: 2e 70 4e 65 77 49 6e 64 65 78 2d 3e 7a 4e 61 6d  .pNewIndex->zNam
c220: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
c230: 69 73 4c 65 67 61 63 79 3d 3d 30 20 29 7b 0a 20  isLegacy==0 ){. 
c240: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c250: 57 61 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b 65  WalkExpr(&sWalke
c260: 72 2c 20 73 50 61 72 73 65 2e 70 4e 65 77 49 6e  r, sParse.pNewIn
c270: 64 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65  dex->pPartIdxWhe
c280: 72 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  re);.        }. 
c290: 20 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20       }..#ifndef 
c2a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
c2b0: 47 45 52 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a  GER.      else{.
c2c0: 20 20 20 20 20 20 20 20 54 72 69 67 67 65 72 20          Trigger 
c2d0: 2a 70 54 72 69 67 67 65 72 20 3d 20 73 50 61 72  *pTrigger = sPar
c2e0: 73 65 2e 70 4e 65 77 54 72 69 67 67 65 72 3b 0a  se.pNewTrigger;.
c2f0: 20 20 20 20 20 20 20 20 54 72 69 67 67 65 72 53          TriggerS
c300: 74 65 70 20 2a 70 53 74 65 70 3b 0a 20 20 20 20  tep *pStep;.    
c310: 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
c320: 65 33 5f 73 74 72 69 63 6d 70 28 73 50 61 72 73  e3_stricmp(sPars
c330: 65 2e 70 4e 65 77 54 72 69 67 67 65 72 2d 3e 74  e.pNewTrigger->t
c340: 61 62 6c 65 2c 20 7a 4f 6c 64 29 20 0a 20 20 20  able, zOld) .   
c350: 20 20 20 20 20 20 20 20 20 26 26 20 73 43 74 78           && sCtx
c360: 2e 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d  .pTab->pSchema==
c370: 70 54 72 69 67 67 65 72 2d 3e 70 54 61 62 53 63  pTrigger->pTabSc
c380: 68 65 6d 61 0a 20 20 20 20 20 20 20 20 20 20 29  hema.          )
c390: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6e 61  {.          rena
c3a0: 6d 65 54 6f 6b 65 6e 46 69 6e 64 28 26 73 50 61  meTokenFind(&sPa
c3b0: 72 73 65 2c 20 26 73 43 74 78 2c 20 73 50 61 72  rse, &sCtx, sPar
c3c0: 73 65 2e 70 4e 65 77 54 72 69 67 67 65 72 2d 3e  se.pNewTrigger->
c3d0: 74 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  table);.        
c3e0: 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  }..        if( i
c3f0: 73 4c 65 67 61 63 79 3d 3d 30 20 29 7b 0a 20 20  sLegacy==0 ){.  
c400: 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6e          rc = ren
c410: 61 6d 65 52 65 73 6f 6c 76 65 54 72 69 67 67 65  ameResolveTrigge
c420: 72 28 26 73 50 61 72 73 65 2c 20 62 54 65 6d 70  r(&sParse, bTemp
c430: 20 3f 20 30 20 3a 20 7a 44 62 29 3b 0a 20 20 20   ? 0 : zDb);.   
c440: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
c450: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c460: 20 20 20 20 20 20 20 20 72 65 6e 61 6d 65 57 61          renameWa
c470: 6c 6b 54 72 69 67 67 65 72 28 26 73 57 61 6c 6b  lkTrigger(&sWalk
c480: 65 72 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20  er, pTrigger);. 
c490: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 70             for(p
c4a0: 53 74 65 70 3d 70 54 72 69 67 67 65 72 2d 3e 73  Step=pTrigger->s
c4b0: 74 65 70 5f 6c 69 73 74 3b 20 70 53 74 65 70 3b  tep_list; pStep;
c4c0: 20 70 53 74 65 70 3d 70 53 74 65 70 2d 3e 70 4e   pStep=pStep->pN
c4d0: 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ext){.          
c4e0: 20 20 20 20 69 66 28 20 70 53 74 65 70 2d 3e 7a      if( pStep->z
c4f0: 54 61 72 67 65 74 20 26 26 20 30 3d 3d 73 71 6c  Target && 0==sql
c500: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 70 53 74  ite3_stricmp(pSt
c510: 65 70 2d 3e 7a 54 61 72 67 65 74 2c 20 7a 4f 6c  ep->zTarget, zOl
c520: 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  d) ){.          
c530: 20 20 20 20 20 20 72 65 6e 61 6d 65 54 6f 6b 65        renameToke
c540: 6e 46 69 6e 64 28 26 73 50 61 72 73 65 2c 20 26  nFind(&sParse, &
c550: 73 43 74 78 2c 20 70 53 74 65 70 2d 3e 7a 54 61  sCtx, pStep->zTa
c560: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  rget);.         
c570: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
c580: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
c590: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c5a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
c5b0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
c5c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c5d0: 72 63 20 3d 20 72 65 6e 61 6d 65 45 64 69 74 53  rc = renameEditS
c5e0: 71 6c 28 63 6f 6e 74 65 78 74 2c 20 26 73 43 74  ql(context, &sCt
c5f0: 78 2c 20 7a 49 6e 70 75 74 2c 20 7a 4e 65 77 2c  x, zInput, zNew,
c600: 20 62 51 75 6f 74 65 29 3b 0a 20 20 20 20 7d 0a   bQuote);.    }.
c610: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
c620: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
c630: 66 28 20 73 50 61 72 73 65 2e 7a 45 72 72 4d 73  f( sParse.zErrMs
c640: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6e  g ){.        ren
c650: 61 6d 65 43 6f 6c 75 6d 6e 50 61 72 73 65 45 72  ameColumnParseEr
c660: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 30 2c 20  ror(context, 0, 
c670: 61 72 67 76 5b 31 5d 2c 20 61 72 67 76 5b 32 5d  argv[1], argv[2]
c680: 2c 20 26 73 50 61 72 73 65 29 3b 0a 20 20 20 20  , &sParse);.    
c690: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c6a0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
c6b0: 65 72 72 6f 72 5f 63 6f 64 65 28 63 6f 6e 74 65  error_code(conte
c6c0: 78 74 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d  xt, rc);.      }
c6d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 6e 61  .    }..    rena
c6e0: 6d 65 50 61 72 73 65 43 6c 65 61 6e 75 70 28 26  meParseCleanup(&
c6f0: 73 50 61 72 73 65 29 3b 0a 20 20 20 20 72 65 6e  sParse);.    ren
c700: 61 6d 65 54 6f 6b 65 6e 46 72 65 65 28 64 62 2c  ameTokenFree(db,
c710: 20 73 43 74 78 2e 70 4c 69 73 74 29 3b 0a 20 20   sCtx.pList);.  
c720: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
c730: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 23 69 66 6e  aveAll(db);.#ifn
c740: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c750: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
c760: 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41    db->xAuth = xA
c770: 75 74 68 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  uth;.#endif.  }.
c780: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
c790: 0a 2a 2a 20 41 6e 20 53 51 4c 20 75 73 65 72 20  .** An SQL user 
c7a0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 63 68  function that ch
c7b0: 65 63 6b 73 20 74 68 61 74 20 74 68 65 72 65 20  ecks that there 
c7c0: 61 72 65 20 6e 6f 20 70 61 72 73 65 20 6f 72 20  are no parse or 
c7d0: 73 79 6d 62 6f 6c 0a 2a 2a 20 72 65 73 6f 6c 75  symbol.** resolu
c7e0: 74 69 6f 6e 20 70 72 6f 62 6c 65 6d 73 20 69 6e  tion problems in
c7f0: 20 61 20 43 52 45 41 54 45 20 54 52 49 47 47 45   a CREATE TRIGGE
c800: 52 7c 54 41 42 4c 45 7c 56 49 45 57 7c 49 4e 44  R|TABLE|VIEW|IND
c810: 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  EX statement..**
c820: 20 41 66 74 65 72 20 61 6e 20 41 4c 54 45 52 20   After an ALTER 
c830: 54 41 42 4c 45 20 2e 2e 20 52 45 4e 41 4d 45 20  TABLE .. RENAME 
c840: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 72  operation is per
c850: 66 6f 72 6d 65 64 20 61 6e 64 20 74 68 65 20 73  formed and the s
c860: 63 68 65 6d 61 0a 2a 2a 20 72 65 6c 6f 61 64 65  chema.** reloade
c870: 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
c880: 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 65 61   is called on ea
c890: 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ch SQL statement
c8a0: 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 0a 2a   in the schema.*
c8b0: 2a 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  * to ensure that
c8c0: 20 69 74 20 69 73 20 73 74 69 6c 6c 20 75 73 61   it is still usa
c8d0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20  ble..**.**   0: 
c8e0: 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 28 22  Database name ("
c8f0: 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 65 74  main", "temp" et
c900: 63 2e 29 2e 0a 2a 2a 20 20 20 31 3a 20 53 51 4c  c.)..**   1: SQL
c910: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 20   statement..**  
c920: 20 32 3a 20 4f 62 6a 65 63 74 20 74 79 70 65 20   2: Object type 
c930: 28 22 76 69 65 77 22 2c 20 22 74 61 62 6c 65 22  ("view", "table"
c940: 2c 20 22 74 72 69 67 67 65 72 22 20 6f 72 20 22  , "trigger" or "
c950: 69 6e 64 65 78 22 29 2e 0a 2a 2a 20 20 20 33 3a  index")..**   3:
c960: 20 4f 62 6a 65 63 74 20 6e 61 6d 65 2e 0a 2a 2a   Object name..**
c970: 20 20 20 34 3a 20 54 72 75 65 20 69 66 20 6f 62     4: True if ob
c980: 6a 65 63 74 20 69 73 20 66 72 6f 6d 20 74 65 6d  ject is from tem
c990: 70 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20  p schema..**.** 
c9a0: 55 6e 6c 65 73 73 20 69 74 20 66 69 6e 64 73 20  Unless it finds 
c9b0: 61 6e 20 65 72 72 6f 72 2c 20 74 68 69 73 20 66  an error, this f
c9c0: 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79  unction normally
c9d0: 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 20 48   returns NULL. H
c9e0: 6f 77 65 76 65 72 2c 20 69 74 0a 2a 2a 20 72 65  owever, it.** re
c9f0: 74 75 72 6e 73 20 69 6e 74 65 67 65 72 20 76 61  turns integer va
ca00: 6c 75 65 20 31 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  lue 1 if:.**.** 
ca10: 20 20 2a 20 74 68 65 20 53 51 4c 20 61 72 67 75    * the SQL argu
ca20: 6d 65 6e 74 20 63 72 65 61 74 65 73 20 61 20 74  ment creates a t
ca30: 72 69 67 67 65 72 2c 20 61 6e 64 0a 2a 2a 20 20  rigger, and.**  
ca40: 20 2a 20 74 68 65 20 74 61 62 6c 65 20 74 68 61   * the table tha
ca50: 74 20 74 68 65 20 74 72 69 67 67 65 72 20 69 73  t the trigger is
ca60: 20 61 74 74 61 63 68 65 64 20 74 6f 20 69 73 20   attached to is 
ca70: 69 6e 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e  in database zDb.
ca80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ca90: 72 65 6e 61 6d 65 54 61 62 6c 65 54 65 73 74 28  renameTableTest(
caa0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
cab0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
cac0: 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73 71  nt NotUsed,.  sq
cad0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
cae0: 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  gv.){.  sqlite3 
caf0: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
cb00: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
cb10: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 63 68 61 72  context);.  char
cb20: 20 63 6f 6e 73 74 20 2a 7a 44 62 20 3d 20 28 63   const *zDb = (c
cb30: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
cb40: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
cb50: 67 76 5b 30 5d 29 3b 0a 20 20 63 68 61 72 20 63  gv[0]);.  char c
cb60: 6f 6e 73 74 20 2a 7a 49 6e 70 75 74 20 3d 20 28  onst *zInput = (
cb70: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
cb80: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
cb90: 72 67 76 5b 31 5d 29 3b 0a 20 20 69 6e 74 20 62  rgv[1]);.  int b
cba0: 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 5f 76  Temp = sqlite3_v
cbb0: 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 34 5d  alue_int(argv[4]
cbc0: 29 3b 0a 20 20 69 6e 74 20 69 73 4c 65 67 61 63  );.  int isLegac
cbd0: 79 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  y = (db->flags &
cbe0: 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 41 6c   SQLITE_LegacyAl
cbf0: 74 65 72 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ter);..#ifndef S
cc00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
cc10: 52 49 5a 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74  RIZATION.  sqlit
cc20: 65 33 5f 78 61 75 74 68 20 78 41 75 74 68 20 3d  e3_xauth xAuth =
cc30: 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 64 62   db->xAuth;.  db
cc40: 2d 3e 78 41 75 74 68 20 3d 20 30 3b 0a 23 65 6e  ->xAuth = 0;.#en
cc50: 64 69 66 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  dif..  UNUSED_PA
cc60: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
cc70: 3b 0a 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a  ;.  if( zDb && z
cc80: 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 69 6e 74  Input ){.    int
cc90: 20 72 63 3b 0a 20 20 20 20 50 61 72 73 65 20 73   rc;.    Parse s
cca0: 50 61 72 73 65 3b 0a 20 20 20 20 72 63 20 3d 20  Parse;.    rc = 
ccb0: 72 65 6e 61 6d 65 50 61 72 73 65 53 71 6c 28 26  renameParseSql(&
ccc0: 73 50 61 72 73 65 2c 20 7a 44 62 2c 20 31 2c 20  sParse, zDb, 1, 
ccd0: 64 62 2c 20 7a 49 6e 70 75 74 2c 20 62 54 65 6d  db, zInput, bTem
cce0: 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  p);.    if( rc==
ccf0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
cd00: 20 20 20 69 66 28 20 69 73 4c 65 67 61 63 79 3d     if( isLegacy=
cd10: 3d 30 20 26 26 20 73 50 61 72 73 65 2e 70 4e 65  =0 && sParse.pNe
cd20: 77 54 61 62 6c 65 20 26 26 20 73 50 61 72 73 65  wTable && sParse
cd30: 2e 70 4e 65 77 54 61 62 6c 65 2d 3e 70 53 65 6c  .pNewTable->pSel
cd40: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 4e  ect ){.        N
cd50: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 0a  ameContext sNC;.
cd60: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
cd70: 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
cd80: 4e 43 29 29 3b 0a 20 20 20 20 20 20 20 20 73 4e  NC));.        sN
cd90: 43 2e 70 50 61 72 73 65 20 3d 20 26 73 50 61 72  C.pParse = &sPar
cda0: 73 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se;.        sqli
cdb0: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 26 73  te3SelectPrep(&s
cdc0: 50 61 72 73 65 2c 20 73 50 61 72 73 65 2e 70 4e  Parse, sParse.pN
cdd0: 65 77 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74  ewTable->pSelect
cde0: 2c 20 26 73 4e 43 29 3b 0a 20 20 20 20 20 20 20  , &sNC);.       
cdf0: 20 69 66 28 20 73 50 61 72 73 65 2e 6e 45 72 72   if( sParse.nErr
ce00: 20 29 20 72 63 20 3d 20 73 50 61 72 73 65 2e 72   ) rc = sParse.r
ce10: 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
ce20: 20 20 65 6c 73 65 20 69 66 28 20 73 50 61 72 73    else if( sPars
ce30: 65 2e 70 4e 65 77 54 72 69 67 67 65 72 20 29 7b  e.pNewTrigger ){
ce40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4c  .        if( isL
ce50: 65 67 61 63 79 3d 3d 30 20 29 7b 0a 20 20 20 20  egacy==0 ){.    
ce60: 20 20 20 20 20 20 72 63 20 3d 20 72 65 6e 61 6d        rc = renam
ce70: 65 52 65 73 6f 6c 76 65 54 72 69 67 67 65 72 28  eResolveTrigger(
ce80: 26 73 50 61 72 73 65 2c 20 62 54 65 6d 70 20 3f  &sParse, bTemp ?
ce90: 20 30 20 3a 20 7a 44 62 29 3b 0a 20 20 20 20 20   0 : zDb);.     
cea0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
ceb0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
cec0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
ced0: 69 31 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  i1 = sqlite3Sche
cee0: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 73 50  maToIndex(db, sP
cef0: 61 72 73 65 2e 70 4e 65 77 54 72 69 67 67 65 72  arse.pNewTrigger
cf00: 2d 3e 70 54 61 62 53 63 68 65 6d 61 29 3b 0a 20  ->pTabSchema);. 
cf10: 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 32 20           int i2 
cf20: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  = sqlite3FindDbN
cf30: 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  ame(db, zDb);.  
cf40: 20 20 20 20 20 20 20 20 69 66 28 20 69 31 3d 3d          if( i1==
cf50: 69 32 20 29 20 73 71 6c 69 74 65 33 5f 72 65 73  i2 ) sqlite3_res
cf60: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
cf70: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   1);.        }. 
cf80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
cf90: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
cfa0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6e  _OK ){.      ren
cfb0: 61 6d 65 43 6f 6c 75 6d 6e 50 61 72 73 65 45 72  ameColumnParseEr
cfc0: 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 31 2c 20  ror(context, 1, 
cfd0: 61 72 67 76 5b 32 5d 2c 20 61 72 67 76 5b 33 5d  argv[2], argv[3]
cfe0: 2c 20 26 73 50 61 72 73 65 29 3b 0a 20 20 20 20  , &sParse);.    
cff0: 7d 0a 20 20 20 20 72 65 6e 61 6d 65 50 61 72 73  }.    renamePars
d000: 65 43 6c 65 61 6e 75 70 28 26 73 50 61 72 73 65  eCleanup(&sParse
d010: 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
d020: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
d030: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 64 62 2d 3e  ORIZATION.  db->
d040: 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23  xAuth = xAuth;.#
d050: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
d060: 65 67 69 73 74 65 72 20 62 75 69 6c 74 2d 69 6e  egister built-in
d070: 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 64 20   functions used 
d080: 74 6f 20 68 65 6c 70 20 69 6d 70 6c 65 6d 65 6e  to help implemen
d090: 74 20 41 4c 54 45 52 20 54 41 42 4c 45 0a 2a 2f  t ALTER TABLE.*/
d0a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 6c 74  .void sqlite3Alt
d0b0: 65 72 46 75 6e 63 74 69 6f 6e 73 28 76 6f 69 64  erFunctions(void
d0c0: 29 7b 0a 20 20 73 74 61 74 69 63 20 46 75 6e 63  ){.  static Func
d0d0: 44 65 66 20 61 41 6c 74 65 72 54 61 62 6c 65 46  Def aAlterTableF
d0e0: 75 6e 63 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 49  uncs[] = {.    I
d0f0: 4e 54 45 52 4e 41 4c 5f 46 55 4e 43 54 49 4f 4e  NTERNAL_FUNCTION
d100: 28 73 71 6c 69 74 65 5f 72 65 6e 61 6d 65 5f 63  (sqlite_rename_c
d110: 6f 6c 75 6d 6e 2c 20 39 2c 20 72 65 6e 61 6d 65  olumn, 9, rename
d120: 43 6f 6c 75 6d 6e 46 75 6e 63 29 2c 0a 20 20 20  ColumnFunc),.   
d130: 20 49 4e 54 45 52 4e 41 4c 5f 46 55 4e 43 54 49   INTERNAL_FUNCTI
d140: 4f 4e 28 73 71 6c 69 74 65 5f 72 65 6e 61 6d 65  ON(sqlite_rename
d150: 5f 74 61 62 6c 65 2c 20 20 37 2c 20 72 65 6e 61  _table,  7, rena
d160: 6d 65 54 61 62 6c 65 46 75 6e 63 29 2c 0a 20 20  meTableFunc),.  
d170: 20 20 49 4e 54 45 52 4e 41 4c 5f 46 55 4e 43 54    INTERNAL_FUNCT
d180: 49 4f 4e 28 73 71 6c 69 74 65 5f 72 65 6e 61 6d  ION(sqlite_renam
d190: 65 5f 74 65 73 74 2c 20 20 20 35 2c 20 72 65 6e  e_test,   5, ren
d1a0: 61 6d 65 54 61 62 6c 65 54 65 73 74 29 2c 0a 20  ameTableTest),. 
d1b0: 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 73   };.  sqlite3Ins
d1c0: 65 72 74 42 75 69 6c 74 69 6e 46 75 6e 63 73 28  ertBuiltinFuncs(
d1d0: 61 41 6c 74 65 72 54 61 62 6c 65 46 75 6e 63 73  aAlterTableFuncs
d1e0: 2c 20 41 72 72 61 79 53 69 7a 65 28 61 41 6c 74  , ArraySize(aAlt
d1f0: 65 72 54 61 62 6c 65 46 75 6e 63 73 29 29 3b 0a  erTableFuncs));.
d200: 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c  }.#endif  /* SQL
d210: 49 54 45 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20  ITE_ALTER_TABLE 
d220: 2a 2f 0a                                         */.